Chromium Code Reviews| Index: dbus/object_proxy.cc |
| =================================================================== |
| --- dbus/object_proxy.cc (revision 197157) |
| +++ dbus/object_proxy.cc (working copy) |
| @@ -18,6 +18,8 @@ |
| #include "dbus/object_proxy.h" |
| #include "dbus/scoped_dbus_error.h" |
| +namespace dbus { |
| + |
| namespace { |
| const char kErrorServiceUnknown[] = "org.freedesktop.DBus.Error.ServiceUnknown"; |
| @@ -28,6 +30,15 @@ |
| // The path of D-Bus Object sending NameOwnerChanged signal. |
| const char kDBusSystemObjectPath[] = "/org/freedesktop/DBus"; |
| +// The D-Bus Object interface. |
| +const char kDBusSystemObjectInterface[] = "org.freedesktop.DBus"; |
| + |
| +// The D-Bus Object address. |
| +const char kDBusSystemObjectAddress[] = "org.freedesktop.DBus"; |
| + |
| +// The NameOwnerChanged member in |kDBusSystemObjectInterface|. |
| +const char kNameOwnerChangedMember[] = "NameOwnerChanged"; |
| + |
| // Gets the absolute signal name by concatenating the interface name and |
| // the signal name. Used for building keys for method_table_ in |
| // ObjectProxy. |
| @@ -38,13 +49,54 @@ |
| } |
| // An empty function used for ObjectProxy::EmptyResponseCallback(). |
| -void EmptyResponseCallbackBody(dbus::Response* unused_response) { |
| +void EmptyResponseCallbackBody(Response* unused_response) { |
| } |
| +// Gets the owner for |service_name| on |bus|. On success, returns true and |
| +// write the owner name to |service_name_owner|. |
| +// Set |suppress_errors| to true to avoid printing error messages. |
| +bool GetServiceOwner(Bus* bus, |
| + const std::string& service_name, |
| + bool suppress_errors, |
| + std::string* service_name_owner) { |
| + bus->AssertOnDBusThread(); |
| + |
| + MethodCall get_name_owner_call(kDBusSystemObjectInterface, "GetNameOwner"); |
| + MessageWriter writer(&get_name_owner_call); |
| + writer.AppendString(service_name); |
| + VLOG(1) << "Method call: " << get_name_owner_call.ToString(); |
| + |
| + const ObjectPath obj_path(kDBusSystemObjectPath); |
| + if (!get_name_owner_call.SetDestination(kDBusSystemObjectAddress) || |
| + !get_name_owner_call.SetPath(obj_path)) { |
| + if (!suppress_errors) |
| + LOG(ERROR) << "Failed to get name owner."; |
| + return false; |
| + } |
| + |
| + ScopedDBusError error; |
| + DBusMessage* response_message = bus->SendWithReplyAndBlock( |
| + get_name_owner_call.raw_message(), |
| + ObjectProxy::TIMEOUT_USE_DEFAULT, |
| + error.get()); |
| + if (!response_message) { |
| + if (!suppress_errors) { |
| + LOG(ERROR) << "Failed to get name owner. Got " << error.name() << ": " |
| + << error.message(); |
| + } |
| + return false; |
| + } |
| + |
| + scoped_ptr<Response> response(Response::FromRawMessage(response_message)); |
| + MessageReader reader(response.get()); |
| + |
| + if (!reader.PopString(service_name_owner)) |
| + service_name_owner->clear(); |
| + return true; |
| +} |
| + |
| } // namespace |
| -namespace dbus { |
| - |
| ObjectProxy::ObjectProxy(Bus* bus, |
| const std::string& service_name, |
| const ObjectPath& object_path, |
| @@ -193,6 +245,18 @@ |
| } |
| // static |
| +bool ObjectProxy::ServiceHasOwner(dbus::Bus* bus, |
| + const std::string& service_name) { |
|
satorux1
2013/04/30 01:53:10
thread checking is missing. bus_->AssertOnDBusThre
|
| + if (!bus->Connect()) |
| + return false; |
| + |
| + std::string service_name_owner; |
| + if (!GetServiceOwner(bus, service_name, true, &service_name_owner)) |
| + return false; |
| + return !service_name_owner.empty(); |
| +} |
| + |
| +// static |
| ObjectProxy::ResponseCallback ObjectProxy::EmptyResponseCallback() { |
| return base::Bind(&EmptyResponseCallbackBody); |
| } |
| @@ -285,18 +349,17 @@ |
| } else if (dbus_message_get_type(response_message) == |
| DBUS_MESSAGE_TYPE_ERROR) { |
| // This will take |response_message| and release (unref) it. |
| - scoped_ptr<dbus::ErrorResponse> error_response( |
| - dbus::ErrorResponse::FromRawMessage(response_message)); |
| + scoped_ptr<ErrorResponse> error_response( |
| + ErrorResponse::FromRawMessage(response_message)); |
| error_callback.Run(error_response.get()); |
| // Delete the message on the D-Bus thread. See below for why. |
| bus_->PostTaskToDBusThread( |
| FROM_HERE, |
| - base::Bind(&base::DeletePointer<dbus::ErrorResponse>, |
| + base::Bind(&base::DeletePointer<ErrorResponse>, |
| error_response.release())); |
| } else { |
| // This will take |response_message| and release (unref) it. |
| - scoped_ptr<dbus::Response> response( |
| - dbus::Response::FromRawMessage(response_message)); |
| + scoped_ptr<Response> response(Response::FromRawMessage(response_message)); |
| // The response is successfully received. |
| response_callback.Run(response.get()); |
| // The message should be deleted on the D-Bus thread for a complicated |
| @@ -319,8 +382,7 @@ |
| // thread, not from the current thread here, which is likely UI thread. |
| bus_->PostTaskToDBusThread( |
| FROM_HERE, |
| - base::Bind(&base::DeletePointer<dbus::Response>, |
| - response.release())); |
| + base::Bind(&base::DeletePointer<Response>, response.release())); |
| method_call_successful = true; |
| // Record time spent for the method call. Don't include failures. |
| @@ -439,10 +501,10 @@ |
| // Verify the signal comes from the object we're proxying for, this is |
| // our last chance to return DBUS_HANDLER_RESULT_NOT_YET_HANDLED and |
| // allow other object proxies to handle instead. |
| - const dbus::ObjectPath path = signal->GetPath(); |
| + const ObjectPath path = signal->GetPath(); |
| if (path != object_path_) { |
| if (path.value() == kDBusSystemObjectPath && |
| - signal->GetMember() == "NameOwnerChanged") { |
| + signal->GetMember() == kNameOwnerChangedMember) { |
| // Handle NameOwnerChanged separately |
| return HandleNameOwnerChanged(signal.Pass()); |
| } |
| @@ -507,7 +569,7 @@ |
| // RunResponseCallback(). |
| bus_->PostTaskToDBusThread( |
| FROM_HERE, |
| - base::Bind(&base::DeletePointer<dbus::Signal>, signal)); |
| + base::Bind(&base::DeletePointer<Signal>, signal)); |
| // Record time spent for handling the signal. |
| UMA_HISTOGRAM_TIMES("DBus.SignalHandleTime", |
| @@ -541,7 +603,7 @@ |
| ErrorResponse* error_response) { |
| if (error_response) { |
| // Error message may contain the error message as string. |
| - dbus::MessageReader reader(error_response); |
| + MessageReader reader(error_response); |
| std::string error_message; |
| reader.PopString(&error_message); |
| LogMethodCallFailure(interface_name, |
| @@ -564,8 +626,8 @@ |
| ScopedDBusError error; |
| bus_->AddMatch(match_rule, error.get()); |
| if (error.is_set()) { |
| - LOG(ERROR) << "Failed to add match rule \"" << match_rule << "\". Got " << |
| - error.name() << ": " << error.message(); |
| + LOG(ERROR) << "Failed to add match rule \"" << match_rule << "\". Got " |
| + << error.name() << ": " << error.message(); |
| return false; |
| } else { |
| // Store the match rule, so that we can remove this in Detach(). |
| @@ -594,8 +656,8 @@ |
| ScopedDBusError error; |
| bus_->AddMatch(match_rule, error.get()); |
| if (error.is_set()) { |
| - LOG(ERROR) << "Failed to add match rule \"" << match_rule << "\". Got " << |
| - error.name() << ": " << error.message(); |
| + LOG(ERROR) << "Failed to add match rule \"" << match_rule << "\". Got " |
| + << error.name() << ": " << error.message(); |
| return false; |
| } |
| // Store the match rule, so that we can remove this in Detach(). |
| @@ -604,38 +666,7 @@ |
| } |
| void ObjectProxy::UpdateNameOwnerAndBlock() { |
| - bus_->AssertOnDBusThread(); |
| - |
| - MethodCall get_name_owner_call("org.freedesktop.DBus", "GetNameOwner"); |
| - MessageWriter writer(&get_name_owner_call); |
| - writer.AppendString(service_name_); |
| - VLOG(1) << "Method call: " << get_name_owner_call.ToString(); |
| - |
| - const dbus::ObjectPath obj_path("/org/freedesktop/DBus"); |
| - ScopedDBusError error; |
| - if (!get_name_owner_call.SetDestination("org.freedesktop.DBus") || |
| - !get_name_owner_call.SetPath(obj_path)) { |
| - LOG(ERROR) << "Failed to get name owner."; |
| - return; |
| - } |
| - |
| - DBusMessage* response_message = bus_->SendWithReplyAndBlock( |
| - get_name_owner_call.raw_message(), |
| - TIMEOUT_USE_DEFAULT, |
| - error.get()); |
| - if (!response_message) { |
| - LOG(ERROR) << "Failed to get name owner. Got " << error.name() << ": " << |
| - error.message(); |
| - return; |
| - } |
| - scoped_ptr<Response> response(Response::FromRawMessage(response_message)); |
| - MessageReader reader(response.get()); |
| - |
| - std::string new_service_name_owner; |
| - if (reader.PopString(&new_service_name_owner)) |
| - service_name_owner_ = new_service_name_owner; |
| - else |
| - service_name_owner_.clear(); |
| + GetServiceOwner(bus_, service_name_, false, &service_name_owner_); |
| } |
| DBusHandlerResult ObjectProxy::HandleNameOwnerChanged( |
| @@ -644,9 +675,9 @@ |
| bus_->AssertOnDBusThread(); |
| // Confirm the validity of the NameOwnerChanged signal. |
| - if (signal->GetMember() == "NameOwnerChanged" && |
| - signal->GetInterface() == "org.freedesktop.DBus" && |
| - signal->GetSender() == "org.freedesktop.DBus") { |
| + if (signal->GetMember() == kNameOwnerChangedMember && |
| + signal->GetInterface() == kDBusSystemObjectInterface && |
| + signal->GetSender() == kDBusSystemObjectAddress) { |
| MessageReader reader(signal.get()); |
| std::string name, old_owner, new_owner; |
| if (reader.PopString(&name) && |