xref: /aosp_15_r20/external/openscreen/platform/base/error.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "platform/base/error.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <sstream>
8*3f982cf4SFabien Sanglard 
9*3f982cf4SFabien Sanglard namespace openscreen {
10*3f982cf4SFabien Sanglard 
11*3f982cf4SFabien Sanglard Error::Error() = default;
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard Error::Error(const Error& error) = default;
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard Error::Error(Error&& error) noexcept = default;
16*3f982cf4SFabien Sanglard 
Error(Code code)17*3f982cf4SFabien Sanglard Error::Error(Code code) : code_(code) {}
18*3f982cf4SFabien Sanglard 
Error(Code code,const std::string & message)19*3f982cf4SFabien Sanglard Error::Error(Code code, const std::string& message)
20*3f982cf4SFabien Sanglard     : code_(code), message_(message) {}
21*3f982cf4SFabien Sanglard 
Error(Code code,std::string && message)22*3f982cf4SFabien Sanglard Error::Error(Code code, std::string&& message)
23*3f982cf4SFabien Sanglard     : code_(code), message_(std::move(message)) {}
24*3f982cf4SFabien Sanglard 
25*3f982cf4SFabien Sanglard Error::~Error() = default;
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard Error& Error::operator=(const Error& other) = default;
28*3f982cf4SFabien Sanglard 
29*3f982cf4SFabien Sanglard Error& Error::operator=(Error&& other) = default;
30*3f982cf4SFabien Sanglard 
operator ==(const Error & other) const31*3f982cf4SFabien Sanglard bool Error::operator==(const Error& other) const {
32*3f982cf4SFabien Sanglard   return code_ == other.code_ && message_ == other.message_;
33*3f982cf4SFabien Sanglard }
34*3f982cf4SFabien Sanglard 
operator !=(const Error & other) const35*3f982cf4SFabien Sanglard bool Error::operator!=(const Error& other) const {
36*3f982cf4SFabien Sanglard   return !(*this == other);
37*3f982cf4SFabien Sanglard }
38*3f982cf4SFabien Sanglard 
operator ==(Code code) const39*3f982cf4SFabien Sanglard bool Error::operator==(Code code) const {
40*3f982cf4SFabien Sanglard   return code_ == code;
41*3f982cf4SFabien Sanglard }
42*3f982cf4SFabien Sanglard 
operator !=(Code code) const43*3f982cf4SFabien Sanglard bool Error::operator!=(Code code) const {
44*3f982cf4SFabien Sanglard   return !(*this == code);
45*3f982cf4SFabien Sanglard }
46*3f982cf4SFabien Sanglard 
operator <<(std::ostream & os,const Error::Code & code)47*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& os, const Error::Code& code) {
48*3f982cf4SFabien Sanglard   if (code == Error::Code::kNone) {
49*3f982cf4SFabien Sanglard     return os << "Success";
50*3f982cf4SFabien Sanglard   }
51*3f982cf4SFabien Sanglard   os << "Failure: ";
52*3f982cf4SFabien Sanglard   switch (code) {
53*3f982cf4SFabien Sanglard     case Error::Code::kAgain:
54*3f982cf4SFabien Sanglard       return os << "Transient";
55*3f982cf4SFabien Sanglard     case Error::Code::kCborParsing:
56*3f982cf4SFabien Sanglard       return os << "CborParsing";
57*3f982cf4SFabien Sanglard     case Error::Code::kCborEncoding:
58*3f982cf4SFabien Sanglard       return os << "CborEncoding";
59*3f982cf4SFabien Sanglard     case Error::Code::kCborIncompleteMessage:
60*3f982cf4SFabien Sanglard       return os << "CborIncompleteMessage";
61*3f982cf4SFabien Sanglard     case Error::Code::kCborInvalidMessage:
62*3f982cf4SFabien Sanglard       return os << "CborInvalidMessage";
63*3f982cf4SFabien Sanglard     case Error::Code::kCborInvalidResponseId:
64*3f982cf4SFabien Sanglard       return os << "CborInvalidResponseId";
65*3f982cf4SFabien Sanglard     case Error::Code::kNoAvailableReceivers:
66*3f982cf4SFabien Sanglard       return os << "NoAvailableReceivers";
67*3f982cf4SFabien Sanglard     case Error::Code::kRequestCancelled:
68*3f982cf4SFabien Sanglard       return os << "RequestCancelled";
69*3f982cf4SFabien Sanglard     case Error::Code::kNoPresentationFound:
70*3f982cf4SFabien Sanglard       return os << "NoPresentationFound";
71*3f982cf4SFabien Sanglard     case Error::Code::kPreviousStartInProgress:
72*3f982cf4SFabien Sanglard       return os << "PreviousStartInProgress";
73*3f982cf4SFabien Sanglard     case Error::Code::kUnknownStartError:
74*3f982cf4SFabien Sanglard       return os << "UnknownStartError";
75*3f982cf4SFabien Sanglard     case Error::Code::kUnknownRequestId:
76*3f982cf4SFabien Sanglard       return os << "UnknownRequestId";
77*3f982cf4SFabien Sanglard     case Error::Code::kAddressInUse:
78*3f982cf4SFabien Sanglard       return os << "AddressInUse";
79*3f982cf4SFabien Sanglard     case Error::Code::kDomainNameTooLong:
80*3f982cf4SFabien Sanglard       return os << "DomainNameTooLong";
81*3f982cf4SFabien Sanglard     case Error::Code::kDomainNameLabelTooLong:
82*3f982cf4SFabien Sanglard       return os << "DomainNameLabelTooLong";
83*3f982cf4SFabien Sanglard     case Error::Code::kIOFailure:
84*3f982cf4SFabien Sanglard       return os << "IOFailure";
85*3f982cf4SFabien Sanglard     case Error::Code::kInitializationFailure:
86*3f982cf4SFabien Sanglard       return os << "InitializationFailure";
87*3f982cf4SFabien Sanglard     case Error::Code::kInvalidIPV4Address:
88*3f982cf4SFabien Sanglard       return os << "InvalidIPV4Address";
89*3f982cf4SFabien Sanglard     case Error::Code::kInvalidIPV6Address:
90*3f982cf4SFabien Sanglard       return os << "InvalidIPV6Address";
91*3f982cf4SFabien Sanglard     case Error::Code::kConnectionFailed:
92*3f982cf4SFabien Sanglard       return os << "ConnectionFailed";
93*3f982cf4SFabien Sanglard     case Error::Code::kSocketOptionSettingFailure:
94*3f982cf4SFabien Sanglard       return os << "SocketOptionSettingFailure";
95*3f982cf4SFabien Sanglard     case Error::Code::kSocketAcceptFailure:
96*3f982cf4SFabien Sanglard       return os << "SocketAcceptFailure";
97*3f982cf4SFabien Sanglard     case Error::Code::kSocketBindFailure:
98*3f982cf4SFabien Sanglard       return os << "SocketBindFailure";
99*3f982cf4SFabien Sanglard     case Error::Code::kSocketClosedFailure:
100*3f982cf4SFabien Sanglard       return os << "SocketClosedFailure";
101*3f982cf4SFabien Sanglard     case Error::Code::kSocketConnectFailure:
102*3f982cf4SFabien Sanglard       return os << "SocketConnectFailure";
103*3f982cf4SFabien Sanglard     case Error::Code::kSocketInvalidState:
104*3f982cf4SFabien Sanglard       return os << "SocketInvalidState";
105*3f982cf4SFabien Sanglard     case Error::Code::kSocketListenFailure:
106*3f982cf4SFabien Sanglard       return os << "SocketListenFailure";
107*3f982cf4SFabien Sanglard     case Error::Code::kSocketReadFailure:
108*3f982cf4SFabien Sanglard       return os << "SocketReadFailure";
109*3f982cf4SFabien Sanglard     case Error::Code::kSocketSendFailure:
110*3f982cf4SFabien Sanglard       return os << "SocketSendFailure";
111*3f982cf4SFabien Sanglard     case Error::Code::kMdnsRegisterFailure:
112*3f982cf4SFabien Sanglard       return os << "MdnsRegisterFailure";
113*3f982cf4SFabien Sanglard     case Error::Code::kMdnsReadFailure:
114*3f982cf4SFabien Sanglard       return os << "MdnsReadFailure";
115*3f982cf4SFabien Sanglard     case Error::Code::kMdnsNonConformingFailure:
116*3f982cf4SFabien Sanglard       return os << "kMdnsNonConformingFailure";
117*3f982cf4SFabien Sanglard     case Error::Code::kParseError:
118*3f982cf4SFabien Sanglard       return os << "ParseError";
119*3f982cf4SFabien Sanglard     case Error::Code::kUnknownMessageType:
120*3f982cf4SFabien Sanglard       return os << "UnknownMessageType";
121*3f982cf4SFabien Sanglard     case Error::Code::kNoActiveConnection:
122*3f982cf4SFabien Sanglard       return os << "NoActiveConnection";
123*3f982cf4SFabien Sanglard     case Error::Code::kAlreadyClosed:
124*3f982cf4SFabien Sanglard       return os << "AlreadyClosed";
125*3f982cf4SFabien Sanglard     case Error::Code::kNoStartedPresentation:
126*3f982cf4SFabien Sanglard       return os << "NoStartedPresentation";
127*3f982cf4SFabien Sanglard     case Error::Code::kPresentationAlreadyStarted:
128*3f982cf4SFabien Sanglard       return os << "PresentationAlreadyStarted";
129*3f982cf4SFabien Sanglard     case Error::Code::kInvalidConnectionState:
130*3f982cf4SFabien Sanglard       return os << "InvalidConnectionState";
131*3f982cf4SFabien Sanglard     case Error::Code::kJsonParseError:
132*3f982cf4SFabien Sanglard       return os << "JsonParseError";
133*3f982cf4SFabien Sanglard     case Error::Code::kJsonWriteError:
134*3f982cf4SFabien Sanglard       return os << "JsonWriteError";
135*3f982cf4SFabien Sanglard     case Error::Code::kFatalSSLError:
136*3f982cf4SFabien Sanglard       return os << "FatalSSLError";
137*3f982cf4SFabien Sanglard     case Error::Code::kRSAKeyGenerationFailure:
138*3f982cf4SFabien Sanglard       return os << "RSAKeyGenerationFailure";
139*3f982cf4SFabien Sanglard     case Error::Code::kRSAKeyParseError:
140*3f982cf4SFabien Sanglard       return os << "RSAKeyParseError";
141*3f982cf4SFabien Sanglard     case Error::Code::kEVPInitializationError:
142*3f982cf4SFabien Sanglard       return os << "EVPInitializationError";
143*3f982cf4SFabien Sanglard     case Error::Code::kCertificateCreationError:
144*3f982cf4SFabien Sanglard       return os << "CertificateCreationError";
145*3f982cf4SFabien Sanglard     case Error::Code::kCertificateValidationError:
146*3f982cf4SFabien Sanglard       return os << "CertificateValidationError";
147*3f982cf4SFabien Sanglard     case Error::Code::kSha256HashFailure:
148*3f982cf4SFabien Sanglard       return os << "Sha256HashFailure";
149*3f982cf4SFabien Sanglard     case Error::Code::kFileLoadFailure:
150*3f982cf4SFabien Sanglard       return os << "FileLoadFailure";
151*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsMissing:
152*3f982cf4SFabien Sanglard       return os << "ErrCertsMissing";
153*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsParse:
154*3f982cf4SFabien Sanglard       return os << "ErrCertsParse";
155*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsRestrictions:
156*3f982cf4SFabien Sanglard       return os << "ErrCertsRestrictions";
157*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsDateInvalid:
158*3f982cf4SFabien Sanglard       return os << "ErrCertsDateInvalid";
159*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsVerifyGeneric:
160*3f982cf4SFabien Sanglard       return os << "ErrCertsVerifyGeneric";
161*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsVerifyUntrustedCert:
162*3f982cf4SFabien Sanglard       return os << "kErrCertsVerifyUntrustedCert";
163*3f982cf4SFabien Sanglard     case Error::Code::kErrCrlInvalid:
164*3f982cf4SFabien Sanglard       return os << "ErrCrlInvalid";
165*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsRevoked:
166*3f982cf4SFabien Sanglard       return os << "ErrCertsRevoked";
167*3f982cf4SFabien Sanglard     case Error::Code::kErrCertsPathlen:
168*3f982cf4SFabien Sanglard       return os << "ErrCertsPathlen";
169*3f982cf4SFabien Sanglard     case Error::Code::kUnknownError:
170*3f982cf4SFabien Sanglard       return os << "UnknownError";
171*3f982cf4SFabien Sanglard     case Error::Code::kNotImplemented:
172*3f982cf4SFabien Sanglard       return os << "NotImplemented";
173*3f982cf4SFabien Sanglard     case Error::Code::kInsufficientBuffer:
174*3f982cf4SFabien Sanglard       return os << "InsufficientBuffer";
175*3f982cf4SFabien Sanglard     case Error::Code::kParameterInvalid:
176*3f982cf4SFabien Sanglard       return os << "ParameterInvalid";
177*3f982cf4SFabien Sanglard     case Error::Code::kParameterOutOfRange:
178*3f982cf4SFabien Sanglard       return os << "ParameterOutOfRange";
179*3f982cf4SFabien Sanglard     case Error::Code::kParameterNullPointer:
180*3f982cf4SFabien Sanglard       return os << "ParameterNullPointer";
181*3f982cf4SFabien Sanglard     case Error::Code::kIndexOutOfBounds:
182*3f982cf4SFabien Sanglard       return os << "IndexOutOfBounds";
183*3f982cf4SFabien Sanglard     case Error::Code::kItemAlreadyExists:
184*3f982cf4SFabien Sanglard       return os << "ItemAlreadyExists";
185*3f982cf4SFabien Sanglard     case Error::Code::kItemNotFound:
186*3f982cf4SFabien Sanglard       return os << "ItemNotFound";
187*3f982cf4SFabien Sanglard     case Error::Code::kOperationInvalid:
188*3f982cf4SFabien Sanglard       return os << "OperationInvalid";
189*3f982cf4SFabien Sanglard     case Error::Code::kOperationInProgress:
190*3f982cf4SFabien Sanglard       return os << "OperationInProgress";
191*3f982cf4SFabien Sanglard     case Error::Code::kOperationCancelled:
192*3f982cf4SFabien Sanglard       return os << "OperationCancelled";
193*3f982cf4SFabien Sanglard     case Error::Code::kTypeError:
194*3f982cf4SFabien Sanglard       return os << "TypeError";
195*3f982cf4SFabien Sanglard     case Error::Code::kCastV2PeerCertEmpty:
196*3f982cf4SFabien Sanglard       return os << "kCastV2PeerCertEmpty";
197*3f982cf4SFabien Sanglard     case Error::Code::kCastV2WrongPayloadType:
198*3f982cf4SFabien Sanglard       return os << "kCastV2WrongPayloadType";
199*3f982cf4SFabien Sanglard     case Error::Code::kCastV2NoPayload:
200*3f982cf4SFabien Sanglard       return os << "kCastV2NoPayload";
201*3f982cf4SFabien Sanglard     case Error::Code::kCastV2PayloadParsingFailed:
202*3f982cf4SFabien Sanglard       return os << "kCastV2PayloadParsingFailed";
203*3f982cf4SFabien Sanglard     case Error::Code::kCastV2MessageError:
204*3f982cf4SFabien Sanglard       return os << "CastV2kMessageError";
205*3f982cf4SFabien Sanglard     case Error::Code::kCastV2NoResponse:
206*3f982cf4SFabien Sanglard       return os << "kCastV2NoResponse";
207*3f982cf4SFabien Sanglard     case Error::Code::kCastV2FingerprintNotFound:
208*3f982cf4SFabien Sanglard       return os << "kCastV2FingerprintNotFound";
209*3f982cf4SFabien Sanglard     case Error::Code::kCastV2CertNotSignedByTrustedCa:
210*3f982cf4SFabien Sanglard       return os << "kCastV2CertNotSignedByTrustedCa";
211*3f982cf4SFabien Sanglard     case Error::Code::kCastV2CannotExtractPublicKey:
212*3f982cf4SFabien Sanglard       return os << "kCastV2CannotExtractPublicKey";
213*3f982cf4SFabien Sanglard     case Error::Code::kCastV2SignedBlobsMismatch:
214*3f982cf4SFabien Sanglard       return os << "kCastV2SignedBlobsMismatch";
215*3f982cf4SFabien Sanglard     case Error::Code::kCastV2TlsCertValidityPeriodTooLong:
216*3f982cf4SFabien Sanglard       return os << "kCastV2TlsCertValidityPeriodTooLong";
217*3f982cf4SFabien Sanglard     case Error::Code::kCastV2TlsCertValidStartDateInFuture:
218*3f982cf4SFabien Sanglard       return os << "kCastV2TlsCertValidStartDateInFuture";
219*3f982cf4SFabien Sanglard     case Error::Code::kCastV2TlsCertExpired:
220*3f982cf4SFabien Sanglard       return os << "kCastV2TlsCertExpired";
221*3f982cf4SFabien Sanglard     case Error::Code::kCastV2SenderNonceMismatch:
222*3f982cf4SFabien Sanglard       return os << "kCastV2SenderNonceMismatch";
223*3f982cf4SFabien Sanglard     case Error::Code::kCastV2DigestUnsupported:
224*3f982cf4SFabien Sanglard       return os << "kCastV2DigestUnsupported";
225*3f982cf4SFabien Sanglard     case Error::Code::kCastV2SignatureEmpty:
226*3f982cf4SFabien Sanglard       return os << "kCastV2SignatureEmpty";
227*3f982cf4SFabien Sanglard     case Error::Code::kCastV2ChannelNotOpen:
228*3f982cf4SFabien Sanglard       return os << "kCastV2ChannelNotOpen";
229*3f982cf4SFabien Sanglard     case Error::Code::kCastV2AuthenticationError:
230*3f982cf4SFabien Sanglard       return os << "kCastV2AuthenticationError";
231*3f982cf4SFabien Sanglard     case Error::Code::kCastV2ConnectError:
232*3f982cf4SFabien Sanglard       return os << "kCastV2ConnectError";
233*3f982cf4SFabien Sanglard     case Error::Code::kCastV2CastSocketError:
234*3f982cf4SFabien Sanglard       return os << "kCastV2CastSocketError";
235*3f982cf4SFabien Sanglard     case Error::Code::kCastV2TransportError:
236*3f982cf4SFabien Sanglard       return os << "kCastV2TransportError";
237*3f982cf4SFabien Sanglard     case Error::Code::kCastV2InvalidMessage:
238*3f982cf4SFabien Sanglard       return os << "kCastV2InvalidMessage";
239*3f982cf4SFabien Sanglard     case Error::Code::kCastV2InvalidChannelId:
240*3f982cf4SFabien Sanglard       return os << "kCastV2InvalidChannelId";
241*3f982cf4SFabien Sanglard     case Error::Code::kCastV2ConnectTimeout:
242*3f982cf4SFabien Sanglard       return os << "kCastV2ConnectTimeout";
243*3f982cf4SFabien Sanglard     case Error::Code::kCastV2PingTimeout:
244*3f982cf4SFabien Sanglard       return os << "kCastV2PingTimeout";
245*3f982cf4SFabien Sanglard     case Error::Code::kCastV2ChannelPolicyMismatch:
246*3f982cf4SFabien Sanglard       return os << "kCastV2ChannelPolicyMismatch";
247*3f982cf4SFabien Sanglard     case Error::Code::kCreateSignatureFailed:
248*3f982cf4SFabien Sanglard       return os << "kCreateSignatureFailed";
249*3f982cf4SFabien Sanglard     case Error::Code::kUpdateReceivedRecordFailure:
250*3f982cf4SFabien Sanglard       return os << "kUpdateReceivedRecordFailure";
251*3f982cf4SFabien Sanglard     case Error::Code::kRecordPublicationError:
252*3f982cf4SFabien Sanglard       return os << "kRecordPublicationError";
253*3f982cf4SFabien Sanglard     case Error::Code::kProcessReceivedRecordFailure:
254*3f982cf4SFabien Sanglard       return os << "ProcessReceivedRecordFailure";
255*3f982cf4SFabien Sanglard     case Error::Code::kUnknownCodec:
256*3f982cf4SFabien Sanglard       return os << "UnknownCodec";
257*3f982cf4SFabien Sanglard     case Error::Code::kInvalidCodecParameter:
258*3f982cf4SFabien Sanglard       return os << "InvalidCodecParameter";
259*3f982cf4SFabien Sanglard     case Error::Code::kSocketFailure:
260*3f982cf4SFabien Sanglard       return os << "SocketFailure";
261*3f982cf4SFabien Sanglard     case Error::Code::kUnencryptedOffer:
262*3f982cf4SFabien Sanglard       return os << "UnencryptedOffer";
263*3f982cf4SFabien Sanglard     case Error::Code::kRemotingNotSupported:
264*3f982cf4SFabien Sanglard       return os << "RemotingNotSupported";
265*3f982cf4SFabien Sanglard     case Error::Code::kNegotiationFailure:
266*3f982cf4SFabien Sanglard       return os << "NegotiationFailure";
267*3f982cf4SFabien Sanglard     case Error::Code::kNone:
268*3f982cf4SFabien Sanglard       break;
269*3f982cf4SFabien Sanglard   }
270*3f982cf4SFabien Sanglard 
271*3f982cf4SFabien Sanglard   // Unused 'return' to get around failure on GCC.
272*3f982cf4SFabien Sanglard   return os;
273*3f982cf4SFabien Sanglard }
274*3f982cf4SFabien Sanglard 
ToString() const275*3f982cf4SFabien Sanglard std::string Error::ToString() const {
276*3f982cf4SFabien Sanglard   std::stringstream ss;
277*3f982cf4SFabien Sanglard   ss << *this;
278*3f982cf4SFabien Sanglard   return ss.str();
279*3f982cf4SFabien Sanglard }
280*3f982cf4SFabien Sanglard 
operator <<(std::ostream & out,const Error & error)281*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& out, const Error& error) {
282*3f982cf4SFabien Sanglard   out << error.code() << " = \"" << error.message() << "\"";
283*3f982cf4SFabien Sanglard   return out;
284*3f982cf4SFabien Sanglard }
285*3f982cf4SFabien Sanglard 
286*3f982cf4SFabien Sanglard // static
None()287*3f982cf4SFabien Sanglard const Error& Error::None() {
288*3f982cf4SFabien Sanglard   static Error& error = *new Error(Code::kNone);
289*3f982cf4SFabien Sanglard   return error;
290*3f982cf4SFabien Sanglard }
291*3f982cf4SFabien Sanglard 
292*3f982cf4SFabien Sanglard }  // namespace openscreen
293