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