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_; |