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) && |