1// Copyright 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_CHANGE_H_
6#define SYNC_API_SYNC_CHANGE_H_
7
8#include <iosfwd>
9#include <string>
10#include <vector>
11
12#include "base/location.h"
13#include "sync/api/sync_data.h"
14#include "sync/base/sync_export.h"
15
16namespace syncer {
17
18// A SyncChange object reflects a change to a piece of synced data. The change
19// can be either a delete, add, or an update. All data relevant to the change
20// is encapsulated within the SyncChange, which, once created, is immutable.
21// Note: it is safe and cheap to pass these by value or make copies, as they do
22// not create deep copies of their internal data.
23class SYNC_EXPORT SyncChange {
24 public:
25  enum SyncChangeType {
26    ACTION_INVALID,
27    ACTION_ADD,
28    ACTION_UPDATE,
29    ACTION_DELETE,
30  };
31
32  // Default constructor creates an invalid change.
33  SyncChange();
34  // Create a new change with the specified sync data.
35  SyncChange(
36      const tracked_objects::Location& from_here,
37      SyncChangeType change_type,
38      const SyncData& sync_data);
39  ~SyncChange();
40
41  // Copy constructor and assignment operator welcome.
42
43  // Whether this change is valid. This must be true before attempting to access
44  // the data.
45  // Deletes: Requires valid tag when going to the syncer. Requires valid
46  //          specifics when coming from the syncer.
47  // Adds, Updates: Require valid tag and specifics when going to the syncer.
48  //                Require only valid specifics when coming from the syncer.
49  bool IsValid() const;
50
51  // Getters.
52  SyncChangeType change_type() const;
53  SyncData sync_data() const;
54  tracked_objects::Location location() const;
55
56  // Returns a string representation of |change_type|.
57  static std::string ChangeTypeToString(SyncChangeType change_type);
58
59  // Returns a string representation of the entire object. Used for gmock
60  // printing method, PrintTo.
61  std::string ToString() const;
62
63 private:
64  tracked_objects::Location location_;
65
66  SyncChangeType change_type_;
67
68  // An immutable container for the data of this SyncChange. Whenever
69  // SyncChanges are copied, they copy references to this data.
70  SyncData sync_data_;
71};
72
73// gmock printer helper.
74SYNC_EXPORT void PrintTo(const SyncChange& sync_change, std::ostream* os);
75
76}  // namespace syncer
77
78#endif  // SYNC_API_SYNC_CHANGE_H_
79