Home | History | Annotate | Download | only in syncable
      1 // Copyright 2013 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_SYNCABLE_MODEL_NEUTRAL_MUTABLE_ENTRY_H_
      6 #define SYNC_SYNCABLE_MODEL_NEUTRAL_MUTABLE_ENTRY_H_
      7 
      8 #include "sync/base/sync_export.h"
      9 #include "sync/internal_api/public/base/model_type.h"
     10 #include "sync/syncable/entry.h"
     11 
     12 namespace syncer {
     13 class WriteNode;
     14 
     15 namespace syncable {
     16 
     17 class BaseWriteTransaction;
     18 
     19 enum CreateNewUpdateItem {
     20   CREATE_NEW_UPDATE_ITEM
     21 };
     22 
     23 // This Entry includes all the operations one can safely perform on the sync
     24 // thread.  In particular, it does not expose setters to make changes that need
     25 // to be communicated to the model (and the model's thread).  It is not possible
     26 // to change an entry's SPECIFICS or UNIQUE_POSITION fields with this kind of
     27 // entry.
     28 class SYNC_EXPORT_PRIVATE ModelNeutralMutableEntry : public Entry {
     29  public:
     30   ModelNeutralMutableEntry(BaseWriteTransaction* trans,
     31                            CreateNewUpdateItem,
     32                            const Id& id);
     33   ModelNeutralMutableEntry(BaseWriteTransaction* trans, GetByHandle, int64);
     34   ModelNeutralMutableEntry(BaseWriteTransaction* trans, GetById, const Id&);
     35   ModelNeutralMutableEntry(
     36       BaseWriteTransaction* trans,
     37       GetByClientTag,
     38       const std::string& tag);
     39   ModelNeutralMutableEntry(
     40       BaseWriteTransaction* trans,
     41       GetTypeRoot,
     42       ModelType type);
     43 
     44   inline BaseWriteTransaction* base_write_transaction() const {
     45     return base_write_transaction_;
     46   }
     47 
     48   // Non-model-changing setters.  These setters will change properties internal
     49   // to the node.  These fields are important for bookkeeping in the sync
     50   // internals, but it is not necessary to communicate changes in these fields
     51   // to the local models.
     52   //
     53   // Some of them trigger the re-indexing of the entry.  They return true on
     54   // success and false on failure, which occurs when putting the value would
     55   // have caused a duplicate in the index.  The setters that never fail return
     56   // void.
     57   void PutBaseVersion(int64 value);
     58   void PutServerVersion(int64 value);
     59   void PutServerMtime(base::Time value);
     60   void PutServerCtime(base::Time value);
     61   bool PutId(const Id& value);
     62   void PutServerParentId(const Id& value);
     63   bool PutIsUnsynced(bool value);
     64   bool PutIsUnappliedUpdate(bool value);
     65   void PutServerIsDir(bool value);
     66   void PutServerIsDel(bool value);
     67   void PutServerNonUniqueName(const std::string& value);
     68   bool PutUniqueServerTag(const std::string& value);
     69   bool PutUniqueClientTag(const std::string& value);
     70   void PutUniqueBookmarkTag(const std::string& tag);
     71   void PutServerSpecifics(const sync_pb::EntitySpecifics& value);
     72   void PutBaseServerSpecifics(const sync_pb::EntitySpecifics& value);
     73   void PutServerUniquePosition(const UniquePosition& value);
     74   void PutServerAttachmentMetadata(const sync_pb::AttachmentMetadata& value);
     75   void PutSyncing(bool value);
     76 
     77   // Do a simple property-only update of the PARENT_ID field.  Use with caution.
     78   //
     79   // The normal Put(IS_PARENT) call will move the item to the front of the
     80   // sibling order to maintain the linked list invariants when the parent
     81   // changes.  That's usually what you want to do, but it's inappropriate
     82   // when the caller is trying to change the parent ID of a the whole set
     83   // of children (e.g. because the ID changed during a commit).  For those
     84   // cases, there's this function.  It will corrupt the sibling ordering
     85   // if you're not careful.
     86   void PutParentIdPropertyOnly(const Id& parent_id);
     87 
     88   // This is similar to what one would expect from Put(TRANSACTION_VERSION),
     89   // except that it doesn't bother to invoke 'SaveOriginals'.  Calling that
     90   // function is at best unnecessary, since the transaction will have already
     91   // used its list of mutations by the time this function is called.
     92   void UpdateTransactionVersion(int64 version);
     93 
     94  protected:
     95   explicit ModelNeutralMutableEntry(BaseWriteTransaction* trans);
     96 
     97   syncable::MetahandleSet* GetDirtyIndexHelper();
     98 
     99  private:
    100   friend class syncer::WriteNode;
    101   friend class Directory;
    102 
    103   // Don't allow creation on heap, except by sync API wrappers.
    104   void* operator new(size_t size) { return (::operator new)(size); }
    105 
    106   // Kind of redundant. We should reduce the number of pointers
    107   // floating around if at all possible. Could we store this in Directory?
    108   // Scope: Set on construction, never changed after that.
    109   BaseWriteTransaction* const base_write_transaction_;
    110 
    111   DISALLOW_COPY_AND_ASSIGN(ModelNeutralMutableEntry);
    112 };
    113 
    114 }  // namespace syncable
    115 }  // namespace syncer
    116 
    117 #endif  // SYNC_SYNCABLE_MODEL_NEUTRAL_MUTABLE_ENTRY_H_
    118