Chromium Code Reviews| Index: device/media_transfer_protocol/media_transfer_protocol_manager.cc |
| =================================================================== |
| --- device/media_transfer_protocol/media_transfer_protocol_manager.cc (revision 197157) |
| +++ device/media_transfer_protocol/media_transfer_protocol_manager.cc (working copy) |
| @@ -11,14 +11,17 @@ |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| +#include "base/location.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/observer_list.h" |
| #include "base/sequenced_task_runner.h" |
| #include "base/stl_util.h" |
| #include "base/threading/thread_checker.h" |
| +#include "dbus/object_proxy.h" |
| #include "device/media_transfer_protocol/media_transfer_protocol_daemon_client.h" |
| #include "device/media_transfer_protocol/mtp_file_entry.pb.h" |
| #include "device/media_transfer_protocol/mtp_storage_info.pb.h" |
| +#include "third_party/cros_system_api/dbus/service_constants.h" |
| #if defined(OS_CHROMEOS) |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| @@ -32,6 +35,17 @@ |
| MediaTransferProtocolManager* g_media_transfer_protocol_manager = NULL; |
| +typedef base::Callback<void(dbus::Bus*, bool)> ServiceHasOwnerCallback; |
| + |
| +void CheckMtpdServiceHasOwnerOnDBusThread( |
| + scoped_refptr<dbus::Bus> bus, |
| + const ServiceHasOwnerCallback& reply_task) { |
| + bool has_owner = |
| + dbus::ObjectProxy::ServiceHasOwner(bus, mtpd::kMtpdServiceName); |
| + bus->PostTaskToOriginThread(FROM_HERE, |
| + base::Bind(reply_task, bus, has_owner)); |
| +} |
| + |
| // The MediaTransferProtocolManager implementation. |
| class MediaTransferProtocolManagerImpl : public MediaTransferProtocolManager { |
| public: |
| @@ -57,17 +71,14 @@ |
| #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)); |
| + ServiceHasOwnerCallback reply_task = |
| + base::Bind(&MediaTransferProtocolManagerImpl::FinishSetupOnOriginThread, |
| + weak_ptr_factory_.GetWeakPtr()); |
| + base::Closure dbus_task = base::Bind(&CheckMtpdServiceHasOwnerOnDBusThread, |
| + make_scoped_refptr(bus), |
| + reply_task); |
| + bus->PostTaskToDBusThread(FROM_HERE, dbus_task); |
|
satorux1
2013/04/30 01:53:10
This is awkward. I think we should provide an asyn
|
| } |
| virtual ~MediaTransferProtocolManagerImpl() { |
| @@ -401,6 +412,31 @@ |
| get_file_info_callbacks_.pop(); |
| } |
| + void FinishSetupOnOriginThread(dbus::Bus* bus, bool service_has_owner) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + if (!service_has_owner) { |
| +#if !defined(OS_CHROMEOS) |
| + // |session_bus_| will not get used. Manually shut it down. |
| + session_bus_->PostTaskToDBusThread( |
| + FROM_HERE, base::Bind(&dbus::Bus::ShutdownAndBlock, session_bus_)); |
| +#endif |
| + return; |
| + } |
| + |
| + 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)); |
| + } |
| + |
| // Mtpd DBus client. |
| scoped_ptr<MediaTransferProtocolDaemonClient> mtp_client_; |