Index: dbus/bus.cc |
diff --git a/dbus/bus.cc b/dbus/bus.cc |
index e895e584b63b5980687389f00f875143c092fa17..cfc833db3c1d23447c488c13e4f901be4f4ddabe 100644 |
--- a/dbus/bus.cc |
+++ b/dbus/bus.cc |
@@ -13,6 +13,8 @@ |
#include "base/threading/thread_restrictions.h" |
#include "base/time.h" |
#include "dbus/exported_object.h" |
+#include "dbus/object_manager.h" |
+#include "dbus/object_path.h" |
#include "dbus/object_proxy.h" |
#include "dbus/scoped_dbus_error.h" |
@@ -322,6 +324,44 @@ void Bus::UnregisterExportedObjectInternal( |
exported_object->Unregister(); |
} |
+ObjectManager* Bus::GetObjectManager(const std::string& service_name, |
+ const ObjectPath& object_path) { |
+ AssertOnOriginThread(); |
+ |
+ // Check if we already have the requested object manager. |
+ const ObjectManagerTable::key_type key(service_name + object_path.value()); |
+ ObjectManagerTable::iterator iter = object_manager_table_.find(key); |
+ if (iter != object_manager_table_.end()) { |
+ return iter->second; |
+ } |
+ |
+ scoped_refptr<ObjectManager> object_manager = |
+ new ObjectManager(this, service_name, object_path); |
+ object_manager_table_[key] = object_manager; |
+ |
+ return object_manager.get(); |
+} |
+ |
+void Bus::RemoveObjectManager(const std::string& service_name, |
+ const ObjectPath& object_path) { |
+ AssertOnOriginThread(); |
+ |
+ const ObjectManagerTable::key_type key(service_name + object_path.value()); |
+ ObjectManagerTable::iterator iter = object_manager_table_.find(key); |
+ if (iter == object_manager_table_.end()) |
+ return; |
+ |
+ scoped_refptr<ObjectManager> object_manager = iter->second; |
+ object_manager_table_.erase(iter); |
+} |
+ |
+void Bus::GetManagedObjects() { |
+ for (ObjectManagerTable::iterator iter = object_manager_table_.begin(); |
+ iter != object_manager_table_.end(); ++iter) { |
+ iter->second->GetManagedObjects(); |
+ } |
+} |
+ |
bool Bus::Connect() { |
// dbus_bus_get_private() and dbus_bus_get() are blocking calls. |
AssertOnDBusThread(); |