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