| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "dbus/bus.h" | 5 #include "dbus/bus.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 // Gets the absolute signal name by concatenating the interface name and | 23 // Gets the absolute signal name by concatenating the interface name and |
| 24 // the signal name. Used for building keys for method_table_ in | 24 // the signal name. Used for building keys for method_table_ in |
| 25 // ObjectProxy. | 25 // ObjectProxy. |
| 26 std::string GetAbsoluteSignalName( | 26 std::string GetAbsoluteSignalName( |
| 27 const std::string& interface_name, | 27 const std::string& interface_name, |
| 28 const std::string& signal_name) { | 28 const std::string& signal_name) { |
| 29 return interface_name + "." + signal_name; | 29 return interface_name + "." + signal_name; |
| 30 } | 30 } |
| 31 | 31 |
| 32 // An empty function used for ObjectProxy::EmptyResponseCallback(). |
| 33 void EmptyResponseCallbackBody(dbus::Response* unused_response) { |
| 34 } |
| 35 |
| 32 } // namespace | 36 } // namespace |
| 33 | 37 |
| 34 namespace dbus { | 38 namespace dbus { |
| 35 | 39 |
| 36 ObjectProxy::ObjectProxy(Bus* bus, | 40 ObjectProxy::ObjectProxy(Bus* bus, |
| 37 const std::string& service_name, | 41 const std::string& service_name, |
| 38 const std::string& object_path) | 42 const std::string& object_path) |
| 39 : bus_(bus), | 43 : bus_(bus), |
| 40 service_name_(service_name), | 44 service_name_(service_name), |
| 41 object_path_(object_path), | 45 object_path_(object_path), |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 for (size_t i = 0; i < match_rules_.size(); ++i) { | 137 for (size_t i = 0; i < match_rules_.size(); ++i) { |
| 134 ScopedDBusError error; | 138 ScopedDBusError error; |
| 135 bus_->RemoveMatch(match_rules_[i], error.get()); | 139 bus_->RemoveMatch(match_rules_[i], error.get()); |
| 136 if (error.is_set()) { | 140 if (error.is_set()) { |
| 137 // There is nothing we can do to recover, so just print the error. | 141 // There is nothing we can do to recover, so just print the error. |
| 138 LOG(ERROR) << "Failed to remove match rule: " << match_rules_[i]; | 142 LOG(ERROR) << "Failed to remove match rule: " << match_rules_[i]; |
| 139 } | 143 } |
| 140 } | 144 } |
| 141 } | 145 } |
| 142 | 146 |
| 147 // static |
| 148 ObjectProxy::ResponseCallback ObjectProxy::EmptyResponseCallback() { |
| 149 return base::Bind(&EmptyResponseCallbackBody); |
| 150 } |
| 151 |
| 143 ObjectProxy::OnPendingCallIsCompleteData::OnPendingCallIsCompleteData( | 152 ObjectProxy::OnPendingCallIsCompleteData::OnPendingCallIsCompleteData( |
| 144 ObjectProxy* in_object_proxy, | 153 ObjectProxy* in_object_proxy, |
| 145 ResponseCallback in_response_callback, | 154 ResponseCallback in_response_callback, |
| 146 base::TimeTicks in_start_time) | 155 base::TimeTicks in_start_time) |
| 147 : object_proxy(in_object_proxy), | 156 : object_proxy(in_object_proxy), |
| 148 response_callback(in_response_callback), | 157 response_callback(in_response_callback), |
| 149 start_time(in_start_time) { | 158 start_time(in_start_time) { |
| 150 } | 159 } |
| 151 | 160 |
| 152 ObjectProxy::OnPendingCallIsCompleteData::~OnPendingCallIsCompleteData() { | 161 ObjectProxy::OnPendingCallIsCompleteData::~OnPendingCallIsCompleteData() { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 start_time, | 214 start_time, |
| 206 response_message); | 215 response_message); |
| 207 bus_->PostTaskToOriginThread(FROM_HERE, task); | 216 bus_->PostTaskToOriginThread(FROM_HERE, task); |
| 208 } | 217 } |
| 209 | 218 |
| 210 void ObjectProxy::RunResponseCallback(ResponseCallback response_callback, | 219 void ObjectProxy::RunResponseCallback(ResponseCallback response_callback, |
| 211 base::TimeTicks start_time, | 220 base::TimeTicks start_time, |
| 212 DBusMessage* response_message) { | 221 DBusMessage* response_message) { |
| 213 bus_->AssertOnOriginThread(); | 222 bus_->AssertOnOriginThread(); |
| 214 | 223 |
| 215 bool response_callback_called = false; | 224 bool method_call_successful = false; |
| 216 if (!response_message) { | 225 if (!response_message) { |
| 217 // The response is not received. | 226 // The response is not received. |
| 218 response_callback.Run(NULL); | 227 response_callback.Run(NULL); |
| 219 } else if (dbus_message_get_type(response_message) == | 228 } else if (dbus_message_get_type(response_message) == |
| 220 DBUS_MESSAGE_TYPE_ERROR) { | 229 DBUS_MESSAGE_TYPE_ERROR) { |
| 221 // This will take |response_message| and release (unref) it. | 230 // This will take |response_message| and release (unref) it. |
| 222 scoped_ptr<dbus::ErrorResponse> error_response( | 231 scoped_ptr<dbus::ErrorResponse> error_response( |
| 223 dbus::ErrorResponse::FromRawMessage(response_message)); | 232 dbus::ErrorResponse::FromRawMessage(response_message)); |
| 224 // Error message may contain the error message as string. | 233 // Error message may contain the error message as string. |
| 225 dbus::MessageReader reader(error_response.get()); | 234 dbus::MessageReader reader(error_response.get()); |
| 226 std::string error_message; | 235 std::string error_message; |
| 227 reader.PopString(&error_message); | 236 reader.PopString(&error_message); |
| 228 LOG(ERROR) << "Failed to call method: " << error_response->GetErrorName() | 237 LOG(ERROR) << "Failed to call method: " << error_response->GetErrorName() |
| 229 << ": " << error_message; | 238 << ": " << error_message; |
| 230 // We don't give the error message to the callback. | 239 // We don't give the error message to the callback. |
| 231 response_callback.Run(NULL); | 240 response_callback.Run(NULL); |
| 232 } else { | 241 } else { |
| 233 // This will take |response_message| and release (unref) it. | 242 // This will take |response_message| and release (unref) it. |
| 234 scoped_ptr<dbus::Response> response( | 243 scoped_ptr<dbus::Response> response( |
| 235 dbus::Response::FromRawMessage(response_message)); | 244 dbus::Response::FromRawMessage(response_message)); |
| 236 // The response is successfully received. | 245 // The response is successfully received. |
| 237 response_callback.Run(response.get()); | 246 response_callback.Run(response.get()); |
| 238 response_callback_called = true; | 247 method_call_successful = true; |
| 239 // Record time spent for the method call. Don't include failures. | 248 // Record time spent for the method call. Don't include failures. |
| 240 UMA_HISTOGRAM_TIMES("DBus.AsyncMethodCallTime", | 249 UMA_HISTOGRAM_TIMES("DBus.AsyncMethodCallTime", |
| 241 base::TimeTicks::Now() - start_time); | 250 base::TimeTicks::Now() - start_time); |
| 242 } | 251 } |
| 243 // Record if the method call is successful, or not. 1 if successful. | 252 // Record if the method call is successful, or not. 1 if successful. |
| 244 UMA_HISTOGRAM_ENUMERATION("DBus.AsyncMethodCallSuccess", | 253 UMA_HISTOGRAM_ENUMERATION("DBus.AsyncMethodCallSuccess", |
| 245 response_callback_called, | 254 method_call_successful, |
| 246 kSuccessRatioHistogramMaxValue); | 255 kSuccessRatioHistogramMaxValue); |
| 247 } | 256 } |
| 248 | 257 |
| 249 void ObjectProxy::OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, | 258 void ObjectProxy::OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, |
| 250 void* user_data) { | 259 void* user_data) { |
| 251 OnPendingCallIsCompleteData* data = | 260 OnPendingCallIsCompleteData* data = |
| 252 reinterpret_cast<OnPendingCallIsCompleteData*>(user_data); | 261 reinterpret_cast<OnPendingCallIsCompleteData*>(user_data); |
| 253 ObjectProxy* self = data->object_proxy; | 262 ObjectProxy* self = data->object_proxy; |
| 254 self->OnPendingCallIsComplete(pending_call, | 263 self->OnPendingCallIsComplete(pending_call, |
| 255 data->response_callback, | 264 data->response_callback, |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 400 |
| 392 DBusHandlerResult ObjectProxy::HandleMessageThunk( | 401 DBusHandlerResult ObjectProxy::HandleMessageThunk( |
| 393 DBusConnection* connection, | 402 DBusConnection* connection, |
| 394 DBusMessage* raw_message, | 403 DBusMessage* raw_message, |
| 395 void* user_data) { | 404 void* user_data) { |
| 396 ObjectProxy* self = reinterpret_cast<ObjectProxy*>(user_data); | 405 ObjectProxy* self = reinterpret_cast<ObjectProxy*>(user_data); |
| 397 return self->HandleMessage(connection, raw_message); | 406 return self->HandleMessage(connection, raw_message); |
| 398 } | 407 } |
| 399 | 408 |
| 400 } // namespace dbus | 409 } // namespace dbus |
| OLD | NEW |