Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: device/media_transfer_protocol/media_transfer_protocol_manager.cc

Issue 14568005: Add a method to check if a D-Bus service has an owner. Use it for mtpd. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« dbus/object_proxy.cc ('K') | « dbus/object_proxy.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« dbus/object_proxy.cc ('K') | « dbus/object_proxy.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698