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/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/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 const base::Closure& callback) { | 260 const base::Closure& callback) { |
261 AssertOnOriginThread(); | 261 AssertOnOriginThread(); |
262 | 262 |
263 // Check if we have the requested object proxy. | 263 // Check if we have the requested object proxy. |
264 const ObjectProxyTable::key_type key(service_name + object_path.value(), | 264 const ObjectProxyTable::key_type key(service_name + object_path.value(), |
265 options); | 265 options); |
266 ObjectProxyTable::iterator iter = object_proxy_table_.find(key); | 266 ObjectProxyTable::iterator iter = object_proxy_table_.find(key); |
267 if (iter != object_proxy_table_.end()) { | 267 if (iter != object_proxy_table_.end()) { |
268 scoped_refptr<ObjectProxy> object_proxy = iter->second; | 268 scoped_refptr<ObjectProxy> object_proxy = iter->second; |
269 object_proxy_table_.erase(iter); | 269 object_proxy_table_.erase(iter); |
270 // Object is present. Remove it now and Detach in the DBus thread. | 270 // Object is present. Remove it now and Detach on the DBus thread. |
271 GetDBusTaskRunner()->PostTask( | 271 GetDBusTaskRunner()->PostTask( |
272 FROM_HERE, | 272 FROM_HERE, |
273 base::Bind(&Bus::RemoveObjectProxyInternal, | 273 base::Bind(&Bus::RemoveObjectProxyInternal, |
274 this, object_proxy, callback)); | 274 this, object_proxy, callback)); |
275 return true; | 275 return true; |
276 } | 276 } |
277 return false; | 277 return false; |
278 } | 278 } |
279 | 279 |
280 void Bus::RemoveObjectProxyInternal(scoped_refptr<ObjectProxy> object_proxy, | 280 void Bus::RemoveObjectProxyInternal(scoped_refptr<ObjectProxy> object_proxy, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 return iter->second.get(); | 343 return iter->second.get(); |
344 } | 344 } |
345 | 345 |
346 scoped_refptr<ObjectManager> object_manager = | 346 scoped_refptr<ObjectManager> object_manager = |
347 new ObjectManager(this, service_name, object_path); | 347 new ObjectManager(this, service_name, object_path); |
348 object_manager_table_[key] = object_manager; | 348 object_manager_table_[key] = object_manager; |
349 | 349 |
350 return object_manager.get(); | 350 return object_manager.get(); |
351 } | 351 } |
352 | 352 |
353 void Bus::RemoveObjectManager(const std::string& service_name, | 353 bool Bus::RemoveObjectManager(const std::string& service_name, |
354 const ObjectPath& object_path) { | 354 const ObjectPath& object_path, |
| 355 const base::Closure& callback) { |
355 AssertOnOriginThread(); | 356 AssertOnOriginThread(); |
| 357 DCHECK(!callback.is_null()); |
356 | 358 |
357 const ObjectManagerTable::key_type key(service_name + object_path.value()); | 359 const ObjectManagerTable::key_type key(service_name + object_path.value()); |
358 ObjectManagerTable::iterator iter = object_manager_table_.find(key); | 360 ObjectManagerTable::iterator iter = object_manager_table_.find(key); |
359 if (iter == object_manager_table_.end()) | 361 if (iter == object_manager_table_.end()) |
360 return; | 362 return false; |
361 | 363 |
| 364 // ObjectManager is present. Remove it now and CleanUp on the DBus thread. |
362 scoped_refptr<ObjectManager> object_manager = iter->second; | 365 scoped_refptr<ObjectManager> object_manager = iter->second; |
363 object_manager_table_.erase(iter); | 366 object_manager_table_.erase(iter); |
| 367 |
| 368 GetDBusTaskRunner()->PostTask( |
| 369 FROM_HERE, |
| 370 base::Bind(&Bus::RemoveObjectManagerInternal, |
| 371 this, object_manager, callback)); |
| 372 |
| 373 return true; |
| 374 } |
| 375 |
| 376 void Bus::RemoveObjectManagerInternal( |
| 377 scoped_refptr<dbus::ObjectManager> object_manager, |
| 378 const base::Closure& callback) { |
| 379 AssertOnDBusThread(); |
| 380 DCHECK(object_manager.get()); |
| 381 |
| 382 object_manager->CleanUp(); |
| 383 |
| 384 // The ObjectManager has to be deleted on the origin thread since it was |
| 385 // created there. |
| 386 GetOriginTaskRunner()->PostTask( |
| 387 FROM_HERE, |
| 388 base::Bind(&Bus::RemoveObjectManagerInternalHelper, |
| 389 this, object_manager, callback)); |
| 390 } |
| 391 |
| 392 void Bus::RemoveObjectManagerInternalHelper( |
| 393 scoped_refptr<dbus::ObjectManager> object_manager, |
| 394 const base::Closure& callback) { |
| 395 AssertOnOriginThread(); |
| 396 DCHECK(object_manager.get()); |
| 397 |
| 398 // Release the object manager and run the callback. |
| 399 object_manager = NULL; |
| 400 callback.Run(); |
364 } | 401 } |
365 | 402 |
366 void Bus::GetManagedObjects() { | 403 void Bus::GetManagedObjects() { |
367 for (ObjectManagerTable::iterator iter = object_manager_table_.begin(); | 404 for (ObjectManagerTable::iterator iter = object_manager_table_.begin(); |
368 iter != object_manager_table_.end(); ++iter) { | 405 iter != object_manager_table_.end(); ++iter) { |
369 iter->second->GetManagedObjects(); | 406 iter->second->GetManagedObjects(); |
370 } | 407 } |
371 } | 408 } |
372 | 409 |
373 bool Bus::Connect() { | 410 bool Bus::Connect() { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 LOG(ERROR) << "Failed to release all service names. # of services left: " | 490 LOG(ERROR) << "Failed to release all service names. # of services left: " |
454 << owned_service_names_.size(); | 491 << owned_service_names_.size(); |
455 } | 492 } |
456 | 493 |
457 // Detach from the remote objects. | 494 // Detach from the remote objects. |
458 for (ObjectProxyTable::iterator iter = object_proxy_table_.begin(); | 495 for (ObjectProxyTable::iterator iter = object_proxy_table_.begin(); |
459 iter != object_proxy_table_.end(); ++iter) { | 496 iter != object_proxy_table_.end(); ++iter) { |
460 iter->second->Detach(); | 497 iter->second->Detach(); |
461 } | 498 } |
462 | 499 |
| 500 // Clean up the object managers. |
| 501 for (ObjectManagerTable::iterator iter = object_manager_table_.begin(); |
| 502 iter != object_manager_table_.end(); ++iter) { |
| 503 iter->second->CleanUp(); |
| 504 } |
| 505 |
463 // Release object proxies and exported objects here. We should do this | 506 // Release object proxies and exported objects here. We should do this |
464 // here rather than in the destructor to avoid memory leaks due to | 507 // here rather than in the destructor to avoid memory leaks due to |
465 // cyclic references. | 508 // cyclic references. |
466 object_proxy_table_.clear(); | 509 object_proxy_table_.clear(); |
467 exported_object_table_.clear(); | 510 exported_object_table_.clear(); |
468 | 511 |
469 // Private connection should be closed. | 512 // Private connection should be closed. |
470 if (connection_) { | 513 if (connection_) { |
471 // Remove Disconnected watcher. | 514 // Remove Disconnected watcher. |
472 ScopedDBusError error; | 515 ScopedDBusError error; |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 kNameOwnerChangedSignal)) { | 1232 kNameOwnerChangedSignal)) { |
1190 Bus* self = static_cast<Bus*>(data); | 1233 Bus* self = static_cast<Bus*>(data); |
1191 self->OnServiceOwnerChanged(message); | 1234 self->OnServiceOwnerChanged(message); |
1192 } | 1235 } |
1193 // Always return unhandled to let others, e.g. ObjectProxies, handle the same | 1236 // Always return unhandled to let others, e.g. ObjectProxies, handle the same |
1194 // signal. | 1237 // signal. |
1195 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 1238 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
1196 } | 1239 } |
1197 | 1240 |
1198 } // namespace dbus | 1241 } // namespace dbus |
OLD | NEW |