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 // Looks up the type's root folder. This is usually created by the sync 89 // server during initial sync, though we do eventually wish to remove it from 90 // the protocol and have the client "fake it" instead. 91 InitByLookupResult InitTypeRoot(ModelType type); 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_ 211