| Index: sync/api/attachments/attachment_service_proxy.h
|
| diff --git a/sync/api/attachments/attachment_service_proxy.h b/sync/api/attachments/attachment_service_proxy.h
|
| index 5bec1b3206ab8007e3937d5df00c364a6473b83b..70856255cfa56d43b445468f7c650186ea858a7b 100644
|
| --- a/sync/api/attachments/attachment_service_proxy.h
|
| +++ b/sync/api/attachments/attachment_service_proxy.h
|
| @@ -20,7 +20,8 @@ namespace syncer {
|
| class SyncData;
|
|
|
| // AttachmentServiceProxy wraps an AttachmentService allowing multiple threads
|
| -// to share the wrapped AttachmentService.
|
| +// to share the wrapped AttachmentService and invoke its methods in the
|
| +// appropriate thread.
|
| //
|
| // Callbacks passed to methods on this class will be invoked in the same thread
|
| // from which the method was called.
|
| @@ -29,10 +30,10 @@ class SyncData;
|
| // holds a WeakPtr to the wrapped object. Once the the wrapped object is
|
| // destroyed, method calls on this object will be no-ops.
|
| //
|
| -// Users of this class should take care to destroy the wrapped object on the
|
| -// correct thread (wrapped_task_runner).
|
| +// Users of this class should take care to destroy the wrapped object on the
|
| +// correct thread (wrapped_task_runner).
|
| //
|
| -// This class is thread-safe.
|
| +// This class is thread-safe and is designed to be passed by const-ref.
|
| class SYNC_EXPORT AttachmentServiceProxy : public AttachmentService {
|
| public:
|
| // Default copy and assignment are welcome.
|
| @@ -42,16 +43,19 @@ class SYNC_EXPORT AttachmentServiceProxy : public AttachmentService {
|
|
|
| // Construct an AttachmentServiceProxy that forwards calls to |wrapped| on the
|
| // |wrapped_task_runner| thread.
|
| + //
|
| + // Note, this object does not own |wrapped|. When |wrapped| is destroyed,
|
| + // calls to this object become no-ops.
|
| AttachmentServiceProxy(
|
| const scoped_refptr<base::SequencedTaskRunner>& wrapped_task_runner,
|
| - base::WeakPtr<syncer::AttachmentService> wrapped);
|
| + const base::WeakPtr<syncer::AttachmentService>& wrapped);
|
|
|
| virtual ~AttachmentServiceProxy();
|
|
|
| // AttachmentService implementation.
|
| - virtual void GetOrDownloadAttachments(const AttachmentIdList& attachment_ids,
|
| - const GetOrDownloadCallback& callback)
|
| - OVERRIDE;
|
| + virtual void GetOrDownloadAttachments(
|
| + const AttachmentIdList& attachment_ids,
|
| + const GetOrDownloadCallback& callback) OVERRIDE;
|
| virtual void DropAttachments(const AttachmentIdList& attachment_ids,
|
| const DropCallback& callback) OVERRIDE;
|
| virtual void OnSyncDataAdd(const SyncData& sync_data) OVERRIDE;
|
| @@ -59,10 +63,55 @@ class SYNC_EXPORT AttachmentServiceProxy : public AttachmentService {
|
| virtual void OnSyncDataUpdate(const AttachmentIdList& old_attachment_ids,
|
| const SyncData& updated_sync_data) OVERRIDE;
|
|
|
| + protected:
|
| + // Core does the work of proxying calls to AttachmentService methods from one
|
| + // thread to another so AttachmentServiceProxy can be an easy-to-use,
|
| + // non-ref-counted A ref-counted class.
|
| + //
|
| + // Callback from AttachmentService are proxied back using free functions
|
| + // defined in the .cc file (ProxyFooCallback functions).
|
| + //
|
| + // Core is ref-counted because we want to allow AttachmentServiceProxy to be
|
| + // copy-constructable while allowing for different implementations of Core
|
| + // (e.g. one type of core might own the wrapped AttachmentService).
|
| + //
|
| + // Calls to objects of this class become no-ops once its wrapped object is
|
| + // destroyed.
|
| + class SYNC_EXPORT Core : public AttachmentService,
|
| + public base::RefCountedThreadSafe<Core> {
|
| + public:
|
| + // Construct an AttachmentServiceProxyCore that forwards calls to |wrapped|.
|
| + Core(const base::WeakPtr<syncer::AttachmentService>& wrapped);
|
| +
|
| + // AttachmentService implementation.
|
| + virtual void GetOrDownloadAttachments(
|
| + const AttachmentIdList& attachment_ids,
|
| + const GetOrDownloadCallback& callback) OVERRIDE;
|
| + virtual void DropAttachments(const AttachmentIdList& attachment_ids,
|
| + const DropCallback& callback) OVERRIDE;
|
| + virtual void OnSyncDataAdd(const SyncData& sync_data) OVERRIDE;
|
| + virtual void OnSyncDataDelete(const SyncData& sync_data) OVERRIDE;
|
| + virtual void OnSyncDataUpdate(const AttachmentIdList& old_attachment_ids,
|
| + const SyncData& updated_sync_data) OVERRIDE;
|
| +
|
| + protected:
|
| + friend class base::RefCountedThreadSafe<Core>;
|
| + virtual ~Core();
|
| +
|
| + private:
|
| + base::WeakPtr<AttachmentService> wrapped_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Core);
|
| + };
|
| +
|
| + // Used in tests to create an AttachmentServiceProxy with a custom Core.
|
| + AttachmentServiceProxy(
|
| + const scoped_refptr<base::SequencedTaskRunner>& wrapped_task_runner,
|
| + const scoped_refptr<Core>& core);
|
| +
|
| private:
|
| scoped_refptr<base::SequencedTaskRunner> wrapped_task_runner_;
|
| - // wrapped_ must only be dereferenced on the wrapped_task_runner_ thread.
|
| - base::WeakPtr<AttachmentService> wrapped_;
|
| + scoped_refptr<Core> core_;
|
| };
|
|
|
| } // namespace syncer
|
|
|