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";
1475ed4f4c5b198066feefc4fd49107affa89dc559aSen Jiang    case ErrorCode::kPayloadTimestampError:
1485ed4f4c5b198066feefc4fd49107affa89dc559aSen Jiang      return "ErrorCode::kPayloadTimestampError";
149e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo    // Don't add a default case to let the compiler warn about newly added
150e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo    // error codes which should be added here.
151e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo  }
152e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo
153e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo  return "Unknown error: " + base::UintToString(static_cast<unsigned>(code));
154e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo}
155e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo
156e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo}  // namespace utils
157e88e9feb5a64c1358baeb1c8547e82aa08e1cd83Alex Deymo}  // namespace chromeos_update_engine
158