Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Side by Side Diff: components/sync/api/attachments/attachment_store.h

Issue 2401223002: [Sync] Renaming sync/api* to sync/model*. (Closed)
Patch Set: Missed a comment in a DEPS file, and rebasing. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 COMPONENTS_SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
6 #define COMPONENTS_SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
7
8 #include <memory>
9
10 #include "base/callback.h"
11 #include "base/macros.h"
12 #include "base/memory/ref_counted.h"
13 #include "components/sync/api/attachments/attachment.h"
14 #include "components/sync/api/attachments/attachment_id.h"
15 #include "components/sync/api/attachments/attachment_metadata.h"
16
17 namespace base {
18 class FilePath;
19 class SequencedTaskRunner;
20 } // namespace base
21
22 namespace syncer {
23
24 class AttachmentStoreBackend;
25 class AttachmentStoreForSync;
26 class AttachmentStoreFrontend;
27
28 // AttachmentStore is a place to locally store and access Attachments.
29 //
30 // AttachmentStore class is an interface exposed to data type and
31 // AttachmentService code.
32 // It also contains factory methods for default attachment store
33 // implementations.
34 // Destroying this object does not necessarily cancel outstanding async
35 // operations. If you need cancel like semantics, use WeakPtr in the callbacks.
36 class AttachmentStore {
37 public:
38 // TODO(maniscalco): Consider udpating Read and Write methods to support
39 // resumable transfers (bug 353292).
40
41 // The result status of an attachment store operation.
42 // Do not re-order or delete these entries; they are used in a UMA histogram.
43 enum Result {
44 SUCCESS = 0, // No error, all completed successfully.
45 UNSPECIFIED_ERROR = 1, // An unspecified error occurred for >= 1 item.
46 STORE_INITIALIZATION_FAILED = 2, // AttachmentStore initialization failed.
47 // When adding a value here, you must increment RESULT_SIZE below.
48 };
49 static const int RESULT_SIZE =
50 10; // Size of the Result enum; used for histograms.
51
52 // Each attachment can have references from sync or model type. Tracking these
53 // references is needed for lifetime management of attachment, it can only be
54 // deleted from the store when it doesn't have references.
55 enum Component {
56 MODEL_TYPE,
57 SYNC,
58 };
59
60 typedef base::Callback<void(const Result&)> InitCallback;
61 typedef base::Callback<void(const Result&,
62 std::unique_ptr<AttachmentMap>,
63 std::unique_ptr<AttachmentIdList>)>
64 ReadCallback;
65 typedef base::Callback<void(const Result&)> WriteCallback;
66 typedef base::Callback<void(const Result&)> DropCallback;
67 typedef base::Callback<void(const Result&,
68 std::unique_ptr<AttachmentMetadataList>)>
69 ReadMetadataCallback;
70
71 ~AttachmentStore();
72
73 // Asynchronously reads the attachments identified by |ids|.
74 //
75 // |callback| will be invoked when finished. AttachmentStore will attempt to
76 // read all attachments specified in ids. If any of the attachments do not
77 // exist or could not be read, |callback|'s Result will be UNSPECIFIED_ERROR.
78 // Callback's AttachmentMap will contain all attachments that were
79 // successfully read, AttachmentIdList will contain attachment ids of
80 // attachments that are unavailable in attachment store, these need to be
81 // downloaded from server.
82 //
83 // Reads on individual attachments are treated atomically; |callback| will not
84 // read only part of an attachment.
85 void Read(const AttachmentIdList& ids, const ReadCallback& callback);
86
87 // Asynchronously writes |attachments| to the store.
88 //
89 // Will not overwrite stored attachments. Attempting to overwrite an
90 // attachment that already exists is not an error.
91 //
92 // |callback| will be invoked when finished. If any of the attachments could
93 // not be written |callback|'s Result will be UNSPECIFIED_ERROR. When this
94 // happens, some or none of the attachments may have been written
95 // successfully.
96 void Write(const AttachmentList& attachments, const WriteCallback& callback);
97
98 // Asynchronously drops |attchments| from this store.
99 //
100 // This does not remove attachments from the server.
101 //
102 // |callback| will be invoked when finished. Attempting to drop an attachment
103 // that does not exist is not an error. If any of the existing attachment
104 // could not be dropped, |callback|'s Result will be UNSPECIFIED_ERROR. When
105 // this happens, some or none of the attachments may have been dropped
106 // successfully.
107 void Drop(const AttachmentIdList& ids, const DropCallback& callback);
108
109 // Asynchronously reads metadata for the attachments identified by |ids|.
110 //
111 // |callback| will be invoked when finished. AttachmentStore will attempt to
112 // read metadata for all attachments specified in ids. If any of the
113 // metadata entries do not exist or could not be read, |callback|'s Result
114 // will be UNSPECIFIED_ERROR.
115 void ReadMetadataById(const AttachmentIdList& ids,
116 const ReadMetadataCallback& callback);
117
118 // Asynchronously reads metadata for all attachments with |component_|
119 // reference in the store.
120 //
121 // |callback| will be invoked when finished. If any of the metadata entries
122 // could not be read, |callback|'s Result will be UNSPECIFIED_ERROR.
123 void ReadMetadata(const ReadMetadataCallback& callback);
124
125 // Given current AttachmentStore (this) creates separate AttachmentStore that
126 // will be used by sync components (AttachmentService). Resulting
127 // AttachmentStore is backed by the same frontend/backend.
128 std::unique_ptr<AttachmentStoreForSync> CreateAttachmentStoreForSync() const;
129
130 // Creates an AttachmentStore backed by in-memory implementation of attachment
131 // store. For now frontend lives on the same thread as backend.
132 static std::unique_ptr<AttachmentStore> CreateInMemoryStore();
133
134 // Creates an AttachmentStore backed by on-disk implementation of attachment
135 // store. Opens corresponding leveldb database located at |path|. All backend
136 // operations are scheduled to |backend_task_runner|. Opening attachment store
137 // is asynchronous, once it finishes |callback| will be called on the thread
138 // that called CreateOnDiskStore. Calling Read/Write/Drop before
139 // initialization completed is allowed. Later if initialization fails these
140 // operations will fail with STORE_INITIALIZATION_FAILED error.
141 static std::unique_ptr<AttachmentStore> CreateOnDiskStore(
142 const base::FilePath& path,
143 const scoped_refptr<base::SequencedTaskRunner>& backend_task_runner,
144 const InitCallback& callback);
145
146 // Creates set of AttachmentStore/AttachmentStoreFrontend instances for tests
147 // that provide their own implementation of AttachmentstoreBackend for
148 // mocking.
149 static std::unique_ptr<AttachmentStore> CreateMockStoreForTest(
150 std::unique_ptr<AttachmentStoreBackend> backend);
151
152 protected:
153 AttachmentStore(const scoped_refptr<AttachmentStoreFrontend>& frontend,
154 Component component);
155
156 const scoped_refptr<AttachmentStoreFrontend>& frontend() { return frontend_; }
157 Component component() const { return component_; }
158
159 private:
160 scoped_refptr<AttachmentStoreFrontend> frontend_;
161 // Modification operations with attachment store will be performed on behalf
162 // of |component_|.
163 const Component component_;
164
165 DISALLOW_COPY_AND_ASSIGN(AttachmentStore);
166 };
167
168 // AttachmentStoreForSync extends AttachmentStore and provides additional
169 // functions necessary for AttachmentService. These are needed when
170 // AttachmentService writes attachment on behalf of model type after download
171 // and takes reference on attachment for the duration of upload.
172 // Model type implementation shouldn't use this interface.
173 class AttachmentStoreForSync : public AttachmentStore {
174 public:
175 ~AttachmentStoreForSync();
176
177 // Asynchronously adds reference from sync to attachments.
178 void SetSyncReference(const AttachmentIdList& ids);
179
180 // Asynchronously adds reference from model type to attachments.
181 // Needed in GetOrDownloadAttachments when attachment is in local store but
182 // doesn't have model type reference.
183 void SetModelTypeReference(const AttachmentIdList& ids);
184
185 // Asynchronously drops sync reference from attachments.
186 void DropSyncReference(const AttachmentIdList& ids);
187
188 // Asynchronously reads metadata for all attachments with |sync_component_|
189 // reference in the store.
190 //
191 // |callback| will be invoked when finished. If any of the metadata entries
192 // could not be read, |callback|'s Result will be UNSPECIFIED_ERROR.
193 void ReadMetadataForSync(const ReadMetadataCallback& callback);
194
195 private:
196 friend class AttachmentStore;
197 AttachmentStoreForSync(const scoped_refptr<AttachmentStoreFrontend>& frontend,
198 Component consumer_component,
199 Component sync_component);
200
201 // |sync_component_| is passed to frontend when sync related operations are
202 // perfromed.
203 const Component sync_component_;
204
205 DISALLOW_COPY_AND_ASSIGN(AttachmentStoreForSync);
206 };
207
208 } // namespace syncer
209
210 #endif // COMPONENTS_SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698