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.