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