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