910e62b5创建于 1月15日历史提交
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/drive/file_errors.h"

#include <type_traits>

#include "base/notreached.h"
#include "base/types/cxx23_to_underlying.h"

namespace drive {

std::ostream& operator<<(std::ostream& out, const FileError error) {
  const std::string s = FileErrorToString(error);
  if (!s.empty()) {
    return out << s;
  }

  return out << "FileError("
             << static_cast<std::underlying_type_t<FileError>>(error) << ")";
}

std::string FileErrorToString(FileError error) {
  switch (error) {
#define PRINT(s) \
  case s:        \
    return #s;
    PRINT(FILE_ERROR_OK)
    PRINT(FILE_ERROR_FAILED)
    PRINT(FILE_ERROR_IN_USE)
    PRINT(FILE_ERROR_EXISTS)
    PRINT(FILE_ERROR_NOT_FOUND)
    PRINT(FILE_ERROR_ACCESS_DENIED)
    PRINT(FILE_ERROR_TOO_MANY_OPENED)
    PRINT(FILE_ERROR_NO_MEMORY)
    PRINT(FILE_ERROR_NO_SERVER_SPACE)
    PRINT(FILE_ERROR_NOT_A_DIRECTORY)
    PRINT(FILE_ERROR_INVALID_OPERATION)
    PRINT(FILE_ERROR_SECURITY)
    PRINT(FILE_ERROR_ABORT)
    PRINT(FILE_ERROR_NOT_A_FILE)
    PRINT(FILE_ERROR_NOT_EMPTY)
    PRINT(FILE_ERROR_INVALID_URL)
    PRINT(FILE_ERROR_NO_CONNECTION)
    PRINT(FILE_ERROR_NO_LOCAL_SPACE)
    PRINT(FILE_ERROR_SERVICE_UNAVAILABLE)
    PRINT(FILE_ERROR_OK_WITH_MORE_RESULTS)
#undef PRINT
  }

  NOTREACHED() << "Unexpected FileError "
               << static_cast<std::underlying_type_t<FileError>>(error);
}

bool IsFileErrorOk(FileError error) {
  switch (error) {
    case FILE_ERROR_OK:
    case FILE_ERROR_OK_WITH_MORE_RESULTS:
      return true;
    case FILE_ERROR_FAILED:
    case FILE_ERROR_IN_USE:
    case FILE_ERROR_EXISTS:
    case FILE_ERROR_NOT_FOUND:
    case FILE_ERROR_ACCESS_DENIED:
    case FILE_ERROR_TOO_MANY_OPENED:
    case FILE_ERROR_NO_MEMORY:
    case FILE_ERROR_NO_SERVER_SPACE:
    case FILE_ERROR_NOT_A_DIRECTORY:
    case FILE_ERROR_INVALID_OPERATION:
    case FILE_ERROR_SECURITY:
    case FILE_ERROR_ABORT:
    case FILE_ERROR_NOT_A_FILE:
    case FILE_ERROR_NOT_EMPTY:
    case FILE_ERROR_INVALID_URL:
    case FILE_ERROR_NO_CONNECTION:
    case FILE_ERROR_NO_LOCAL_SPACE:
    case FILE_ERROR_SERVICE_UNAVAILABLE:
      return false;
  }

  NOTREACHED() << "Unexpected FileError " << base::to_underlying(error);
}

base::File::Error FileErrorToBaseFileError(FileError error) {
  switch (error) {
    case FILE_ERROR_OK:
    case FILE_ERROR_OK_WITH_MORE_RESULTS:
      return base::File::FILE_OK;

    case FILE_ERROR_FAILED:
      return base::File::FILE_ERROR_FAILED;

    case FILE_ERROR_IN_USE:
      return base::File::FILE_ERROR_IN_USE;

    case FILE_ERROR_EXISTS:
      return base::File::FILE_ERROR_EXISTS;

    case FILE_ERROR_NOT_FOUND:
      return base::File::FILE_ERROR_NOT_FOUND;

    case FILE_ERROR_ACCESS_DENIED:
      return base::File::FILE_ERROR_ACCESS_DENIED;

    case FILE_ERROR_TOO_MANY_OPENED:
      return base::File::FILE_ERROR_TOO_MANY_OPENED;

    case FILE_ERROR_NO_MEMORY:
      return base::File::FILE_ERROR_NO_MEMORY;

    case FILE_ERROR_NO_SERVER_SPACE:
      return base::File::FILE_ERROR_NO_SPACE;

    case FILE_ERROR_NOT_A_DIRECTORY:
      return base::File::FILE_ERROR_NOT_A_DIRECTORY;

    case FILE_ERROR_INVALID_OPERATION:
      return base::File::FILE_ERROR_INVALID_OPERATION;

    case FILE_ERROR_SECURITY:
      return base::File::FILE_ERROR_SECURITY;

    case FILE_ERROR_ABORT:
      return base::File::FILE_ERROR_ABORT;

    case FILE_ERROR_NOT_A_FILE:
      return base::File::FILE_ERROR_NOT_A_FILE;

    case FILE_ERROR_NOT_EMPTY:
      return base::File::FILE_ERROR_NOT_EMPTY;

    case FILE_ERROR_INVALID_URL:
      return base::File::FILE_ERROR_INVALID_URL;

    case FILE_ERROR_NO_CONNECTION:
      return base::File::FILE_ERROR_FAILED;

    case FILE_ERROR_NO_LOCAL_SPACE:
      return base::File::FILE_ERROR_FAILED;

    case FILE_ERROR_SERVICE_UNAVAILABLE:
      return base::File::FILE_ERROR_FAILED;
  }

  NOTREACHED();
}

FileError GDataToFileError(google_apis::ApiErrorCode status) {
  switch (status) {
    case google_apis::HTTP_SUCCESS:
    case google_apis::HTTP_CREATED:
    case google_apis::HTTP_NO_CONTENT:
      return FILE_ERROR_OK;
    case google_apis::HTTP_UNAUTHORIZED:
    case google_apis::HTTP_FORBIDDEN:
      return FILE_ERROR_ACCESS_DENIED;
    case google_apis::HTTP_NOT_FOUND:
    case google_apis::HTTP_GONE:
      return FILE_ERROR_NOT_FOUND;
    case google_apis::HTTP_INTERNAL_SERVER_ERROR:
    case google_apis::HTTP_SERVICE_UNAVAILABLE:
      return FILE_ERROR_SERVICE_UNAVAILABLE;
    case google_apis::HTTP_NOT_IMPLEMENTED:
      return FILE_ERROR_INVALID_OPERATION;
    case google_apis::CANCELLED:
      return FILE_ERROR_ABORT;
    case google_apis::NO_CONNECTION:
      return FILE_ERROR_NO_CONNECTION;
    case google_apis::DRIVE_NO_SPACE:
      return FILE_ERROR_NO_SERVER_SPACE;
    default:
      return FILE_ERROR_FAILED;
  }
}

}  // namespace drive