syncer_error.cc 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/sync/base/syncer_error.h"
  5. #include "base/check_op.h"
  6. #include "base/notreached.h"
  7. #include "base/strings/string_number_conversions.h"
  8. #include "net/base/net_errors.h"
  9. #include "net/http/http_status_code.h"
  10. namespace syncer {
  11. namespace {
  12. #define ENUM_CASE(x) \
  13. case SyncerError::x: \
  14. return #x; \
  15. break;
  16. std::string GetSyncerErrorString(SyncerError::Value value) {
  17. switch (value) {
  18. ENUM_CASE(UNSET);
  19. ENUM_CASE(CANNOT_DO_WORK);
  20. ENUM_CASE(NETWORK_CONNECTION_UNAVAILABLE);
  21. ENUM_CASE(NETWORK_IO_ERROR);
  22. ENUM_CASE(SYNC_SERVER_ERROR);
  23. ENUM_CASE(SYNC_AUTH_ERROR);
  24. ENUM_CASE(SERVER_RETURN_UNKNOWN_ERROR);
  25. ENUM_CASE(SERVER_RETURN_THROTTLED);
  26. ENUM_CASE(SERVER_RETURN_TRANSIENT_ERROR);
  27. ENUM_CASE(SERVER_RETURN_MIGRATION_DONE);
  28. ENUM_CASE(SERVER_RETURN_CLEAR_PENDING);
  29. ENUM_CASE(SERVER_RETURN_NOT_MY_BIRTHDAY);
  30. ENUM_CASE(SERVER_RETURN_CONFLICT);
  31. ENUM_CASE(SERVER_RESPONSE_VALIDATION_FAILED);
  32. ENUM_CASE(SERVER_RETURN_DISABLED_BY_ADMIN);
  33. ENUM_CASE(SERVER_RETURN_PARTIAL_FAILURE);
  34. ENUM_CASE(SERVER_RETURN_CLIENT_DATA_OBSOLETE);
  35. ENUM_CASE(SERVER_RETURN_ENCRYPTION_OBSOLETE);
  36. ENUM_CASE(SERVER_MORE_TO_DOWNLOAD);
  37. ENUM_CASE(DATATYPE_TRIGGERED_RETRY);
  38. ENUM_CASE(SYNCER_OK);
  39. }
  40. NOTREACHED();
  41. return "INVALID";
  42. }
  43. #undef ENUM_CASE
  44. } // namespace
  45. SyncerError::SyncerError(Value value) : value_(value) {
  46. // NETWORK_CONNECTION_UNAVAILABLE error must be created via the separate
  47. // factory method NetworkConnectionUnavailable().
  48. DCHECK_NE(value_, NETWORK_CONNECTION_UNAVAILABLE);
  49. // SYNC_SERVER_ERROR and SYNC_AUTH_ERROR both correspond to HTTP errors, and
  50. // must be created via HttpError().
  51. DCHECK_NE(value_, SYNC_SERVER_ERROR);
  52. DCHECK_NE(value_, SYNC_AUTH_ERROR);
  53. }
  54. // static
  55. SyncerError SyncerError::NetworkConnectionUnavailable(int net_error_code) {
  56. return SyncerError(NETWORK_CONNECTION_UNAVAILABLE, net_error_code,
  57. /*http_status_code=*/0);
  58. }
  59. // static
  60. SyncerError SyncerError::HttpError(int http_status_code) {
  61. return SyncerError((http_status_code == net::HTTP_UNAUTHORIZED)
  62. ? SYNC_AUTH_ERROR
  63. : SYNC_SERVER_ERROR,
  64. /*net_error_code=*/0, http_status_code);
  65. }
  66. std::string SyncerError::ToString() const {
  67. std::string result = GetSyncerErrorString(value_);
  68. if (value_ == NETWORK_CONNECTION_UNAVAILABLE) {
  69. result += " (" + net::ErrorToShortString(net_error_code_) + ")";
  70. } else if (value_ == SYNC_SERVER_ERROR || value_ == SYNC_AUTH_ERROR) {
  71. result += " (HTTP " + base::NumberToString(http_status_code_) + ")";
  72. }
  73. return result;
  74. }
  75. bool SyncerError::IsActualError() const {
  76. return value_ != UNSET && value_ != SYNCER_OK &&
  77. value_ != SERVER_MORE_TO_DOWNLOAD;
  78. }
  79. } // namespace syncer