// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_ERROR_CODE_H__
#define CHROMEOS_PLATFORM_UPDATE_ENGINE_ERROR_CODE_H__

namespace chromeos_update_engine {

// Action exit codes.
enum ErrorCode {
  kErrorCodeSuccess = 0,
  kErrorCodeError = 1,
  kErrorCodeOmahaRequestError = 2,
  kErrorCodeOmahaResponseHandlerError = 3,
  kErrorCodeFilesystemCopierError = 4,
  kErrorCodePostinstallRunnerError = 5,
  kErrorCodeSetBootableFlagError = 6,  // TODO(petkov): Unused. Recycle?
  kErrorCodeInstallDeviceOpenError = 7,
  kErrorCodeKernelDeviceOpenError = 8,
  kErrorCodeDownloadTransferError = 9,
  kErrorCodePayloadHashMismatchError = 10,
  kErrorCodePayloadSizeMismatchError = 11,
  kErrorCodeDownloadPayloadVerificationError = 12,
  kErrorCodeDownloadNewPartitionInfoError = 13,
  kErrorCodeDownloadWriteError = 14,
  kErrorCodeNewRootfsVerificationError = 15,
  kErrorCodeNewKernelVerificationError = 16,
  kErrorCodeSignedDeltaPayloadExpectedError = 17,
  kErrorCodeDownloadPayloadPubKeyVerificationError = 18,
  kErrorCodePostinstallBootedFromFirmwareB = 19,
  kErrorCodeDownloadStateInitializationError = 20,
  kErrorCodeDownloadInvalidMetadataMagicString = 21,
  kErrorCodeDownloadSignatureMissingInManifest = 22,
  kErrorCodeDownloadManifestParseError = 23,
  kErrorCodeDownloadMetadataSignatureError = 24,
  kErrorCodeDownloadMetadataSignatureVerificationError = 25,
  kErrorCodeDownloadMetadataSignatureMismatch = 26,
  kErrorCodeDownloadOperationHashVerificationError = 27,
  kErrorCodeDownloadOperationExecutionError = 28,
  kErrorCodeDownloadOperationHashMismatch = 29,
  kErrorCodeOmahaRequestEmptyResponseError = 30,
  kErrorCodeOmahaRequestXMLParseError = 31,
  kErrorCodeDownloadInvalidMetadataSize = 32,
  kErrorCodeDownloadInvalidMetadataSignature = 33,
  kErrorCodeOmahaResponseInvalid = 34,
  kErrorCodeOmahaUpdateIgnoredPerPolicy = 35,
  kErrorCodeOmahaUpdateDeferredPerPolicy = 36,
  kErrorCodeOmahaErrorInHTTPResponse = 37,
  kErrorCodeDownloadOperationHashMissingError = 38,
  kErrorCodeDownloadMetadataSignatureMissingError = 39,
  kErrorCodeOmahaUpdateDeferredForBackoff = 40,
  kErrorCodePostinstallPowerwashError = 41,
  kErrorCodeUpdateCanceledByChannelChange = 42,

  // Note: When adding new error codes, please remember to add the
  // error into one of the buckets in PayloadState::UpdateFailed method so
  // that the retries across URLs and the payload backoff mechanism work
  // correctly for those new error codes.

  // Any code above this is sent to both Omaha and UMA as-is, except
  // kErrorCodeOmahaErrorInHTTPResponse (see error code 2000 for more details).
  // Codes/flags below this line is sent only to Omaha and not to UMA.

  // kErrorCodeUmaReportedMax is not an error code per se, it's just the count
  // of the number of enums above.  Add any new errors above this line if you
  // want them to show up on UMA. Stuff below this line will not be sent to UMA
  // but is used for other errors that are sent to Omaha. We don't assign any
  // particular value for this enum so that it's just one more than the last
  // one above and thus always represents the correct count of UMA metrics
  // buckets, even when new enums are added above this line in future. See
  // utils::SendErrorCodeToUma on how this enum is used.
  kErrorCodeUmaReportedMax,

  // use the 2xxx range to encode HTTP errors. These errors are available in
  // Dremel with the individual granularity. But for UMA purposes, all these
  // errors are aggregated into one: kErrorCodeOmahaErrorInHTTPResponse.
  kErrorCodeOmahaRequestHTTPResponseBase = 2000,  // + HTTP response code

  // TODO(jaysri): Move out all the bit masks into separate constants
  // outside the enum as part of fixing bug 34369.
  // Bit flags. Remember to update the mask below for new bits.

  // Set if boot mode not normal.
  kErrorCodeDevModeFlag        = 1 << 31,

  // Set if resuming an interruped update.
  kErrorCodeResumedFlag         = 1 << 30,

  // Set if using a dev/test image as opposed to an MP-signed image.
  kErrorCodeTestImageFlag       = 1 << 29,

  // Set if using devserver or Omaha sandbox (using crosh autest).
  kErrorCodeTestOmahaUrlFlag    = 1 << 28,

  // Mask that indicates bit positions that are used to indicate special flags
  // that are embedded in the error code to provide additional context about
  // the system in which the error was encountered.
  kErrorCodeSpecialFlags = (kErrorCodeDevModeFlag |
                            kErrorCodeResumedFlag |
                            kErrorCodeTestImageFlag |
                            kErrorCodeTestOmahaUrlFlag)
};

}  // namespace chromeos_update_engine

#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_ACTION_PROCESSOR_H__
