[go: nahoru, domu]

Make MediaTransferProtocolManager::GetStorages asynchronous.

This is a preparation work for MTP servicification.

BUG=769630

Change-Id: Ie776850f88adb0593b32b7ba701a83aa746a1a74
Reviewed-on: https://chromium-review.googlesource.com/845501
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#528783}
diff --git a/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.cc b/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.cc
index b9564d08..20d82d14 100644
--- a/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.cc
+++ b/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.cc
@@ -124,7 +124,8 @@
         device::MediaTransferProtocolManager* mtp_manager)
     : mtp_manager_(mtp_manager),
       get_storage_info_func_(&GetStorageInfo),
-      notifications_(receiver) {
+      notifications_(receiver),
+      weak_ptr_factory_(this) {
   mtp_manager_->AddObserver(this);
   EnumerateStorages();
 }
@@ -137,7 +138,8 @@
         GetStorageInfoFunc get_storage_info_func)
     : mtp_manager_(mtp_manager),
       get_storage_info_func_(get_storage_info_func),
-      notifications_(receiver) {}
+      notifications_(receiver),
+      weak_ptr_factory_(this) {}
 
 MediaTransferProtocolDeviceObserverChromeOS::
     ~MediaTransferProtocolDeviceObserverChromeOS() {
@@ -222,8 +224,14 @@
 }
 
 void MediaTransferProtocolDeviceObserverChromeOS::EnumerateStorages() {
+  mtp_manager_->GetStorages(base::BindOnce(
+        &MediaTransferProtocolDeviceObserverChromeOS::OnReceivedStorages,
+        weak_ptr_factory_.GetWeakPtr()));
+}
+
+void MediaTransferProtocolDeviceObserverChromeOS::OnReceivedStorages(
+    const std::vector<std::string>& storages) {
   typedef std::vector<std::string> StorageList;
-  StorageList storages = mtp_manager_->GetStorages();
   for (StorageList::const_iterator storage_iter = storages.begin();
        storage_iter != storages.end(); ++storage_iter) {
     StorageChanged(true, *storage_iter);
diff --git a/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.h b/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.h
index a004426f..a939078 100644
--- a/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.h
+++ b/components/storage_monitor/media_transfer_protocol_device_observer_chromeos.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
 #include "components/storage_monitor/storage_monitor.h"
 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h"
@@ -67,6 +68,9 @@
   // Enumerate existing mtp storage devices.
   void EnumerateStorages();
 
+  // The callback for EnumerateStorages().
+  void OnReceivedStorages(const std::vector<std::string>& storages);
+
   // Find the |storage_map_| key for the record with this |device_id|. Returns
   // true on success, false on failure.
   bool GetLocationForDeviceId(const std::string& device_id,
@@ -87,6 +91,9 @@
   // Guaranteed to outlive this class.
   StorageMonitor::Receiver* const notifications_;
 
+  base::WeakPtrFactory<MediaTransferProtocolDeviceObserverChromeOS>
+      weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(MediaTransferProtocolDeviceObserverChromeOS);
 };
 
diff --git a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
index 16c5f5a..8ff26d77 100644
--- a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
+++ b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
@@ -18,10 +18,11 @@
 void TestMediaTransferProtocolManagerChromeOS::RemoveObserver(
     Observer* observer) {}
 
-const std::vector<std::string>
-TestMediaTransferProtocolManagerChromeOS::GetStorages() const {
-  return std::vector<std::string>();
+void TestMediaTransferProtocolManagerChromeOS::GetStorages(
+    GetStoragesCallback callback) const {
+  std::move(callback).Run(std::vector<std::string>());
 }
+
 const device::mojom::MtpStorageInfo*
 TestMediaTransferProtocolManagerChromeOS::GetStorageInfo(
     const std::string& storage_name) const {
diff --git a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
index 25e826f..72ec9a2b 100644
--- a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
+++ b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
@@ -24,7 +24,7 @@
   // device::MediaTransferProtocolManager implementation.
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
-  const std::vector<std::string> GetStorages() const override;
+  void GetStorages(GetStoragesCallback callback) const override;
   const device::mojom::MtpStorageInfo* GetStorageInfo(
       const std::string& storage_name) const override;
   void GetStorageInfoFromDevice(
diff --git a/device/media_transfer_protocol/media_transfer_protocol_manager.cc b/device/media_transfer_protocol/media_transfer_protocol_manager.cc
index e235333e..189ab6a 100644
--- a/device/media_transfer_protocol/media_transfer_protocol_manager.cc
+++ b/device/media_transfer_protocol/media_transfer_protocol_manager.cc
@@ -90,13 +90,13 @@
   }
 
   // MediaTransferProtocolManager override.
-  const std::vector<std::string> GetStorages() const override {
+  void GetStorages(GetStoragesCallback callback) const override {
     DCHECK(thread_checker_.CalledOnValidThread());
     std::vector<std::string> storages;
     storages.reserve(storage_info_map_.size());
     for (const auto& info : storage_info_map_)
       storages.push_back(info.first);
-    return storages;
+    std::move(callback).Run(storages);
   }
 
   // MediaTransferProtocolManager override.
diff --git a/device/media_transfer_protocol/media_transfer_protocol_manager.h b/device/media_transfer_protocol/media_transfer_protocol_manager.h
index 9d1b39e..a9c7ebd30 100644
--- a/device/media_transfer_protocol/media_transfer_protocol_manager.h
+++ b/device/media_transfer_protocol/media_transfer_protocol_manager.h
@@ -28,6 +28,11 @@
 // Other classes can add themselves as observers.
 class MediaTransferProtocolManager {
  public:
+  // A callback to handle the result of GetStorages().
+  // The argument is the returned vector of available MTP storage names.
+  using GetStoragesCallback =
+      base::OnceCallback<void(const std::vector<std::string>& storages)>;
+
   // A callback to handle the result of GetStorageInfoFromDevice.
   // The first argument is the returned storage info.
   // The second argument is true if there was an error.
@@ -101,8 +106,8 @@
   // Removes an observer.
   virtual void RemoveObserver(Observer* observer) = 0;
 
-  // Returns a vector of available MTP storages.
-  virtual const std::vector<std::string> GetStorages() const = 0;
+  // Gets all available MTP storages and runs |callback|.
+  virtual void GetStorages(GetStoragesCallback callback) const = 0;
 
   // On success, returns the metadata for |storage_name|.
   // Otherwise returns NULL.