1e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// 2e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// Copyright (C) 2012 The Android Open Source Project 3e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// 4e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// you may not use this file except in compliance with the License. 6e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// You may obtain a copy of the License at 7e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// 8e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// 10e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// Unless required by applicable law or agreed to in writing, software 11e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// See the License for the specific language governing permissions and 14e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// limitations under the License. 15e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo// 16e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 17e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo#include "update_engine/common/error_code_utils.h" 18e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 19e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo#include <base/strings/string_number_conversions.h> 20e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 21e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymousing std::string; 22e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 23e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymonamespace chromeos_update_engine { 24e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymonamespace utils { 25e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 26e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymostring ErrorCodeToString(ErrorCode code) { 27e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // If the given code has both parts (i.e. the error code part and the flags 28e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // part) then strip off the flags part since the switch statement below 29e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // has case statements only for the base error code or a single flag but 30e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // doesn't support any combinations of those. 31e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo if ((static_cast<int>(code) & static_cast<int>(ErrorCode::kSpecialFlags)) && 32e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo (static_cast<int>(code) & ~static_cast<int>(ErrorCode::kSpecialFlags))) 33e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo code = static_cast<ErrorCode>( 34e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo static_cast<int>(code) & ~static_cast<int>(ErrorCode::kSpecialFlags)); 35e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo switch (code) { 36e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kSuccess: return "ErrorCode::kSuccess"; 37e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kError: return "ErrorCode::kError"; 38e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaRequestError: return "ErrorCode::kOmahaRequestError"; 39e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaResponseHandlerError: 40e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaResponseHandlerError"; 41e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kFilesystemCopierError: 42e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kFilesystemCopierError"; 43e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPostinstallRunnerError: 44e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPostinstallRunnerError"; 45e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPayloadMismatchedType: 46e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPayloadMismatchedType"; 47e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kInstallDeviceOpenError: 48e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kInstallDeviceOpenError"; 49e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kKernelDeviceOpenError: 50e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kKernelDeviceOpenError"; 51e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadTransferError: 52e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadTransferError"; 53e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPayloadHashMismatchError: 54e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPayloadHashMismatchError"; 55e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPayloadSizeMismatchError: 56e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPayloadSizeMismatchError"; 57e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadPayloadVerificationError: 58e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadPayloadVerificationError"; 59e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadNewPartitionInfoError: 60e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadNewPartitionInfoError"; 61e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadWriteError: 62e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadWriteError"; 63e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kNewRootfsVerificationError: 64e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kNewRootfsVerificationError"; 65e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kNewKernelVerificationError: 66e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kNewKernelVerificationError"; 67e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kSignedDeltaPayloadExpectedError: 68e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kSignedDeltaPayloadExpectedError"; 69e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadPayloadPubKeyVerificationError: 70e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadPayloadPubKeyVerificationError"; 71e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPostinstallBootedFromFirmwareB: 72e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPostinstallBootedFromFirmwareB"; 73e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadStateInitializationError: 74e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadStateInitializationError"; 75e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadInvalidMetadataMagicString: 76e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadInvalidMetadataMagicString"; 77e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadSignatureMissingInManifest: 78e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadSignatureMissingInManifest"; 79e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadManifestParseError: 80e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadManifestParseError"; 81e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadMetadataSignatureError: 82e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadMetadataSignatureError"; 83e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadMetadataSignatureVerificationError: 84e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadMetadataSignatureVerificationError"; 85e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadMetadataSignatureMismatch: 86e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadMetadataSignatureMismatch"; 87e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadOperationHashVerificationError: 88e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadOperationHashVerificationError"; 89e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadOperationExecutionError: 90e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadOperationExecutionError"; 91e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadOperationHashMismatch: 92e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadOperationHashMismatch"; 93e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaRequestEmptyResponseError: 94e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaRequestEmptyResponseError"; 95e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaRequestXMLParseError: 96e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaRequestXMLParseError"; 97e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadInvalidMetadataSize: 98e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadInvalidMetadataSize"; 99e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadInvalidMetadataSignature: 100e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadInvalidMetadataSignature"; 101e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaResponseInvalid: 102e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaResponseInvalid"; 103e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaUpdateIgnoredPerPolicy: 104e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaUpdateIgnoredPerPolicy"; 105e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaUpdateDeferredPerPolicy: 106e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaUpdateDeferredPerPolicy"; 107e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaErrorInHTTPResponse: 108e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaErrorInHTTPResponse"; 109e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadOperationHashMissingError: 110e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadOperationHashMissingError"; 111e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDownloadMetadataSignatureMissingError: 112e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kDownloadMetadataSignatureMissingError"; 113e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaUpdateDeferredForBackoff: 114e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaUpdateDeferredForBackoff"; 115e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPostinstallPowerwashError: 116e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPostinstallPowerwashError"; 117e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kUpdateCanceledByChannelChange: 118e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kUpdateCanceledByChannelChange"; 119e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kUmaReportedMax: 120e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kUmaReportedMax"; 121e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaRequestHTTPResponseBase: 122e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaRequestHTTPResponseBase"; 123e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kResumedFlag: 124e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "Resumed"; 125e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kDevModeFlag: 126e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "DevMode"; 127e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kTestImageFlag: 128e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "TestImage"; 129e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kTestOmahaUrlFlag: 130e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "TestOmahaUrl"; 131e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kSpecialFlags: 132e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kSpecialFlags"; 133e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kPostinstallFirmwareRONotUpdatable: 134e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kPostinstallFirmwareRONotUpdatable"; 135e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kUnsupportedMajorPayloadVersion: 136e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kUnsupportedMajorPayloadVersion"; 137e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kUnsupportedMinorPayloadVersion: 138e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kUnsupportedMinorPayloadVersion"; 139e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kOmahaRequestXMLHasEntityDecl: 140e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kOmahaRequestXMLHasEntityDecl"; 141e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kFilesystemVerifierError: 142e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kFilesystemVerifierError"; 143e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo case ErrorCode::kUserCanceled: 144e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "ErrorCode::kUserCanceled"; 1452494e28b88a819618c6325a5b081ef7de28549eeKevin Cernekee case ErrorCode::kNonCriticalUpdateInOOBE: 1462494e28b88a819618c6325a5b081ef7de28549eeKevin Cernekee return "ErrorCode::kNonCriticalUpdateInOOBE"; 147e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // Don't add a default case to let the compiler warn about newly added 148e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo // error codes which should be added here. 149e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo } 150e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 151e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo return "Unknown error: " + base::UintToString(static_cast<unsigned>(code)); 152e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo} 153e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo 154e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo} // namespace utils 155e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo} // namespace chromeos_update_engine 156