Index: dbus/object_proxy.cc |
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc |
index 0cbd93e285f61ab9eaae5d19c98f5a00e8a44077..051d8f177fdf2110d13ca2ee9499bd7df9d1df77 100644 |
--- a/dbus/object_proxy.cc |
+++ b/dbus/object_proxy.cc |
@@ -96,6 +96,16 @@ Response* ObjectProxy::CallMethodAndBlock(MethodCall* method_call, |
void ObjectProxy::CallMethod(MethodCall* method_call, |
int timeout_ms, |
ResponseCallback callback) { |
+ CallMethodWithErrorCallback(method_call, timeout_ms, callback, |
+ base::Bind(&ObjectProxy::OnCallMethodError, |
+ this, |
+ callback)); |
+} |
+ |
+void ObjectProxy::CallMethodWithErrorCallback(MethodCall* method_call, |
+ int timeout_ms, |
+ ResponseCallback callback, |
+ ErrorCallback error_callback) { |
bus_->AssertOnOriginThread(); |
method_call->SetDestination(service_name_); |
@@ -112,6 +122,7 @@ void ObjectProxy::CallMethod(MethodCall* method_call, |
timeout_ms, |
request_message, |
callback, |
+ error_callback, |
start_time); |
// Wait for the response in the D-Bus thread. |
bus_->PostTaskToDBusThread(FROM_HERE, task); |
@@ -161,9 +172,11 @@ ObjectProxy::ResponseCallback ObjectProxy::EmptyResponseCallback() { |
ObjectProxy::OnPendingCallIsCompleteData::OnPendingCallIsCompleteData( |
ObjectProxy* in_object_proxy, |
ResponseCallback in_response_callback, |
+ ErrorCallback in_error_callback, |
base::TimeTicks in_start_time) |
: object_proxy(in_object_proxy), |
response_callback(in_response_callback), |
+ error_callback(in_error_callback), |
start_time(in_start_time) { |
} |
@@ -173,19 +186,22 @@ ObjectProxy::OnPendingCallIsCompleteData::~OnPendingCallIsCompleteData() { |
void ObjectProxy::StartAsyncMethodCall(int timeout_ms, |
DBusMessage* request_message, |
ResponseCallback response_callback, |
+ ErrorCallback error_callback, |
base::TimeTicks start_time) { |
bus_->AssertOnDBusThread(); |
if (!bus_->Connect() || !bus_->SetUpAsyncOperations()) { |
- // In case of a failure, run the callback with NULL response, that |
- // indicates a failure. |
+ // In case of a failure, run the error callback with NULL. |
DBusMessage* response_message = NULL; |
base::Closure task = base::Bind(&ObjectProxy::RunResponseCallback, |
this, |
response_callback, |
+ error_callback, |
start_time, |
response_message); |
bus_->PostTaskToOriginThread(FROM_HERE, task); |
+ |
+ dbus_message_unref(request_message); |
return; |
} |
@@ -196,7 +212,8 @@ void ObjectProxy::StartAsyncMethodCall(int timeout_ms, |
// Prepare the data we'll be passing to OnPendingCallIsCompleteThunk(). |
// The data will be deleted in OnPendingCallIsCompleteThunk(). |
OnPendingCallIsCompleteData* data = |
- new OnPendingCallIsCompleteData(this, response_callback, start_time); |
+ new OnPendingCallIsCompleteData(this, response_callback, error_callback, |
+ start_time); |
// This returns false only when unable to allocate memory. |
const bool success = dbus_pending_call_set_notify( |
@@ -213,6 +230,7 @@ void ObjectProxy::StartAsyncMethodCall(int timeout_ms, |
void ObjectProxy::OnPendingCallIsComplete(DBusPendingCall* pending_call, |
ResponseCallback response_callback, |
+ ErrorCallback error_callback, |
base::TimeTicks start_time) { |
bus_->AssertOnDBusThread(); |
@@ -220,12 +238,14 @@ void ObjectProxy::OnPendingCallIsComplete(DBusPendingCall* pending_call, |
base::Closure task = base::Bind(&ObjectProxy::RunResponseCallback, |
this, |
response_callback, |
+ error_callback, |
start_time, |
response_message); |
bus_->PostTaskToOriginThread(FROM_HERE, task); |
} |
void ObjectProxy::RunResponseCallback(ResponseCallback response_callback, |
+ ErrorCallback error_callback, |
base::TimeTicks start_time, |
DBusMessage* response_message) { |
bus_->AssertOnOriginThread(); |
@@ -233,19 +253,13 @@ void ObjectProxy::RunResponseCallback(ResponseCallback response_callback, |
bool method_call_successful = false; |
if (!response_message) { |
// The response is not received. |
- response_callback.Run(NULL); |
+ error_callback.Run(NULL); |
} 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)); |
- // Error message may contain the error message as string. |
- dbus::MessageReader reader(error_response.get()); |
- std::string error_message; |
- reader.PopString(&error_message); |
- LogMethodCallFailure(error_response->GetErrorName(), error_message); |
- // We don't give the error message to the callback. |
- response_callback.Run(NULL); |
+ error_callback.Run(error_response.get()); |
} else { |
// This will take |response_message| and release (unref) it. |
scoped_ptr<dbus::Response> response( |
@@ -270,6 +284,7 @@ void ObjectProxy::OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, |
ObjectProxy* self = data->object_proxy; |
self->OnPendingCallIsComplete(pending_call, |
data->response_callback, |
+ data->error_callback, |
data->start_time); |
delete data; |
} |
@@ -429,4 +444,16 @@ void ObjectProxy::LogMethodCallFailure( |
<< ": " << error_message; |
} |
+void ObjectProxy::OnCallMethodError(ResponseCallback response_callback, |
+ ErrorResponse* error_response) { |
+ if (error_response) { |
+ // Error message may contain the error message as string. |
+ dbus::MessageReader reader(error_response); |
+ std::string error_message; |
+ reader.PopString(&error_message); |
+ LogMethodCallFailure(error_response->GetErrorName(), error_message); |
+ } |
+ response_callback.Run(NULL); |
+} |
+ |
} // namespace dbus |