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,
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     const std::string& custom_message,
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ModelType model_type) {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string type_message;
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  switch (error_type) {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case UNRECOVERABLE_ERROR:
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      type_message = "unrecoverable error was encountered: ";
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case DATATYPE_ERROR:
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      type_message = "datatype error was encountered: ";
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PERSISTENCE_ERROR:
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      type_message = "persistence error was encountered: ";
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case CRYPTO_ERROR:
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      type_message = "cryptographer error was encountered: ";
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    default:
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NOTREACHED();
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      type_message = "invalid error: ";
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Init(location, type_message + custom_message, model_type, error_type);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintLogError();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::SyncError(const SyncError& other) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copy(other);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError::~SyncError() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError& SyncError::operator=(const SyncError& other) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this == &other) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Copy(other);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *this;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Copy(const SyncError& other) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (other.IsSet()) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init(other.location(),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         other.message(),
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         other.model_type(),
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         other.error_type());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Clear() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_.reset();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_ = std::string();
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  model_type_ = UNSPECIFIED;
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  error_type_ = UNSET;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Reset(const tracked_objects::Location& location,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& message,
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ModelType model_type) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Init(location, message, model_type, DATATYPE_ERROR);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintLogError();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::Init(const tracked_objects::Location& location,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& message,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ModelType model_type,
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ErrorType error_type) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_.reset(new tracked_objects::Location(location));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_ = message;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  model_type_ = model_type;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  error_type_ = error_type;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncError::IsSet() const {
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return error_type_ != UNSET;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const tracked_objects::Location& SyncError::location() const {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *location_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& SyncError::message() const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochModelType SyncError::model_type() const {
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(IsSet());
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return model_type_;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSyncError::ErrorType SyncError::error_type() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(IsSet());
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return error_type_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncError::ToString() const {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsSet()) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return location_->ToString() + ", " + ModelTypeToString(model_type_) +
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      " " + message_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncError::PrintLogError() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LAZY_STREAM(logging::LogMessage(location_->file_name(),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  location_->line_number(),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  logging::LOG_ERROR).stream(),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              LOG_IS_ON(ERROR))
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      << ModelTypeToString(model_type_) << " " << message_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintTo(const SyncError& sync_error, std::ostream* os) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *os << sync_error.ToString();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
141