blob: 58d81e76dd3716b7355aa8ce9c8bf877b45eecfa [file] [log] [blame]
// 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