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 |