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