| // Copyright 2014 The Chromium OS Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BUFFET_EXPORTED_OBJECT_MANAGER_H_ | 
 | #define BUFFET_EXPORTED_OBJECT_MANAGER_H_ | 
 |  | 
 | #include <map> | 
 | #include <string> | 
 |  | 
 | #include <base/memory/weak_ptr.h> | 
 | #include <dbus/bus.h> | 
 | #include <dbus/exported_object.h> | 
 | #include <dbus/object_path.h> | 
 |  | 
 | #include "buffet/exported_property_set.h" | 
 |  | 
 | namespace buffet { | 
 |  | 
 | namespace dbus_utils { | 
 |  | 
 | // ExportedObjectManager is a delegate that implements the | 
 | // org.freedesktop.DBus.ObjectManager interface on behalf of another | 
 | // object. It handles sending signals when new interfaces are added. | 
 | // | 
 | // This class is very similar to the ExportedPropertySet class, except that | 
 | // it allows objects to expose an object manager interface rather than the | 
 | // properties interface. | 
 | // | 
 | //  Example usage: | 
 | // | 
 | //   class ExampleObjectManager { | 
 | //    public: | 
 | //     ExampleObjectManager(dbus::Bus* bus) | 
 | //         : object_manager_(bus, "/my/objects/path") { } | 
 | // | 
 | //     void Init(const OnInitFinish& cb) { object_manager_.Init(cb); } | 
 | //     void ClaimInterface(const dbus::ObjectPath& path, | 
 | //                         const std::string& interface_name, | 
 | //                         const PropertyWriter& writer) { | 
 | //       object_manager_->ClaimInterface(...); | 
 | //     } | 
 | //     void ReleaseInterface(const dbus::ObjectPath& path, | 
 | //                           const std::string& interface_name) { | 
 | //       object_manager_->ReleaseInterface(...); | 
 | //     } | 
 | // | 
 | //    private: | 
 | //     ExportedObjectManager object_manager_; | 
 | //   }; | 
 | // | 
 | //   class MyObjectClaimingAnInterface { | 
 | //    public: | 
 | //     MyObjectClaimingAnInterface(ExampleObjectManager* object_manager) | 
 | //       : object_manager_(object_manager) {} | 
 | // | 
 | //     void OnInitFinish(bool success) { | 
 | //       if (!success) { /* handle that */ } | 
 | //       object_manager_->ClaimInterface( | 
 | //           my_path_, my_interface_, my_properties_.GetWriter()); | 
 | //     } | 
 | // | 
 | //    private: | 
 | //     struct Properties : public ExportedPropertySet { | 
 | //      public: | 
 | //       /* Lots of interesting properties. */ | 
 | //     }; | 
 | // | 
 | //     Properties my_properties_; | 
 | //     ExampleObjectManager* object_manager_; | 
 | //   }; | 
 | class ExportedObjectManager | 
 |     : public base::SupportsWeakPtr<ExportedObjectManager> { | 
 |  public: | 
 |   // Writes a dictionary of property name to property value variants to writer. | 
 |   typedef base::Callback<void(dbus::MessageWriter* writer)> PropertyWriter; | 
 |   typedef base::Callback<void(bool success)> OnInitFinish; | 
 |   typedef std::map<std::string, PropertyWriter> InterfaceProperties; | 
 |  | 
 |   ExportedObjectManager(scoped_refptr<dbus::Bus> bus, | 
 |                         const dbus::ObjectPath& path); | 
 |  | 
 |   // Registers methods implementing the ObjectManager interface on the object | 
 |   // exported on the path given in the constructor. Must be called on the | 
 |   // origin thread. | 
 |   void Init(const OnInitFinish& cb); | 
 |  | 
 |   // Trigger a signal that |path| has added an interface |interface_name| | 
 |   // with properties as given by |writer|. | 
 |   void ClaimInterface(const dbus::ObjectPath& path, | 
 |                       const std::string& interface_name, | 
 |                       const PropertyWriter& writer); | 
 |  | 
 |   // Trigger a signal that |path| has removed an interface |interface_name|. | 
 |   void ReleaseInterface(const dbus::ObjectPath& path, | 
 |                         const std::string& interface_name); | 
 |  | 
 |  private: | 
 |   void HandleGetManagedObjects( | 
 |       dbus::MethodCall* method_call, | 
 |       dbus::ExportedObject::ResponseSender response_sender) const; | 
 |  | 
 |   // Both |bus_| and |exported_object_| outlive *this. | 
 |   dbus::Bus* const bus_; | 
 |   dbus::ExportedObject* const exported_object_; | 
 |   // Tracks all objects currently known to the ExportedObjectManager. | 
 |   std::map<dbus::ObjectPath, InterfaceProperties> registered_objects_; | 
 |  | 
 |   friend class ExportedObjectManagerTest; | 
 |   DISALLOW_COPY_AND_ASSIGN(ExportedObjectManager); | 
 | }; | 
 |  | 
 | }  //  namespace dbus_utils | 
 |  | 
 | }  //  namespace buffet | 
 |  | 
 | #endif  // BUFFET_EXPORTED_OBJECT_MANAGER_H_ |