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