15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::SyncError() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clear();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::SyncError(const tracked_objects::Location& location,
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ErrorType error_type,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     const std::string& message,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ModelType model_type) {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(error_type != UNSET);
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Init(location, message, model_type, error_type);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintLogError();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::SyncError(const SyncError& other) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copy(other);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::~SyncError() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError& SyncError::operator=(const SyncError& other) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this == &other) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copy(other);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *this;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Copy(const SyncError& other) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (other.IsSet()) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init(other.location(),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         other.message(),
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         other.model_type(),
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         other.error_type());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Clear() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_.reset();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_ = std::string();
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  model_type_ = UNSPECIFIED;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  error_type_ = UNSET;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Reset(const tracked_objects::Location& location,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& message,
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ModelType model_type) {
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Init(location, message, model_type, DATATYPE_ERROR);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintLogError();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Init(const tracked_objects::Location& location,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& message,
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ModelType model_type,
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ErrorType error_type) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_.reset(new tracked_objects::Location(location));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_ = message;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  model_type_ = model_type;
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  error_type_ = error_type;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncError::IsSet() const {
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return error_type_ != UNSET;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const tracked_objects::Location& SyncError::location() const {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *location_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& SyncError::message() const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochModelType SyncError::model_type() const {
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(IsSet());
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return model_type_;
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSyncError::ErrorType SyncError::error_type() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return error_type_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SyncError::Severity SyncError::GetSeverity() const {
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (error_type_) {
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case UNREADY_ERROR:
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DATATYPE_POLICY_ERROR:
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return SYNC_ERROR_SEVERITY_INFO;
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    default:
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return SYNC_ERROR_SEVERITY_ERROR;
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string SyncError::GetMessagePrefix() const {
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string type_message;
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (error_type_) {
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case UNRECOVERABLE_ERROR:
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "unrecoverable error was encountered: ";
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DATATYPE_ERROR:
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "datatype error was encountered: ";
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case PERSISTENCE_ERROR:
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "persistence error was encountered: ";
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case CRYPTO_ERROR:
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "cryptographer error was encountered: ";
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case UNREADY_ERROR:
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "unready error was encountered: ";
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case DATATYPE_POLICY_ERROR:
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      type_message = "disabled due to configuration constraints: ";
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case UNSET:
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED() << "Invalid error type";
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return type_message;
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncError::ToString() const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsSet()) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return location_->ToString() + ", " + ModelTypeToString(model_type_) +
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      " " + GetMessagePrefix() + message_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::PrintLogError() const {
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  logging::LogSeverity logSeverity =
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      (GetSeverity() == SYNC_ERROR_SEVERITY_INFO)
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ? logging::LOG_VERBOSE : logging::LOG_ERROR;
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LAZY_STREAM(logging::LogMessage(location_->file_name(),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  location_->line_number(),
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  logSeverity).stream(),
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              logSeverity >= ::logging::GetMinLogLevel())
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      << ModelTypeToString(model_type_) << " "
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      << GetMessagePrefix() << message_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintTo(const SyncError& sync_error, std::ostream* os) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *os << sync_error.ToString();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
167