Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / sync / internal_api / public / write_node.h
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_INTERNAL_API_PUBLIC_WRITE_NODE_H_
6 #define SYNC_INTERNAL_API_PUBLIC_WRITE_NODE_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "sync/base/sync_export.h"
14 #include "sync/internal_api/public/base/model_type.h"
15 #include "sync/internal_api/public/base_node.h"
16
17 namespace sync_pb {
18 class AppSpecifics;
19 class AutofillSpecifics;
20 class AutofillProfileSpecifics;
21 class BookmarkSpecifics;
22 class EntitySpecifics;
23 class ExtensionSpecifics;
24 class SessionSpecifics;
25 class NigoriSpecifics;
26 class PasswordSpecificsData;
27 class ThemeSpecifics;
28 class TypedUrlSpecifics;
29 }
30
31 namespace syncer {
32
33 class Cryptographer;
34 class WriteTransaction;
35
36 namespace syncable {
37 class Entry;
38 class MutableEntry;
39 }
40
41 // WriteNode extends BaseNode to add mutation, and wraps
42 // syncable::MutableEntry. A WriteTransaction is needed to create a WriteNode.
43 class SYNC_EXPORT WriteNode : public BaseNode {
44  public:
45   enum InitUniqueByCreationResult {
46     INIT_SUCCESS,
47     // The tag passed into this method was empty.
48     INIT_FAILED_EMPTY_TAG,
49     // An entry with this tag already exists.
50     INIT_FAILED_ENTRY_ALREADY_EXISTS,
51     // The constructor for a new MutableEntry with the specified data failed.
52     INIT_FAILED_COULD_NOT_CREATE_ENTRY,
53     // Setting the predecessor failed
54     INIT_FAILED_SET_PREDECESSOR,
55   };
56
57   // Create a WriteNode using the given transaction.
58   explicit WriteNode(WriteTransaction* transaction);
59   virtual ~WriteNode();
60
61   // A client must use one (and only one) of the following Init variants to
62   // populate the node.
63
64   // BaseNode implementation.
65   virtual InitByLookupResult InitByIdLookup(int64 id) OVERRIDE;
66   virtual InitByLookupResult InitByClientTagLookup(
67       ModelType model_type,
68       const std::string& tag) OVERRIDE;
69
70   // Create a new bookmark node with the specified parent and predecessor.  Use
71   // a NULL |predecessor| to indicate that this is to be the first child.
72   // |predecessor| must be a child of |new_parent| or NULL. Returns false on
73   // failure.
74   bool InitBookmarkByCreation(const BaseNode& parent,
75                               const BaseNode* predecessor);
76
77   // Create nodes using this function if they're unique items that
78   // you want to fetch using client_tag. Note that the behavior of these
79   // items is slightly different than that of normal items.
80   // Most importantly, if it exists locally, this function will
81   // actually undelete it
82   // Client unique tagged nodes must NOT be folders.
83   InitUniqueByCreationResult InitUniqueByCreation(
84       ModelType model_type,
85       const BaseNode& parent,
86       const std::string& client_tag);
87
88   // Each server-created permanent node is tagged with a unique string.
89   // Look up the node with the particular tag.  If it does not exist,
90   // return false.
91   InitByLookupResult InitByTagLookup(const std::string& tag);
92
93   // These Set() functions correspond to the Get() functions of BaseNode.
94   void SetIsFolder(bool folder);
95   void SetTitle(const std::string& title);
96
97   // External ID is a client-only field, so setting it doesn't cause the item to
98   // be synced again.
99   void SetExternalId(int64 external_id);
100
101   // Remove this node and its children and sync deletion to server.
102   void Tombstone();
103
104   // If the node is known by server, remove it and its children but don't sync
105   // deletion to server. Do nothing if the node is not known by server so that
106   // server can have a record of the node.
107   void Drop();
108
109   // Set a new parent and position.  Position is specified by |predecessor|; if
110   // it is NULL, the node is moved to the first position.  |predecessor| must
111   // be a child of |new_parent| or NULL.  Returns false on failure..
112   bool SetPosition(const BaseNode& new_parent, const BaseNode* predecessor);
113
114   // Set the bookmark specifics (url and favicon).
115   // Should only be called if GetModelType() == BOOKMARK.
116   void SetBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics);
117
118   // Generic set specifics method. Will extract the model type from |specifics|.
119   void SetEntitySpecifics(const sync_pb::EntitySpecifics& specifics);
120
121   // Resets the EntitySpecifics for this node based on the unencrypted data.
122   // Will encrypt if necessary.
123   void ResetFromSpecifics();
124
125   // TODO(sync): Remove the setters below when the corresponding data
126   // types are ported to the new sync service API.
127
128   // Set the app specifics (id, update url, enabled state, etc).
129   // Should only be called if GetModelType() == APPS.
130   void SetAppSpecifics(const sync_pb::AppSpecifics& specifics);
131
132   // Set the autofill specifics (name and value).
133   // Should only be called if GetModelType() == AUTOFILL.
134   void SetAutofillSpecifics(const sync_pb::AutofillSpecifics& specifics);
135
136   void SetAutofillProfileSpecifics(
137       const sync_pb::AutofillProfileSpecifics& specifics);
138
139   // Set the nigori specifics.
140   // Should only be called if GetModelType() == NIGORI.
141   void SetNigoriSpecifics(const sync_pb::NigoriSpecifics& specifics);
142
143   // Set the password specifics.
144   // Should only be called if GetModelType() == PASSWORD.
145   void SetPasswordSpecifics(const sync_pb::PasswordSpecificsData& specifics);
146
147   // Set the theme specifics (name and value).
148   // Should only be called if GetModelType() == THEME.
149   void SetThemeSpecifics(const sync_pb::ThemeSpecifics& specifics);
150
151   // Set the typed_url specifics (url, title, typed_count, etc).
152   // Should only be called if GetModelType() == TYPED_URLS.
153   void SetTypedUrlSpecifics(const sync_pb::TypedUrlSpecifics& specifics);
154
155   // Set the extension specifics (id, update url, enabled state, etc).
156   // Should only be called if GetModelType() == EXTENSIONS.
157   void SetExtensionSpecifics(const sync_pb::ExtensionSpecifics& specifics);
158
159   // Set the session specifics (windows, tabs, navigations etc.).
160   // Should only be called if GetModelType() == SESSIONS.
161   void SetSessionSpecifics(const sync_pb::SessionSpecifics& specifics);
162
163   // Set the device info specifics.
164   // Should only be called if GetModelType() == DEVICE_INFO.
165   void SetDeviceInfoSpecifics(const sync_pb::DeviceInfoSpecifics& specifics);
166
167   // Set the experiments specifics.
168   // Should only be called if GetModelType() == EXPERIMENTS.
169   void SetExperimentsSpecifics(const sync_pb::ExperimentsSpecifics& specifics);
170
171   // Set the priority preference specifics.
172   // Should only be called if GetModelType() == PRIORITY_PREFERENCE.
173   void SetPriorityPreferenceSpecifics(
174       const sync_pb::PriorityPreferenceSpecifics& specifics);
175
176   // Set the attachment metadata.
177   void SetAttachmentMetadata(
178       const sync_pb::AttachmentMetadata& attachment_metadata);
179
180   // Implementation of BaseNode's abstract virtual accessors.
181   virtual const syncable::Entry* GetEntry() const OVERRIDE;
182
183   virtual const BaseTransaction* GetTransaction() const OVERRIDE;
184
185   syncable::MutableEntry* GetMutableEntryForTest();
186
187  private:
188   FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, EncryptBookmarksWithLegacyData);
189
190   void* operator new(size_t size);  // Node is meant for stack use only.
191
192   // Helper to set the previous node.
193   bool PutPredecessor(const BaseNode* predecessor) WARN_UNUSED_RESULT;
194
195   // Sets IS_UNSYNCED and SYNCING to ensure this entry is considered in an
196   // upcoming commit pass.
197   void MarkForSyncing();
198
199   // The underlying syncable object which this class wraps.
200   syncable::MutableEntry* entry_;
201
202   // The sync API transaction that is the parent of this node.
203   WriteTransaction* transaction_;
204
205   DISALLOW_COPY_AND_ASSIGN(WriteNode);
206 };
207
208 }  // namespace syncer
209
210 #endif  // SYNC_INTERNAL_API_PUBLIC_WRITE_NODE_H_