diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-26 06:40:04 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-26 06:40:04 +0000 |
commit | 92616756ba82cf63f231013ab1c6b1a69969194c (patch) | |
tree | d79dcb81dcbdfc7738184720d2cab8098a49fc2c /dbus | |
parent | d354c37414debc236df2ce0a1ff281b1c64e2b00 (diff) | |
download | chromium_src-92616756ba82cf63f231013ab1c6b1a69969194c.zip chromium_src-92616756ba82cf63f231013ab1c6b1a69969194c.tar.gz chromium_src-92616756ba82cf63f231013ab1c6b1a69969194c.tar.bz2 |
dbus: Rewrite ObjectProxy::ConnectToSignal with PostTaskAndReplyWithResult
BUG=None
TEST=dbus_unittests
R=satorux@chromium.org
Review URL: https://codereview.chromium.org/24557002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@225362 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/object_proxy.cc | 113 | ||||
-rw-r--r-- | dbus/object_proxy.h | 14 |
2 files changed, 51 insertions, 76 deletions
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc index 11dc069..5ff0b86 100644 --- a/dbus/object_proxy.cc +++ b/dbus/object_proxy.cc @@ -10,6 +10,7 @@ #include "base/metrics/histogram.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" +#include "base/task_runner_util.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" #include "dbus/dbus_statistics.h" @@ -171,14 +172,17 @@ void ObjectProxy::ConnectToSignal(const std::string& interface_name, OnConnectedCallback on_connected_callback) { bus_->AssertOnOriginThread(); - bus_->GetDBusTaskRunner()->PostTask( + base::PostTaskAndReplyWithResult( + bus_->GetDBusTaskRunner(), FROM_HERE, base::Bind(&ObjectProxy::ConnectToSignalInternal, this, interface_name, signal_name, - signal_callback, - on_connected_callback)); + signal_callback), + base::Bind(on_connected_callback, + interface_name, + signal_name)); } void ObjectProxy::Detach() { @@ -353,75 +357,54 @@ void ObjectProxy::OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, delete data; } -void ObjectProxy::ConnectToSignalInternal( - const std::string& interface_name, - const std::string& signal_name, - SignalCallback signal_callback, - OnConnectedCallback on_connected_callback) { +bool ObjectProxy::ConnectToSignalInternal(const std::string& interface_name, + const std::string& signal_name, + SignalCallback signal_callback) { bus_->AssertOnDBusThread(); const std::string absolute_signal_name = GetAbsoluteSignalName(interface_name, signal_name); - // Will become true, if everything is successful. - bool success = false; - - if (bus_->Connect() && bus_->SetUpAsyncOperations()) { - // We should add the filter only once. Otherwise, HandleMessage() will - // be called more than once. - if (!filter_added_) { - if (bus_->AddFilterFunction(&ObjectProxy::HandleMessageThunk, this)) { - filter_added_ = true; - } else { - LOG(ERROR) << "Failed to add filter function"; - } - } - // Add a match rule so the signal goes through HandleMessage(). - const std::string match_rule = - base::StringPrintf("type='signal', interface='%s', path='%s'", - interface_name.c_str(), - object_path_.value().c_str()); - // Add a match_rule listening NameOwnerChanged for the well-known name - // |service_name_|. - const std::string name_owner_changed_match_rule = - base::StringPrintf( - "type='signal',interface='org.freedesktop.DBus'," - "member='NameOwnerChanged',path='/org/freedesktop/DBus'," - "sender='org.freedesktop.DBus',arg0='%s'", - service_name_.c_str()); - if (AddMatchRuleWithCallback(match_rule, - absolute_signal_name, - signal_callback) && - AddMatchRuleWithoutCallback(name_owner_changed_match_rule, - "org.freedesktop.DBus.NameOwnerChanged")) { - success = true; - } + if (!bus_->Connect() || !bus_->SetUpAsyncOperations()) + return false; - // Try getting the current name owner. It's not guaranteed that we can get - // the name owner at this moment, as the service may not yet be started. If - // that's the case, we'll get the name owner via NameOwnerChanged signal, - // as soon as the service is started. - UpdateNameOwnerAndBlock(); + // We should add the filter only once. Otherwise, HandleMessage() will + // be called more than once. + if (!filter_added_) { + if (bus_->AddFilterFunction(&ObjectProxy::HandleMessageThunk, this)) { + filter_added_ = true; + } else { + LOG(ERROR) << "Failed to add filter function"; + } } - - // Run on_connected_callback in the origin thread. - bus_->GetOriginTaskRunner()->PostTask( - FROM_HERE, - base::Bind(&ObjectProxy::OnConnected, - this, - on_connected_callback, - interface_name, - signal_name, - success)); -} - -void ObjectProxy::OnConnected(OnConnectedCallback on_connected_callback, - const std::string& interface_name, - const std::string& signal_name, - bool success) { - bus_->AssertOnOriginThread(); - - on_connected_callback.Run(interface_name, signal_name, success); + // Add a match rule so the signal goes through HandleMessage(). + const std::string match_rule = + base::StringPrintf("type='signal', interface='%s', path='%s'", + interface_name.c_str(), + object_path_.value().c_str()); + // Add a match_rule listening NameOwnerChanged for the well-known name + // |service_name_|. + const std::string name_owner_changed_match_rule = + base::StringPrintf( + "type='signal',interface='org.freedesktop.DBus'," + "member='NameOwnerChanged',path='/org/freedesktop/DBus'," + "sender='org.freedesktop.DBus',arg0='%s'", + service_name_.c_str()); + + const bool success = + AddMatchRuleWithCallback(match_rule, + absolute_signal_name, + signal_callback) && + AddMatchRuleWithoutCallback(name_owner_changed_match_rule, + "org.freedesktop.DBus.NameOwnerChanged"); + + // Try getting the current name owner. It's not guaranteed that we can get + // the name owner at this moment, as the service may not yet be started. If + // that's the case, we'll get the name owner via NameOwnerChanged signal, + // as soon as the service is started. + UpdateNameOwnerAndBlock(); + + return success; } void ObjectProxy::SetNameOwnerChangedCallback(SignalCallback callback) { diff --git a/dbus/object_proxy.h b/dbus/object_proxy.h index 798ba97..79e15d14 100644 --- a/dbus/object_proxy.h +++ b/dbus/object_proxy.h @@ -204,17 +204,9 @@ class CHROME_DBUS_EXPORT ObjectProxy void* user_data); // Helper function for ConnectToSignal(). - void ConnectToSignalInternal( - const std::string& interface_name, - const std::string& signal_name, - SignalCallback signal_callback, - OnConnectedCallback on_connected_callback); - - // Called when the object proxy is connected to the signal, or failed. - void OnConnected(OnConnectedCallback on_connected_callback, - const std::string& interface_name, - const std::string& signal_name, - bool success); + bool ConnectToSignalInternal(const std::string& interface_name, + const std::string& signal_name, + SignalCallback signal_callback); // Handles the incoming request messages and dispatches to the signal // callbacks. |