12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 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)#ifndef SYNC_API_SYNC_ERROR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_API_SYNC_ERROR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iosfwd> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Location; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tracked_objects 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sync errors are used for debug purposes and handled internally and/or 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// exposed through Chrome's "about:sync" internal page. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is copy-friendly and thread-safe. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT SyncError { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Error types are used to distinguish general datatype errors (which result 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // in the datatype being disabled) from actionable sync errors (which might 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // have more complicated results). 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum ErrorType { 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UNSET, // No error. 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UNRECOVERABLE_ERROR, // An unrecoverable runtime error was encountered, and 326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // sync should be disabled and purged completely. 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DATATYPE_ERROR, // A datatype error was encountered, and the datatype 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // should be disabled and purged completely. Note that 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // datatype errors may be reset, triggering a 366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // re-enable. 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PERSISTENCE_ERROR, // A persistence error was detected, and the 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // datataype should be associated after a sync update. 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CRYPTO_ERROR, // A cryptographer error was detected, and the 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // datatype should be associated after it is resolved. 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UNREADY_ERROR, // A datatype is not ready to start yet, so should be 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // neither purged nor enabled until it is ready. 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DATATYPE_POLICY_ERROR // A datatype should be disabled and purged due 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to configuration constraints. 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Severity is used to indicate how an error should be logged and 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // represented to an end user. 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enum Severity { 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SYNC_ERROR_SEVERITY_ERROR, // Severe unrecoverable error. 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SYNC_ERROR_SEVERITY_INFO // Low-severity recoverable error or 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // configuration policy issue. 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default constructor refers to "no error", and IsSet() will return false. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncError(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a new Sync error of type |error_type| triggered by |model_type| 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // from the specified location. IsSet() will return true afterward. Will 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // create and print an error specific message to LOG(ERROR). 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncError(const tracked_objects::Location& location, 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ErrorType error_type, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message, 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ModelType model_type); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy and assign via deep copy. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncError(const SyncError& other); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncError& operator=(const SyncError& other); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SyncError(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Reset the current error to a new datatype error. May be called 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // irrespective of whether IsSet() is true. After this is called, IsSet() 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // will return true. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will print the new error to LOG(ERROR). 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset(const tracked_objects::Location& location, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType type); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether this is a valid error or not. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSet() const; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These must only be called if IsSet() is true. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& location() const; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message() const; 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ModelType model_type() const; 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ErrorType error_type() const; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Error severity for logging and UI purposes. 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Severity GetSeverity() const; 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Type specific message prefix for logging and UI purposes. 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string GetMessagePrefix() const; 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns empty string is IsSet() is false. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ToString() const; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Print error information to log. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrintLogError() const; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a copy of a SyncError. If other.IsSet() == false, this->IsSet() will 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now return false. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Copy(const SyncError& other); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the local error data with the specified error data. After this 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is called, IsSet() will return true. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(const tracked_objects::Location& location, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message, 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ModelType model_type, 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ErrorType error_type); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the error to it's default (unset) values. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scoped_ptr is necessary because Location objects aren't assignable. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<tracked_objects::Location> location_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message_; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ModelType model_type_; 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ErrorType error_type_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gmock printer helper. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT void PrintTo(const SyncError& sync_error, std::ostream* os); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_API_SYNC_ERROR_H_ 127