| Index: sync/api/attachments/attachment_store.h
|
| diff --git a/sync/api/attachments/attachment_store.h b/sync/api/attachments/attachment_store.h
|
| index b183de13d8bc65f0bce13929b7c171608ab767e9..e8d8f5c718c923b2328fbbaf68f0996f3e61c416 100644
|
| --- a/sync/api/attachments/attachment_store.h
|
| +++ b/sync/api/attachments/attachment_store.h
|
| @@ -15,14 +15,13 @@
|
|
|
| namespace base {
|
| class FilePath;
|
| -class RefCountedMemory;
|
| class SequencedTaskRunner;
|
| } // namespace base
|
|
|
| namespace syncer {
|
|
|
| -class Attachment;
|
| -class AttachmentId;
|
| +class AttachmentStoreFrontend;
|
| +class AttachmentStoreBackend;
|
|
|
| // AttachmentStore is a place to locally store and access Attachments.
|
| //
|
| @@ -32,8 +31,7 @@ class AttachmentId;
|
| // implementations.
|
| // Destroying this object does not necessarily cancel outstanding async
|
| // operations. If you need cancel like semantics, use WeakPtr in the callbacks.
|
| -class SYNC_EXPORT AttachmentStore
|
| - : public base::RefCountedThreadSafe<AttachmentStore> {
|
| +class SYNC_EXPORT AttachmentStore {
|
| public:
|
| // TODO(maniscalco): Consider udpating Read and Write methods to support
|
| // resumable transfers (bug 353292).
|
| @@ -49,6 +47,14 @@ class SYNC_EXPORT AttachmentStore
|
| static const int RESULT_SIZE =
|
| 10; // Size of the Result enum; used for histograms.
|
|
|
| + // Each attachment can have references from sync or model type. Tracking these
|
| + // references is needed for lifetime management of attachment, it can only be
|
| + // deleted from the store when it doesn't have references.
|
| + enum AttachmentReferrer {
|
| + MODEL_TYPE,
|
| + SYNC,
|
| + };
|
| +
|
| typedef base::Callback<void(const Result&)> InitCallback;
|
| typedef base::Callback<void(const Result&,
|
| scoped_ptr<AttachmentMap>,
|
| @@ -59,15 +65,7 @@ class SYNC_EXPORT AttachmentStore
|
| scoped_ptr<AttachmentMetadataList>)>
|
| ReadMetadataCallback;
|
|
|
| - AttachmentStore();
|
| -
|
| - // Asynchronously initializes attachment store.
|
| - //
|
| - // This method should not be called by consumer of this interface. It is
|
| - // called by factory methods in AttachmentStore class. When initialization is
|
| - // complete |callback| is invoked with result, in case of failure result is
|
| - // UNSPECIFIED_ERROR.
|
| - virtual void Init(const InitCallback& callback) = 0;
|
| + ~AttachmentStore();
|
|
|
| // Asynchronously reads the attachments identified by |ids|.
|
| //
|
| @@ -81,8 +79,7 @@ class SYNC_EXPORT AttachmentStore
|
| //
|
| // Reads on individual attachments are treated atomically; |callback| will not
|
| // read only part of an attachment.
|
| - virtual void Read(const AttachmentIdList& ids,
|
| - const ReadCallback& callback) = 0;
|
| + void Read(const AttachmentIdList& ids, const ReadCallback& callback);
|
|
|
| // Asynchronously writes |attachments| to the store.
|
| //
|
| @@ -93,8 +90,7 @@ class SYNC_EXPORT AttachmentStore
|
| // not be written |callback|'s Result will be UNSPECIFIED_ERROR. When this
|
| // happens, some or none of the attachments may have been written
|
| // successfully.
|
| - virtual void Write(const AttachmentList& attachments,
|
| - const WriteCallback& callback) = 0;
|
| + void Write(const AttachmentList& attachments, const WriteCallback& callback);
|
|
|
| // Asynchronously drops |attchments| from this store.
|
| //
|
| @@ -105,8 +101,7 @@ class SYNC_EXPORT AttachmentStore
|
| // could not be dropped, |callback|'s Result will be UNSPECIFIED_ERROR. When
|
| // this happens, some or none of the attachments may have been dropped
|
| // successfully.
|
| - virtual void Drop(const AttachmentIdList& ids,
|
| - const DropCallback& callback) = 0;
|
| + void Drop(const AttachmentIdList& ids, const DropCallback& callback);
|
|
|
| // Asynchronously reads metadata for the attachments identified by |ids|.
|
| //
|
| @@ -114,72 +109,52 @@ class SYNC_EXPORT AttachmentStore
|
| // read metadata for all attachments specified in ids. If any of the
|
| // metadata entries do not exist or could not be read, |callback|'s Result
|
| // will be UNSPECIFIED_ERROR.
|
| - virtual void ReadMetadata(const AttachmentIdList& ids,
|
| - const ReadMetadataCallback& callback) = 0;
|
| + void ReadMetadata(const AttachmentIdList& ids,
|
| + const ReadMetadataCallback& callback);
|
|
|
| // Asynchronously reads metadata for all attachments in the store.
|
| //
|
| // |callback| will be invoked when finished. If any of the metadata entries
|
| // could not be read, |callback|'s Result will be UNSPECIFIED_ERROR.
|
| - virtual void ReadAllMetadata(const ReadMetadataCallback& callback) = 0;
|
| -
|
| - // Creates an AttachmentStoreHandle backed by in-memory implementation of
|
| - // attachment store. For now frontend lives on the same thread as backend.
|
| - static scoped_refptr<AttachmentStore> CreateInMemoryStore();
|
| -
|
| - // Creates an AttachmentStoreHandle backed by on-disk implementation of
|
| - // attachment store. Opens corresponding leveldb database located at |path|.
|
| - // All backend operations are scheduled to |backend_task_runner|. Opening
|
| - // attachment store is asynchronous, once it finishes |callback| will be
|
| - // called on the thread that called CreateOnDiskStore. Calling Read/Write/Drop
|
| - // before initialization completed is allowed. Later if initialization fails
|
| - // these operations will fail with STORE_INITIALIZATION_FAILED error.
|
| - static scoped_refptr<AttachmentStore> CreateOnDiskStore(
|
| + void ReadAllMetadata(const ReadMetadataCallback& callback);
|
| +
|
| + // Given current AttachmentStore (this) creates separate AttachmentStore that
|
| + // will be used by sync components (AttachmentService). Resulting
|
| + // AttachmentStore is backed by the same frontend/backend.
|
| + scoped_ptr<AttachmentStore> CreateAttachmentStoreForSync() const;
|
| +
|
| + // Creates an AttachmentStore backed by in-memory implementation of attachment
|
| + // store. For now frontend lives on the same thread as backend.
|
| + static scoped_ptr<AttachmentStore> CreateInMemoryStore();
|
| +
|
| + // Creates an AttachmentStore backed by on-disk implementation of attachment
|
| + // store. Opens corresponding leveldb database located at |path|. All backend
|
| + // operations are scheduled to |backend_task_runner|. Opening attachment store
|
| + // is asynchronous, once it finishes |callback| will be called on the thread
|
| + // that called CreateOnDiskStore. Calling Read/Write/Drop before
|
| + // initialization completed is allowed. Later if initialization fails these
|
| + // operations will fail with STORE_INITIALIZATION_FAILED error.
|
| + static scoped_ptr<AttachmentStore> CreateOnDiskStore(
|
| const base::FilePath& path,
|
| const scoped_refptr<base::SequencedTaskRunner>& backend_task_runner,
|
| const InitCallback& callback);
|
|
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<AttachmentStore>;
|
| - virtual ~AttachmentStore();
|
| -};
|
| -
|
| -// Interface for AttachmentStore backends.
|
| -//
|
| -// AttachmentStoreBackend provides interface for different backends (on-disk,
|
| -// in-memory). Factory methods in AttachmentStore create corresponding backend
|
| -// and pass reference to AttachmentStoreHandle.
|
| -// All functions in AttachmentStoreBackend mirror corresponding functions in
|
| -// AttachmentStore.
|
| -// All callbacks and result codes are used directly from AttachmentStore.
|
| -// AttachmentStoreHandle only passes callbacks and results, there is no need to
|
| -// declare separate set.
|
| -class SYNC_EXPORT AttachmentStoreBackend {
|
| - public:
|
| - explicit AttachmentStoreBackend(
|
| - const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner);
|
| - virtual ~AttachmentStoreBackend();
|
| - virtual void Init(const AttachmentStore::InitCallback& callback) = 0;
|
| - virtual void Read(const AttachmentIdList& ids,
|
| - const AttachmentStore::ReadCallback& callback) = 0;
|
| - virtual void Write(const AttachmentList& attachments,
|
| - const AttachmentStore::WriteCallback& callback) = 0;
|
| - virtual void Drop(const AttachmentIdList& ids,
|
| - const AttachmentStore::DropCallback& callback) = 0;
|
| - virtual void ReadMetadata(
|
| - const AttachmentIdList& ids,
|
| - const AttachmentStore::ReadMetadataCallback& callback) = 0;
|
| - virtual void ReadAllMetadata(
|
| - const AttachmentStore::ReadMetadataCallback& callback) = 0;
|
| -
|
| - protected:
|
| - // Helper function to post callback on callback_task_runner.
|
| - void PostCallback(const base::Closure& callback);
|
| + // Creates set of AttachmentStore/AttachmentStoreFrontend instances for tests
|
| + // that provide their own implementation of AttachmentstoreBackend for
|
| + // mocking.
|
| + static scoped_ptr<AttachmentStore> CreateMockStoreForTest(
|
| + scoped_ptr<AttachmentStoreBackend> backend);
|
|
|
| private:
|
| - scoped_refptr<base::SequencedTaskRunner> callback_task_runner_;
|
| + AttachmentStore(const scoped_refptr<AttachmentStoreFrontend>& frontend,
|
| + AttachmentReferrer referrer);
|
| +
|
| + scoped_refptr<AttachmentStoreFrontend> frontend_;
|
| + // Modification operations with attachment store will be performed on behalf
|
| + // of |referrer_|.
|
| + const AttachmentReferrer referrer_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(AttachmentStoreBackend);
|
| + DISALLOW_COPY_AND_ASSIGN(AttachmentStore);
|
| };
|
|
|
| } // namespace syncer
|
|
|