// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_ERRORS_H_
#define COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_ERRORS_H_

namespace update_client {

// Errors generated as a result of calling UpdateClient member functions.
// These errors are not sent in pings.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Keep in sync with the
// UpdateClientError UMA enum defined in
// //tools/metrics/histograms/enums.xml.
//
// LINT.IfChange(UpdateClientError)
enum class Error {
  NONE = 0,
  UPDATE_IN_PROGRESS = 1,
  UPDATE_CANCELED = 2,
  RETRY_LATER = 3,
  SERVICE_ERROR = 4,
  UPDATE_CHECK_ERROR = 5,
  CRX_NOT_FOUND = 6,
  INVALID_ARGUMENT = 7,
  BAD_CRX_DATA_CALLBACK = 8,
  kMaxValue = BAD_CRX_DATA_CALLBACK,
};
// LINT.ThenChange(//tools/metrics/histograms/enums.xml:UpdateClientError)

// These errors are sent in pings. Add new values only to the bottom of
// the enums below; the order must be kept stable.
enum class ErrorCategory {
  kNone = 0,
  kDownload = 1,
  kUnpack = 2,
  kInstall = 3,
  kService = 4,  // Runtime errors which occur in the service itself.
  kUpdateCheck = 5,
  // kUnknown = 6, defined in `updater_service.mojom`.
  kInstaller = 7,
};

// These errors are returned with the `kDownload` error category. This category
// could include other errors such as the errors defined by the Chrome net
// stack.
enum class CrxDownloaderError {
  NONE = 0,
  NO_URL = 10,
  NO_HASH = 11,
  BAD_HASH = 12,  // The downloaded file fails the hash verification.
  DISK_FULL = 13,
  CANCELLED = 14,
  NO_DOWNLOAD_DIR = 15,

  // The Windows BITS queue contains to many update client jobs. The value is
  // chosen so that it can be reported as a custom COM error on this platform.
  BITS_TOO_MANY_JOBS = 0x0200,
  // Errors 11XX are reserved for Mac background downloader errors.
  MAC_BG_CANNOT_CREATE_DOWNLOAD_CACHE = 1101,
  MAC_BG_MOVE_TO_CACHE_FAIL = 1102,
  MAC_BG_MISSING_COMPLETION_DATA = 1103,
  MAC_BG_DUPLICATE_DOWNLOAD = 1104,
  MAC_BG_SESSION_INVALIDATED = 1105,
  MAC_BG_SESSION_TOO_MANY_TASKS = 1106,
  GENERIC_ERROR = -1
};

// These errors are returned with the |kUnpack| error category and
// indicate unpacker or patcher error.
enum class UnpackerError {
  kNone = 0,
  kInvalidParams = 1,
  kInvalidFile = 2,
  kUnzipPathError = 3,
  kUnzipFailed = 4,
  // kNoManifest = 5,         // Deprecated. Never used.
  kBadManifest = 6,
  kBadExtension = 7,
  // kInvalidId = 8,          // Deprecated. Combined with kInvalidFile.
  // kInstallerError = 9,     // Deprecated. Don't use.
  kIoError = 10,
  kDeltaVerificationFailure = 11,
  kDeltaBadCommands = 12,
  kDeltaUnsupportedCommand = 13,
  kDeltaOperationFailure = 14,
  kDeltaPatchProcessFailure = 15,
  kDeltaMissingExistingFile = 16,
  // kFingerprintWriteFailed = 17,    // Deprecated. Don't use.
  kPuffinMissingPreviousCrx = 18,
  kFailedToAddToCache = 19,
  kFailedToCreateCacheDir = 20,
  kCrxCacheNotProvided = 21,
  kCrxCacheMetadataCorrupted = 22,
  kCrxCacheFileNotCached = 23,
  kPatchInvalidOldFile = 24,
  kPatchInvalidPatchFile = 25,
  kPatchInvalidNewFile = 26,
  kXzFailed = 27,
  kPatchOutHashMismatch = 28,
};

// These errors are returned with the |kInstall| error category and
// are returned by the component installers.
enum class InstallError {
  NONE = 0,
  FINGERPRINT_WRITE_FAILED = 2,
  BAD_MANIFEST = 3,
  GENERIC_ERROR = 9,  // Matches kInstallerError for compatibility.
  MOVE_FILES_ERROR = 10,
  SET_PERMISSIONS_FAILED = 11,
  INVALID_VERSION = 12,
  VERSION_NOT_UPGRADED = 13,
  NO_DIR_COMPONENT_USER = 14,
  CLEAN_INSTALL_DIR_FAILED = 15,
  INSTALL_VERIFICATION_FAILED = 16,
  MISSING_INSTALL_PARAMS = 17,
  // If LaunchProcess is attempted on unsupported non-desktop skus e.g. xbox
  LAUNCH_PROCESS_FAILED = 18,
  INSTALL_PATH_ERROR = 19,
  CUSTOM_ERROR_BASE = 100,  // Specific installer errors go above this value.
};

// These errors are returned with the |kService| error category and
// indicate critical or configuration errors in the update service.
enum class ServiceError {
  NONE = 0,
  SERVICE_WAIT_FAILED = 1,
  UPDATE_DISABLED = 2,
  CANCELLED = 3,

  // Returned when a `CheckForUpdate` call is made, the server returns a
  // update response indicating an update is available, and updates are enabled.
  CHECK_FOR_UPDATE_ONLY = 4,
};

// These errors are related to serialization, deserialization, and parsing of
// protocol requests.
// The begin value for this enum is chosen not to conflict with network errors
// defined by net/base/net_error_list.h. The callers don't have to handle this
// error in any meaningful way, but this value may be reported in UMA stats,
// therefore avoiding collisions with known network errors is desirable.
enum class ProtocolError : int {
  NONE = 0,
  RESPONSE_NOT_TRUSTED = -10000,
  // Obsolete: MISSING_PUBLIC_KEY = -10001,
  MISSING_URLS = -10002,
  PARSE_FAILED = -10003,
  UPDATE_RESPONSE_NOT_FOUND = -10004,
  URL_FETCHER_FAILED = -10005,
  UNKNOWN_APPLICATION = -10006,
  RESTRICTED_APPLICATION = -10007,
  INVALID_APPID = -10008,
  OS_NOT_SUPPORTED = -10009,
  HW_NOT_SUPPORTED = -10010,
  NO_HASH = -10011,
  UNSUPPORTED_PROTOCOL = -10012,
  INTERNAL = -10013,
  UNSUPPORTED_OPERATION = -10014,
  INEXPRESSIBLE = -10015,
  UNKNOWN_ERROR = -10016,
  INVALID_OPERATION_ATTRIBUTES = -10017,
};

struct CategorizedError {
  ErrorCategory category = ErrorCategory::kNone;
  int code = 0;
  int extra = 0;
};

}  // namespace update_client

#endif  // COMPONENTS_UPDATE_CLIENT_UPDATE_CLIENT_ERRORS_H_
