Index: dbus/object_proxy.cc |
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc |
index c8f00d7cbc35bd200900fb8b93f55b2a96eae115..5e9bf5b4c06c118a04fc16aba084f5256e35cb26 100644 |
--- a/dbus/object_proxy.cc |
+++ b/dbus/object_proxy.cc |
@@ -408,6 +408,12 @@ void ObjectProxy::OnConnected(OnConnectedCallback on_connected_callback, |
on_connected_callback.Run(interface_name, signal_name, success); |
} |
+void ObjectProxy::SetNameOwnerChangedCallback(SignalCallback callback) { |
+ bus_->AssertOnOriginThread(); |
+ |
+ name_owner_changed_callback_ = callback; |
+} |
+ |
DBusHandlerResult ObjectProxy::HandleMessage( |
DBusConnection* connection, |
DBusMessage* raw_message) { |
@@ -430,7 +436,7 @@ DBusHandlerResult ObjectProxy::HandleMessage( |
if (path.value() == kDbusSystemObjectPath && |
signal->GetMember() == "NameOwnerChanged") { |
// Handle NameOwnerChanged separately |
- return HandleNameOwnerChanged(signal.get()); |
+ return HandleNameOwnerChanged(signal.Pass()); |
} |
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
} |
@@ -619,7 +625,8 @@ void ObjectProxy::UpdateNameOwnerAndBlock() { |
service_name_owner_.clear(); |
} |
-DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) { |
+DBusHandlerResult ObjectProxy::HandleNameOwnerChanged( |
+ scoped_ptr<Signal> signal) { |
DCHECK(signal); |
bus_->AssertOnDBusThread(); |
@@ -627,13 +634,23 @@ DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) { |
if (signal->GetMember() == "NameOwnerChanged" && |
signal->GetInterface() == "org.freedesktop.DBus" && |
signal->GetSender() == "org.freedesktop.DBus") { |
- MessageReader reader(signal); |
+ MessageReader reader(signal.get()); |
std::string name, old_owner, new_owner; |
if (reader.PopString(&name) && |
reader.PopString(&old_owner) && |
reader.PopString(&new_owner) && |
name == service_name_) { |
service_name_owner_ = new_owner; |
+ if (!name_owner_changed_callback_.is_null()) { |
+ const base::TimeTicks start_time = base::TimeTicks::Now(); |
+ Signal* released_signal = signal.release(); |
+ bus_->PostTaskToOriginThread(FROM_HERE, |
+ base::Bind(&ObjectProxy::RunMethod, |
+ this, |
+ start_time, |
+ name_owner_changed_callback_, |
+ released_signal)); |
+ } |
return DBUS_HANDLER_RESULT_HANDLED; |
} |
} |