Index: chrome/browser/media_transfer_protocol/media_transfer_protocol_manager.cc |
diff --git a/chrome/browser/media_transfer_protocol/media_transfer_protocol_manager.cc b/chrome/browser/media_transfer_protocol/media_transfer_protocol_manager.cc |
deleted file mode 100644 |
index dbb246fb9153d48ffbca4e75b1f5507b1a5654b6..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media_transfer_protocol/media_transfer_protocol_manager.cc |
+++ /dev/null |
@@ -1,453 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/media_transfer_protocol/media_transfer_protocol_manager.h" |
- |
-#include <map> |
-#include <queue> |
-#include <set> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/observer_list.h" |
-#include "base/stl_util.h" |
-#include "chrome/browser/media_transfer_protocol/media_transfer_protocol_daemon_client.h" |
-#include "chrome/browser/media_transfer_protocol/mtp_file_entry.pb.h" |
-#include "chrome/browser/media_transfer_protocol/mtp_storage_info.pb.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "content/public/browser/browser_thread.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#else |
-#include "dbus/bus.h" |
-#endif |
- |
-using content::BrowserThread; |
- |
-namespace chrome { |
- |
-namespace { |
- |
-MediaTransferProtocolManager* g_media_transfer_protocol_manager = NULL; |
- |
-// The MediaTransferProtocolManager implementation. |
-class MediaTransferProtocolManagerImpl : public MediaTransferProtocolManager { |
- public: |
- MediaTransferProtocolManagerImpl() : weak_ptr_factory_(this) { |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) |
- return; |
- |
- dbus::Bus* bus = NULL; |
-#if defined(OS_CHROMEOS) |
- chromeos::DBusThreadManager* dbus_thread_manager = |
- chromeos::DBusThreadManager::Get(); |
- bus = dbus_thread_manager->GetSystemBus(); |
- if (!bus) |
- return; |
-#else |
- dbus::Bus::Options options; |
- options.bus_type = dbus::Bus::SYSTEM; |
- options.connection_type = dbus::Bus::PRIVATE; |
- options.dbus_thread_message_loop_proxy = |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE); |
- session_bus_ = new dbus::Bus(options); |
- bus = session_bus_.get(); |
-#endif |
- |
- DCHECK(bus); |
- mtp_client_.reset( |
- MediaTransferProtocolDaemonClient::Create(bus, false /* not stub */)); |
- |
- // Set up signals and start initializing |storage_info_map_|. |
- mtp_client_->SetUpConnections( |
- base::Bind(&MediaTransferProtocolManagerImpl::OnStorageChanged, |
- weak_ptr_factory_.GetWeakPtr())); |
- mtp_client_->EnumerateStorages( |
- base::Bind(&MediaTransferProtocolManagerImpl::OnEnumerateStorages, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&base::DoNothing)); |
- } |
- |
- virtual ~MediaTransferProtocolManagerImpl() { |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void AddObserver(Observer* observer) OVERRIDE { |
- observers_.AddObserver(observer); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void RemoveObserver(Observer* observer) OVERRIDE { |
- observers_.RemoveObserver(observer); |
- } |
- |
- // MediaTransferProtocolManager override. |
- const std::vector<std::string> GetStorages() const OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- std::vector<std::string> storages; |
- for (StorageInfoMap::const_iterator it = storage_info_map_.begin(); |
- it != storage_info_map_.end(); |
- ++it) { |
- storages.push_back(it->first); |
- } |
- return storages; |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual const MtpStorageInfo* GetStorageInfo( |
- const std::string& storage_name) const OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- StorageInfoMap::const_iterator it = storage_info_map_.find(storage_name); |
- if (it == storage_info_map_.end()) |
- return NULL; |
- return &it->second; |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void OpenStorage(const std::string& storage_name, |
- const std::string& mode, |
- const OpenStorageCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(storage_info_map_, storage_name)) { |
- callback.Run("", true); |
- return; |
- } |
- open_storage_callbacks_.push(callback); |
- mtp_client_->OpenStorage( |
- storage_name, |
- mode, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnOpenStorage, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnOpenStorageError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void CloseStorage(const std::string& storage_handle, |
- const CloseStorageCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(true); |
- return; |
- } |
- close_storage_callbacks_.push(std::make_pair(callback, storage_handle)); |
- mtp_client_->CloseStorage( |
- storage_handle, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnCloseStorage, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnCloseStorageError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void ReadDirectoryByPath( |
- const std::string& storage_handle, |
- const std::string& path, |
- const ReadDirectoryCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(std::vector<MtpFileEntry>(), true); |
- return; |
- } |
- read_directory_callbacks_.push(callback); |
- mtp_client_->ReadDirectoryByPath( |
- storage_handle, |
- path, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadDirectory, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadDirectoryError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void ReadDirectoryById( |
- const std::string& storage_handle, |
- uint32 file_id, |
- const ReadDirectoryCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(std::vector<MtpFileEntry>(), true); |
- return; |
- } |
- read_directory_callbacks_.push(callback); |
- mtp_client_->ReadDirectoryById( |
- storage_handle, |
- file_id, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadDirectory, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadDirectoryError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void ReadFileChunkByPath(const std::string& storage_handle, |
- const std::string& path, |
- uint32 offset, |
- uint32 count, |
- const ReadFileCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(std::string(), true); |
- return; |
- } |
- read_file_callbacks_.push(callback); |
- mtp_client_->ReadFileChunkByPath( |
- storage_handle, path, offset, count, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadFile, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadFileError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // MediaTransferProtocolManager override. |
- virtual void ReadFileChunkById(const std::string& storage_handle, |
- uint32 file_id, |
- uint32 offset, |
- uint32 count, |
- const ReadFileCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(std::string(), true); |
- return; |
- } |
- read_file_callbacks_.push(callback); |
- mtp_client_->ReadFileChunkById( |
- storage_handle, file_id, offset, count, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadFile, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnReadFileError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- virtual void GetFileInfoByPath(const std::string& storage_handle, |
- const std::string& path, |
- const GetFileInfoCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(MtpFileEntry(), true); |
- return; |
- } |
- get_file_info_callbacks_.push(callback); |
- mtp_client_->GetFileInfoByPath( |
- storage_handle, |
- path, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetFileInfo, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetFileInfoError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- virtual void GetFileInfoById(const std::string& storage_handle, |
- uint32 file_id, |
- const GetFileInfoCallback& callback) OVERRIDE { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!ContainsKey(handles_, storage_handle)) { |
- callback.Run(MtpFileEntry(), true); |
- return; |
- } |
- get_file_info_callbacks_.push(callback); |
- mtp_client_->GetFileInfoById( |
- storage_handle, |
- file_id, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetFileInfo, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetFileInfoError, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- private: |
- // Map of storage names to storage info. |
- typedef std::map<std::string, MtpStorageInfo> StorageInfoMap; |
- // Callback queues - DBus communication is in-order, thus callbacks are |
- // received in the same order as the requests. |
- typedef std::queue<OpenStorageCallback> OpenStorageCallbackQueue; |
- // (callback, handle) |
- typedef std::queue<std::pair<CloseStorageCallback, std::string> |
- > CloseStorageCallbackQueue; |
- typedef std::queue<ReadDirectoryCallback> ReadDirectoryCallbackQueue; |
- typedef std::queue<ReadFileCallback> ReadFileCallbackQueue; |
- typedef std::queue<GetFileInfoCallback> GetFileInfoCallbackQueue; |
- |
- void OnStorageChanged(bool is_attach, const std::string& storage_name) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (is_attach) { |
- mtp_client_->GetStorageInfo( |
- storage_name, |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetStorageInfo, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&base::DoNothing)); |
- return; |
- } |
- |
- // Detach case. |
- StorageInfoMap::iterator it = storage_info_map_.find(storage_name); |
- if (it == storage_info_map_.end()) { |
- // This might happen during initialization when |storage_info_map_| has |
- // not been fully populated yet? |
- return; |
- } |
- storage_info_map_.erase(it); |
- FOR_EACH_OBSERVER(Observer, |
- observers_, |
- StorageChanged(false /* detach */, storage_name)); |
- } |
- |
- void OnEnumerateStorages(const std::vector<std::string>& storage_names) { |
- for (size_t i = 0; i < storage_names.size(); ++i) { |
- mtp_client_->GetStorageInfo( |
- storage_names[i], |
- base::Bind(&MediaTransferProtocolManagerImpl::OnGetStorageInfo, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::Bind(&base::DoNothing)); |
- } |
- } |
- |
- void OnGetStorageInfo(const MtpStorageInfo& storage_info) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- const std::string& storage_name = storage_info.storage_name(); |
- if (ContainsKey(storage_info_map_, storage_name)) { |
- // This should not happen, since MediaTransferProtocolManagerImpl should |
- // only call EnumerateStorages() once, which populates |storage_info_map_| |
- // with the already-attached devices. |
- // After that, all incoming signals are either for new storage |
- // attachments, which should not be in |storage_info_map_|, or for |
- // storage detachements, which do not add to |storage_info_map_|. |
- NOTREACHED(); |
- return; |
- } |
- |
- // New storage. Add it and let the observers know. |
- storage_info_map_.insert(std::make_pair(storage_name, storage_info)); |
- FOR_EACH_OBSERVER(Observer, |
- observers_, |
- StorageChanged(true /* is attach */, storage_name)); |
- } |
- |
- void OnOpenStorage(const std::string& handle) { |
- if (!ContainsKey(handles_, handle)) { |
- handles_.insert(handle); |
- open_storage_callbacks_.front().Run(handle, false); |
- } else { |
- NOTREACHED(); |
- open_storage_callbacks_.front().Run("", true); |
- } |
- open_storage_callbacks_.pop(); |
- } |
- |
- void OnOpenStorageError() { |
- open_storage_callbacks_.front().Run("", true); |
- open_storage_callbacks_.pop(); |
- } |
- |
- void OnCloseStorage() { |
- const std::string& handle = close_storage_callbacks_.front().second; |
- if (ContainsKey(handles_, handle)) { |
- handles_.erase(handle); |
- close_storage_callbacks_.front().first.Run(false); |
- } else { |
- NOTREACHED(); |
- close_storage_callbacks_.front().first.Run(true); |
- } |
- close_storage_callbacks_.pop(); |
- } |
- |
- void OnCloseStorageError() { |
- close_storage_callbacks_.front().first.Run(true); |
- close_storage_callbacks_.pop(); |
- } |
- |
- void OnReadDirectory(const std::vector<MtpFileEntry>& file_entries) { |
- read_directory_callbacks_.front().Run(file_entries, false); |
- read_directory_callbacks_.pop(); |
- } |
- |
- void OnReadDirectoryError() { |
- read_directory_callbacks_.front().Run(std::vector<MtpFileEntry>(), true); |
- read_directory_callbacks_.pop(); |
- } |
- |
- void OnReadFile(const std::string& data) { |
- read_file_callbacks_.front().Run(data, false); |
- read_file_callbacks_.pop(); |
- } |
- |
- void OnReadFileError() { |
- read_file_callbacks_.front().Run(std::string(), true); |
- read_file_callbacks_.pop(); |
- } |
- |
- void OnGetFileInfo(const MtpFileEntry& entry) { |
- get_file_info_callbacks_.front().Run(entry, false); |
- get_file_info_callbacks_.pop(); |
- } |
- |
- void OnGetFileInfoError() { |
- get_file_info_callbacks_.front().Run(MtpFileEntry(), true); |
- get_file_info_callbacks_.pop(); |
- } |
- |
- // Mtpd DBus client. |
- scoped_ptr<chrome::MediaTransferProtocolDaemonClient> mtp_client_; |
- |
-#if !defined(OS_CHROMEOS) |
- // And a D-Bus session for talking to mtpd. |
- scoped_refptr<dbus::Bus> session_bus_; |
-#endif |
- |
- // Device attachment / detachment observers. |
- ObserverList<Observer> observers_; |
- |
- base::WeakPtrFactory<MediaTransferProtocolManagerImpl> weak_ptr_factory_; |
- |
- // Everything below is only accessed on the UI thread. |
- |
- // Map to keep track of attached storages by name. |
- StorageInfoMap storage_info_map_; |
- |
- // Set of open storage handles. |
- std::set<std::string> handles_; |
- |
- // Queued callbacks. |
- OpenStorageCallbackQueue open_storage_callbacks_; |
- CloseStorageCallbackQueue close_storage_callbacks_; |
- ReadDirectoryCallbackQueue read_directory_callbacks_; |
- ReadFileCallbackQueue read_file_callbacks_; |
- GetFileInfoCallbackQueue get_file_info_callbacks_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MediaTransferProtocolManagerImpl); |
-}; |
- |
-} // namespace |
- |
-// static |
-void MediaTransferProtocolManager::Initialize() { |
- if (g_media_transfer_protocol_manager) { |
- LOG(WARNING) << "MediaTransferProtocolManager was already initialized"; |
- return; |
- } |
- g_media_transfer_protocol_manager = new MediaTransferProtocolManagerImpl(); |
- VLOG(1) << "MediaTransferProtocolManager initialized"; |
-} |
- |
-// static |
-void MediaTransferProtocolManager::Shutdown() { |
- if (!g_media_transfer_protocol_manager) { |
- LOG(WARNING) << "MediaTransferProtocolManager::Shutdown() called with " |
- << "NULL manager"; |
- return; |
- } |
- delete g_media_transfer_protocol_manager; |
- g_media_transfer_protocol_manager = NULL; |
- VLOG(1) << "MediaTransferProtocolManager Shutdown completed"; |
-} |
- |
-// static |
-MediaTransferProtocolManager* MediaTransferProtocolManager::GetInstance() { |
- return g_media_transfer_protocol_manager; |
-} |
- |
-} // namespace chrome |