Home | History | Annotate | Download | only in public
      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::wstring& 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 managed user setting specifics (name and value).
    164   // Should only be called if GetModelType() == MANAGED_USER_SETTINGS.
    165   void SetManagedUserSettingSpecifics(
    166       const sync_pb::ManagedUserSettingSpecifics& specifics);
    167 
    168   // Set the managed user setting specifics (name and value).
    169   // Should only be called if GetModelType() == MANAGED_USERS.
    170   void SetManagedUserSpecifics(const sync_pb::ManagedUserSpecifics& specifics);
    171 
    172   // Set the device info specifics.
    173   // Should only be called if GetModelType() == DEVICE_INFO.
    174   void SetDeviceInfoSpecifics(const sync_pb::DeviceInfoSpecifics& specifics);
    175 
    176   // Set the experiments specifics.
    177   // Should only be called if GetModelType() == EXPERIMENTS.
    178   void SetExperimentsSpecifics(const sync_pb::ExperimentsSpecifics& specifics);
    179 
    180   // Set the priority preference specifics.
    181   // Should only be called if GetModelType() == PRIORITY_PREFERENCE.
    182   void SetPriorityPreferenceSpecifics(
    183       const sync_pb::PriorityPreferenceSpecifics& specifics);
    184 
    185   // Implementation of BaseNode's abstract virtual accessors.
    186   virtual const syncable::Entry* GetEntry() const OVERRIDE;
    187 
    188   virtual const BaseTransaction* GetTransaction() const OVERRIDE;
    189 
    190   syncable::MutableEntry* GetMutableEntryForTest();
    191 
    192  private:
    193   FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, EncryptBookmarksWithLegacyData);
    194 
    195   void* operator new(size_t size);  // Node is meant for stack use only.
    196 
    197   // Helper to set the previous node.
    198   bool PutPredecessor(const BaseNode* predecessor) WARN_UNUSED_RESULT;
    199 
    200   // Sets IS_UNSYNCED and SYNCING to ensure this entry is considered in an
    201   // upcoming commit pass.
    202   void MarkForSyncing();
    203 
    204   // The underlying syncable object which this class wraps.
    205   syncable::MutableEntry* entry_;
    206 
    207   // The sync API transaction that is the parent of this node.
    208   WriteTransaction* transaction_;
    209 
    210   DISALLOW_COPY_AND_ASSIGN(WriteNode);
    211 };
    212 
    213 }  // namespace syncer
    214 
    215 #endif  // SYNC_INTERNAL_API_PUBLIC_WRITE_NODE_H_
    216