| // 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::kSocketFailure: |
| return os << "SocketFailure"; |
| 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 |