293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright 2018 The Chromium Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| #include "platform/base/error.h"
 | |
| 
 | |
| #include <sstream>
 | |
| 
 | |
| namespace openscreen {
 | |
| 
 | |
| Error::Error() = default;
 | |
| 
 | |
| Error::Error(const Error& error) = default;
 | |
| 
 | |
| Error::Error(Error&& error) noexcept = default;
 | |
| 
 | |
| Error::Error(Code code) : code_(code) {}
 | |
| 
 | |
| Error::Error(Code code, const std::string& message)
 | |
|     : code_(code), message_(message) {}
 | |
| 
 | |
| Error::Error(Code code, std::string&& message)
 | |
|     : code_(code), message_(std::move(message)) {}
 | |
| 
 | |
| Error::~Error() = default;
 | |
| 
 | |
| Error& Error::operator=(const Error& other) = default;
 | |
| 
 | |
| Error& Error::operator=(Error&& other) = default;
 | |
| 
 | |
| bool Error::operator==(const Error& other) const {
 | |
|   return code_ == other.code_ && message_ == other.message_;
 | |
| }
 | |
| 
 | |
| bool Error::operator!=(const Error& other) const {
 | |
|   return !(*this == other);
 | |
| }
 | |
| 
 | |
| bool Error::operator==(Code code) const {
 | |
|   return code_ == code;
 | |
| }
 | |
| 
 | |
| bool Error::operator!=(Code code) const {
 | |
|   return !(*this == code);
 | |
| }
 | |
| 
 | |
| std::ostream& operator<<(std::ostream& os, const Error::Code& code) {
 | |
|   if (code == Error::Code::kNone) {
 | |
|     return os << "Success";
 | |
|   }
 | |
|   os << "Failure: ";
 | |
|   switch (code) {
 | |
|     case Error::Code::kAgain:
 | |
|       return os << "Transient";
 | |
|     case Error::Code::kCborParsing:
 | |
|       return os << "CborParsing";
 | |
|     case Error::Code::kCborEncoding:
 | |
|       return os << "CborEncoding";
 | |
|     case Error::Code::kCborIncompleteMessage:
 | |
|       return os << "CborIncompleteMessage";
 | |
|     case Error::Code::kCborInvalidMessage:
 | |
|       return os << "CborInvalidMessage";
 | |
|     case Error::Code::kCborInvalidResponseId:
 | |
|       return os << "CborInvalidResponseId";
 | |
|     case Error::Code::kNoAvailableReceivers:
 | |
|       return os << "NoAvailableReceivers";
 | |
|     case Error::Code::kRequestCancelled:
 | |
|       return os << "RequestCancelled";
 | |
|     case Error::Code::kNoPresentationFound:
 | |
|       return os << "NoPresentationFound";
 | |
|     case Error::Code::kPreviousStartInProgress:
 | |
|       return os << "PreviousStartInProgress";
 | |
|     case Error::Code::kUnknownStartError:
 | |
|       return os << "UnknownStartError";
 | |
|     case Error::Code::kUnknownRequestId:
 | |
|       return os << "UnknownRequestId";
 | |
|     case Error::Code::kAddressInUse:
 | |
|       return os << "AddressInUse";
 | |
|     case Error::Code::kDomainNameTooLong:
 | |
|       return os << "DomainNameTooLong";
 | |
|     case Error::Code::kDomainNameLabelTooLong:
 | |
|       return os << "DomainNameLabelTooLong";
 | |
|     case Error::Code::kIOFailure:
 | |
|       return os << "IOFailure";
 | |
|     case Error::Code::kInitializationFailure:
 | |
|       return os << "InitializationFailure";
 | |
|     case Error::Code::kInvalidIPV4Address:
 | |
|       return os << "InvalidIPV4Address";
 | |
|     case Error::Code::kInvalidIPV6Address:
 | |
|       return os << "InvalidIPV6Address";
 | |
|     case Error::Code::kConnectionFailed:
 | |
|       return os << "ConnectionFailed";
 | |
|     case Error::Code::kSocketOptionSettingFailure:
 | |
|       return os << "SocketOptionSettingFailure";
 | |
|     case Error::Code::kSocketAcceptFailure:
 | |
|       return os << "SocketAcceptFailure";
 | |
|     case Error::Code::kSocketBindFailure:
 | |
|       return os << "SocketBindFailure";
 | |
|     case Error::Code::kSocketClosedFailure:
 | |
|       return os << "SocketClosedFailure";
 | |
|     case Error::Code::kSocketConnectFailure:
 | |
|       return os << "SocketConnectFailure";
 | |
|     case Error::Code::kSocketInvalidState:
 | |
|       return os << "SocketInvalidState";
 | |
|     case Error::Code::kSocketListenFailure:
 | |
|       return os << "SocketListenFailure";
 | |
|     case Error::Code::kSocketReadFailure:
 | |
|       return os << "SocketReadFailure";
 | |
|     case Error::Code::kSocketSendFailure:
 | |
|       return os << "SocketSendFailure";
 | |
|     case Error::Code::kMdnsRegisterFailure:
 | |
|       return os << "MdnsRegisterFailure";
 | |
|     case Error::Code::kMdnsReadFailure:
 | |
|       return os << "MdnsReadFailure";
 | |
|     case Error::Code::kMdnsNonConformingFailure:
 | |
|       return os << "kMdnsNonConformingFailure";
 | |
|     case Error::Code::kParseError:
 | |
|       return os << "ParseError";
 | |
|     case Error::Code::kUnknownMessageType:
 | |
|       return os << "UnknownMessageType";
 | |
|     case Error::Code::kNoActiveConnection:
 | |
|       return os << "NoActiveConnection";
 | |
|     case Error::Code::kAlreadyClosed:
 | |
|       return os << "AlreadyClosed";
 | |
|     case Error::Code::kNoStartedPresentation:
 | |
|       return os << "NoStartedPresentation";
 | |
|     case Error::Code::kPresentationAlreadyStarted:
 | |
|       return os << "PresentationAlreadyStarted";
 | |
|     case Error::Code::kInvalidConnectionState:
 | |
|       return os << "InvalidConnectionState";
 | |
|     case Error::Code::kJsonParseError:
 | |
|       return os << "JsonParseError";
 | |
|     case Error::Code::kJsonWriteError:
 | |
|       return os << "JsonWriteError";
 | |
|     case Error::Code::kFatalSSLError:
 | |
|       return os << "FatalSSLError";
 | |
|     case Error::Code::kRSAKeyGenerationFailure:
 | |
|       return os << "RSAKeyGenerationFailure";
 | |
|     case Error::Code::kRSAKeyParseError:
 | |
|       return os << "RSAKeyParseError";
 | |
|     case Error::Code::kEVPInitializationError:
 | |
|       return os << "EVPInitializationError";
 | |
|     case Error::Code::kCertificateCreationError:
 | |
|       return os << "CertificateCreationError";
 | |
|     case Error::Code::kCertificateValidationError:
 | |
|       return os << "CertificateValidationError";
 | |
|     case Error::Code::kSha256HashFailure:
 | |
|       return os << "Sha256HashFailure";
 | |
|     case Error::Code::kFileLoadFailure:
 | |
|       return os << "FileLoadFailure";
 | |
|     case Error::Code::kErrCertsMissing:
 | |
|       return os << "ErrCertsMissing";
 | |
|     case Error::Code::kErrCertsParse:
 | |
|       return os << "ErrCertsParse";
 | |
|     case Error::Code::kErrCertsRestrictions:
 | |
|       return os << "ErrCertsRestrictions";
 | |
|     case Error::Code::kErrCertsDateInvalid:
 | |
|       return os << "ErrCertsDateInvalid";
 | |
|     case Error::Code::kErrCertsVerifyGeneric:
 | |
|       return os << "ErrCertsVerifyGeneric";
 | |
|     case Error::Code::kErrCertsVerifyUntrustedCert:
 | |
|       return os << "kErrCertsVerifyUntrustedCert";
 | |
|     case Error::Code::kErrCrlInvalid:
 | |
|       return os << "ErrCrlInvalid";
 | |
|     case Error::Code::kErrCertsRevoked:
 | |
|       return os << "ErrCertsRevoked";
 | |
|     case Error::Code::kErrCertsPathlen:
 | |
|       return os << "ErrCertsPathlen";
 | |
|     case Error::Code::kUnknownError:
 | |
|       return os << "UnknownError";
 | |
|     case Error::Code::kNotImplemented:
 | |
|       return os << "NotImplemented";
 | |
|     case Error::Code::kInsufficientBuffer:
 | |
|       return os << "InsufficientBuffer";
 | |
|     case Error::Code::kParameterInvalid:
 | |
|       return os << "ParameterInvalid";
 | |
|     case Error::Code::kParameterOutOfRange:
 | |
|       return os << "ParameterOutOfRange";
 | |
|     case Error::Code::kParameterNullPointer:
 | |
|       return os << "ParameterNullPointer";
 | |
|     case Error::Code::kIndexOutOfBounds:
 | |
|       return os << "IndexOutOfBounds";
 | |
|     case Error::Code::kItemAlreadyExists:
 | |
|       return os << "ItemAlreadyExists";
 | |
|     case Error::Code::kItemNotFound:
 | |
|       return os << "ItemNotFound";
 | |
|     case Error::Code::kOperationInvalid:
 | |
|       return os << "OperationInvalid";
 | |
|     case Error::Code::kOperationInProgress:
 | |
|       return os << "OperationInProgress";
 | |
|     case Error::Code::kOperationCancelled:
 | |
|       return os << "OperationCancelled";
 | |
|     case Error::Code::kTypeError:
 | |
|       return os << "TypeError";
 | |
|     case Error::Code::kCastV2PeerCertEmpty:
 | |
|       return os << "kCastV2PeerCertEmpty";
 | |
|     case Error::Code::kCastV2WrongPayloadType:
 | |
|       return os << "kCastV2WrongPayloadType";
 | |
|     case Error::Code::kCastV2NoPayload:
 | |
|       return os << "kCastV2NoPayload";
 | |
|     case Error::Code::kCastV2PayloadParsingFailed:
 | |
|       return os << "kCastV2PayloadParsingFailed";
 | |
|     case Error::Code::kCastV2MessageError:
 | |
|       return os << "CastV2kMessageError";
 | |
|     case Error::Code::kCastV2NoResponse:
 | |
|       return os << "kCastV2NoResponse";
 | |
|     case Error::Code::kCastV2FingerprintNotFound:
 | |
|       return os << "kCastV2FingerprintNotFound";
 | |
|     case Error::Code::kCastV2CertNotSignedByTrustedCa:
 | |
|       return os << "kCastV2CertNotSignedByTrustedCa";
 | |
|     case Error::Code::kCastV2CannotExtractPublicKey:
 | |
|       return os << "kCastV2CannotExtractPublicKey";
 | |
|     case Error::Code::kCastV2SignedBlobsMismatch:
 | |
|       return os << "kCastV2SignedBlobsMismatch";
 | |
|     case Error::Code::kCastV2TlsCertValidityPeriodTooLong:
 | |
|       return os << "kCastV2TlsCertValidityPeriodTooLong";
 | |
|     case Error::Code::kCastV2TlsCertValidStartDateInFuture:
 | |
|       return os << "kCastV2TlsCertValidStartDateInFuture";
 | |
|     case Error::Code::kCastV2TlsCertExpired:
 | |
|       return os << "kCastV2TlsCertExpired";
 | |
|     case Error::Code::kCastV2SenderNonceMismatch:
 | |
|       return os << "kCastV2SenderNonceMismatch";
 | |
|     case Error::Code::kCastV2DigestUnsupported:
 | |
|       return os << "kCastV2DigestUnsupported";
 | |
|     case Error::Code::kCastV2SignatureEmpty:
 | |
|       return os << "kCastV2SignatureEmpty";
 | |
|     case Error::Code::kCastV2ChannelNotOpen:
 | |
|       return os << "kCastV2ChannelNotOpen";
 | |
|     case Error::Code::kCastV2AuthenticationError:
 | |
|       return os << "kCastV2AuthenticationError";
 | |
|     case Error::Code::kCastV2ConnectError:
 | |
|       return os << "kCastV2ConnectError";
 | |
|     case Error::Code::kCastV2CastSocketError:
 | |
|       return os << "kCastV2CastSocketError";
 | |
|     case Error::Code::kCastV2TransportError:
 | |
|       return os << "kCastV2TransportError";
 | |
|     case Error::Code::kCastV2InvalidMessage:
 | |
|       return os << "kCastV2InvalidMessage";
 | |
|     case Error::Code::kCastV2InvalidChannelId:
 | |
|       return os << "kCastV2InvalidChannelId";
 | |
|     case Error::Code::kCastV2ConnectTimeout:
 | |
|       return os << "kCastV2ConnectTimeout";
 | |
|     case Error::Code::kCastV2PingTimeout:
 | |
|       return os << "kCastV2PingTimeout";
 | |
|     case Error::Code::kCastV2ChannelPolicyMismatch:
 | |
|       return os << "kCastV2ChannelPolicyMismatch";
 | |
|     case Error::Code::kCreateSignatureFailed:
 | |
|       return os << "kCreateSignatureFailed";
 | |
|     case Error::Code::kUpdateReceivedRecordFailure:
 | |
|       return os << "kUpdateReceivedRecordFailure";
 | |
|     case Error::Code::kRecordPublicationError:
 | |
|       return os << "kRecordPublicationError";
 | |
|     case Error::Code::kProcessReceivedRecordFailure:
 | |
|       return os << "ProcessReceivedRecordFailure";
 | |
|     case Error::Code::kUnknownCodec:
 | |
|       return os << "UnknownCodec";
 | |
|     case Error::Code::kInvalidCodecParameter:
 | |
|       return os << "InvalidCodecParameter";
 | |
|     case Error::Code::kSocketFailure:
 | |
|       return os << "SocketFailure";
 | |
|     case Error::Code::kUnencryptedOffer:
 | |
|       return os << "UnencryptedOffer";
 | |
|     case Error::Code::kRemotingNotSupported:
 | |
|       return os << "RemotingNotSupported";
 | |
|     case Error::Code::kNegotiationFailure:
 | |
|       return os << "NegotiationFailure";
 | |
|     case Error::Code::kNone:
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   // Unused 'return' to get around failure on GCC.
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| std::string Error::ToString() const {
 | |
|   std::stringstream ss;
 | |
|   ss << *this;
 | |
|   return ss.str();
 | |
| }
 | |
| 
 | |
| std::ostream& operator<<(std::ostream& out, const Error& error) {
 | |
|   out << error.code() << " = \"" << error.message() << "\"";
 | |
|   return out;
 | |
| }
 | |
| 
 | |
| // static
 | |
| const Error& Error::None() {
 | |
|   static Error& error = *new Error(Code::kNone);
 | |
|   return error;
 | |
| }
 | |
| 
 | |
| }  // namespace openscreen
 |