sync_error.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SYNC_API_SYNC_ERROR_H_
6#define SYNC_API_SYNC_ERROR_H_
7
8#include <iosfwd>
9#include <string>
10
11#include "base/memory/scoped_ptr.h"
12#include "sync/internal_api/public/base/model_type.h"
13
14namespace tracked_objects {
15class Location;
16}  // namespace tracked_objects
17
18namespace syncer {
19
20// Sync errors are used for debug purposes and handled internally and/or
21// exposed through Chrome's "about:sync" internal page. They are considered
22// unrecoverable for the datatype creating them, and should only be used as
23// such.
24// This class is copy-friendly and thread-safe.
25class SyncError {
26 public:
27  // Default constructor refers to "no error", and IsSet() will return false.
28  SyncError();
29
30  // Create a new Sync error triggered by datatype |type| with debug message
31  // |message| from the specified location. IsSet() will return true.
32  // Will print the new error to LOG(ERROR).
33  SyncError(const tracked_objects::Location& location,
34            const std::string& message,
35            ModelType type);
36
37  // Copy and assign via deep copy.
38  SyncError(const SyncError& other);
39  SyncError& operator=(const SyncError& other);
40
41  ~SyncError();
42
43  // Reset the current error to a new error. May be called irrespective of
44  // whether IsSet() is true. After this is called, IsSet() will return true.
45  // Will print the new error to LOG(ERROR).
46  void Reset(const tracked_objects::Location& location,
47             const std::string& message,
48             ModelType type);
49
50  // Whether this is a valid error or not.
51  bool IsSet() const;
52
53  // These must only be called if IsSet() is true.
54  const tracked_objects::Location& location() const;
55  const std::string& message() const;
56  ModelType type() const;
57
58  // Returns empty string is IsSet() is false.
59  std::string ToString() const;
60 private:
61  // Print error information to log.
62  void PrintLogError() const;
63
64  // Make a copy of a SyncError. If other.IsSet() == false, this->IsSet() will
65  // now return false.
66  void Copy(const SyncError& other);
67
68  // Initialize the local error data with the specified error data. After this
69  // is called, IsSet() will return true.
70  void Init(const tracked_objects::Location& location,
71            const std::string& message,
72            ModelType type);
73
74  // Reset the error to it's default (unset) values.
75  void Clear();
76
77  // scoped_ptr is necessary because Location objects aren't assignable.
78  scoped_ptr<tracked_objects::Location> location_;
79  std::string message_;
80  ModelType type_;
81};
82
83// gmock printer helper.
84void PrintTo(const SyncError& sync_error, std::ostream* os);
85
86}  // namespace syncer
87
88#endif  // SYNC_API_SYNC_ERROR_H_
89