OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/exported_object.h" | 5 #include "dbus/exported_object.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/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 MethodCallCallback method_call_callback, | 77 MethodCallCallback method_call_callback, |
78 OnExportedCallback on_exported_calback) { | 78 OnExportedCallback on_exported_calback) { |
79 bus_->AssertOnOriginThread(); | 79 bus_->AssertOnOriginThread(); |
80 | 80 |
81 base::Closure task = base::Bind(&ExportedObject::ExportMethodInternal, | 81 base::Closure task = base::Bind(&ExportedObject::ExportMethodInternal, |
82 this, | 82 this, |
83 interface_name, | 83 interface_name, |
84 method_name, | 84 method_name, |
85 method_call_callback, | 85 method_call_callback, |
86 on_exported_calback); | 86 on_exported_calback); |
87 bus_->PostTaskToDBusThread(FROM_HERE, task); | 87 bus_->GetDBusTaskRunner()->PostTask(FROM_HERE, task); |
88 } | 88 } |
89 | 89 |
90 void ExportedObject::SendSignal(Signal* signal) { | 90 void ExportedObject::SendSignal(Signal* signal) { |
91 // For signals, the object path should be set to the path to the sender | 91 // For signals, the object path should be set to the path to the sender |
92 // object, which is this exported object here. | 92 // object, which is this exported object here. |
93 CHECK(signal->SetPath(object_path_)); | 93 CHECK(signal->SetPath(object_path_)); |
94 | 94 |
95 // Increment the reference count so we can safely reference the | 95 // Increment the reference count so we can safely reference the |
96 // underlying signal message until the signal sending is complete. This | 96 // underlying signal message until the signal sending is complete. This |
97 // will be unref'ed in SendSignalInternal(). | 97 // will be unref'ed in SendSignalInternal(). |
98 DBusMessage* signal_message = signal->raw_message(); | 98 DBusMessage* signal_message = signal->raw_message(); |
99 dbus_message_ref(signal_message); | 99 dbus_message_ref(signal_message); |
100 | 100 |
101 const base::TimeTicks start_time = base::TimeTicks::Now(); | 101 const base::TimeTicks start_time = base::TimeTicks::Now(); |
102 bus_->PostTaskToDBusThread(FROM_HERE, | 102 bus_->GetDBusTaskRunner()->PostTask( |
103 base::Bind(&ExportedObject::SendSignalInternal, | 103 FROM_HERE, |
104 this, | 104 base::Bind(&ExportedObject::SendSignalInternal, |
105 start_time, | 105 this, |
106 signal_message)); | 106 start_time, |
| 107 signal_message)); |
107 } | 108 } |
108 | 109 |
109 void ExportedObject::Unregister() { | 110 void ExportedObject::Unregister() { |
110 bus_->AssertOnDBusThread(); | 111 bus_->AssertOnDBusThread(); |
111 | 112 |
112 if (!object_is_registered_) | 113 if (!object_is_registered_) |
113 return; | 114 return; |
114 | 115 |
115 bus_->UnregisterObjectPath(object_path_); | 116 bus_->UnregisterObjectPath(object_path_); |
116 object_is_registered_ = false; | 117 object_is_registered_ = false; |
117 } | 118 } |
118 | 119 |
119 void ExportedObject::ExportMethodInternal( | 120 void ExportedObject::ExportMethodInternal( |
120 const std::string& interface_name, | 121 const std::string& interface_name, |
121 const std::string& method_name, | 122 const std::string& method_name, |
122 MethodCallCallback method_call_callback, | 123 MethodCallCallback method_call_callback, |
123 OnExportedCallback on_exported_calback) { | 124 OnExportedCallback on_exported_calback) { |
124 bus_->AssertOnDBusThread(); | 125 bus_->AssertOnDBusThread(); |
125 | 126 |
126 const bool success = ExportMethodAndBlock(interface_name, | 127 const bool success = ExportMethodAndBlock(interface_name, |
127 method_name, | 128 method_name, |
128 method_call_callback); | 129 method_call_callback); |
129 bus_->PostTaskToOriginThread(FROM_HERE, | 130 bus_->GetOriginTaskRunner()->PostTask(FROM_HERE, |
130 base::Bind(&ExportedObject::OnExported, | 131 base::Bind(&ExportedObject::OnExported, |
131 this, | 132 this, |
132 on_exported_calback, | 133 on_exported_calback, |
133 interface_name, | 134 interface_name, |
134 method_name, | 135 method_name, |
135 success)); | 136 success)); |
136 } | 137 } |
137 | 138 |
138 void ExportedObject::OnExported(OnExportedCallback on_exported_callback, | 139 void ExportedObject::OnExported(OnExportedCallback on_exported_callback, |
139 const std::string& interface_name, | 140 const std::string& interface_name, |
140 const std::string& method_name, | 141 const std::string& method_name, |
141 bool success) { | 142 bool success) { |
142 bus_->AssertOnOriginThread(); | 143 bus_->AssertOnOriginThread(); |
143 | 144 |
144 on_exported_callback.Run(interface_name, method_name, success); | 145 on_exported_callback.Run(interface_name, method_name, success); |
145 } | 146 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 MethodTable::const_iterator iter = method_table_.find(absolute_method_name); | 208 MethodTable::const_iterator iter = method_table_.find(absolute_method_name); |
208 if (iter == method_table_.end()) { | 209 if (iter == method_table_.end()) { |
209 // Don't know about the method. | 210 // Don't know about the method. |
210 LOG(WARNING) << "Unknown method: " << method_call->ToString(); | 211 LOG(WARNING) << "Unknown method: " << method_call->ToString(); |
211 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 212 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
212 } | 213 } |
213 | 214 |
214 const base::TimeTicks start_time = base::TimeTicks::Now(); | 215 const base::TimeTicks start_time = base::TimeTicks::Now(); |
215 if (bus_->HasDBusThread()) { | 216 if (bus_->HasDBusThread()) { |
216 // Post a task to run the method in the origin thread. | 217 // Post a task to run the method in the origin thread. |
217 bus_->PostTaskToOriginThread(FROM_HERE, | 218 bus_->GetOriginTaskRunner()->PostTask(FROM_HERE, |
218 base::Bind(&ExportedObject::RunMethod, | 219 base::Bind(&ExportedObject::RunMethod, |
219 this, | 220 this, |
220 iter->second, | 221 iter->second, |
221 base::Passed(&method_call), | 222 base::Passed(&method_call), |
222 start_time)); | 223 start_time)); |
223 } else { | 224 } else { |
224 // If the D-Bus thread is not used, just call the method directly. | 225 // If the D-Bus thread is not used, just call the method directly. |
225 MethodCall* method = method_call.get(); | 226 MethodCall* method = method_call.get(); |
226 iter->second.Run(method, | 227 iter->second.Run(method, |
227 base::Bind(&ExportedObject::SendResponse, | 228 base::Bind(&ExportedObject::SendResponse, |
228 this, | 229 this, |
229 start_time, | 230 start_time, |
230 base::Passed(&method_call))); | 231 base::Passed(&method_call))); |
231 } | 232 } |
232 | 233 |
(...skipping 12 matching lines...) Expand all Loading... |
245 this, | 246 this, |
246 start_time, | 247 start_time, |
247 base::Passed(&method_call))); | 248 base::Passed(&method_call))); |
248 } | 249 } |
249 | 250 |
250 void ExportedObject::SendResponse(base::TimeTicks start_time, | 251 void ExportedObject::SendResponse(base::TimeTicks start_time, |
251 scoped_ptr<MethodCall> method_call, | 252 scoped_ptr<MethodCall> method_call, |
252 scoped_ptr<Response> response) { | 253 scoped_ptr<Response> response) { |
253 DCHECK(method_call); | 254 DCHECK(method_call); |
254 if (bus_->HasDBusThread()) { | 255 if (bus_->HasDBusThread()) { |
255 bus_->PostTaskToDBusThread(FROM_HERE, | 256 bus_->GetDBusTaskRunner()->PostTask( |
256 base::Bind(&ExportedObject::OnMethodCompleted, | 257 FROM_HERE, |
257 this, | 258 base::Bind(&ExportedObject::OnMethodCompleted, |
258 base::Passed(&method_call), | 259 this, |
259 base::Passed(&response), | 260 base::Passed(&method_call), |
260 start_time)); | 261 base::Passed(&response), |
| 262 start_time)); |
261 } else { | 263 } else { |
262 OnMethodCompleted(method_call.Pass(), response.Pass(), start_time); | 264 OnMethodCompleted(method_call.Pass(), response.Pass(), start_time); |
263 } | 265 } |
264 } | 266 } |
265 | 267 |
266 void ExportedObject::OnMethodCompleted(scoped_ptr<MethodCall> method_call, | 268 void ExportedObject::OnMethodCompleted(scoped_ptr<MethodCall> method_call, |
267 scoped_ptr<Response> response, | 269 scoped_ptr<Response> response, |
268 base::TimeTicks start_time) { | 270 base::TimeTicks start_time) { |
269 bus_->AssertOnDBusThread(); | 271 bus_->AssertOnDBusThread(); |
270 | 272 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 return self->HandleMessage(connection, raw_message); | 310 return self->HandleMessage(connection, raw_message); |
309 } | 311 } |
310 | 312 |
311 void ExportedObject::OnUnregisteredThunk(DBusConnection *connection, | 313 void ExportedObject::OnUnregisteredThunk(DBusConnection *connection, |
312 void* user_data) { | 314 void* user_data) { |
313 ExportedObject* self = reinterpret_cast<ExportedObject*>(user_data); | 315 ExportedObject* self = reinterpret_cast<ExportedObject*>(user_data); |
314 return self->OnUnregistered(connection); | 316 return self->OnUnregistered(connection); |
315 } | 317 } |
316 | 318 |
317 } // namespace dbus | 319 } // namespace dbus |
OLD | NEW |