diff options
Diffstat (limited to 'brillo/dbus/introspectable_helper.h')
-rw-r--r-- | brillo/dbus/introspectable_helper.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/brillo/dbus/introspectable_helper.h b/brillo/dbus/introspectable_helper.h new file mode 100644 index 0000000..e1a398f --- /dev/null +++ b/brillo/dbus/introspectable_helper.h @@ -0,0 +1,68 @@ +// Copyright 2019 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 LIBBRILLO_BRILLO_DBUS_INTROSPECTABLE_HELPER_H_ +#define LIBBRILLO_BRILLO_DBUS_INTROSPECTABLE_HELPER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include <brillo/brillo_export.h> +#include <brillo/dbus/dbus_method_response.h> +#include <brillo/dbus/dbus_object.h> + +namespace brillo { +namespace dbus_utils { + +// Note that brillo/dbus/dbus_object.h include files that include this file, so +// we'll need this forward declaration. +// class DBusObject; + +// This is a helper class that is used for creating the DBus Introspectable +// Interface. Each of the interfaces that is exported under a DBus Object will +// add its dbus interface introspection XML to this class, and then the user of +// this class will call RegisterWithDBusObject on the DBus object. Then this +// class can be freed. Note that this class is usually used in conjunction with +// the chromeos-dbus-bindings tool. Simply pass the string returned by +// GetIntrospectionXML() of the generated adaptor. Usage example: +// { +// IntrospectableInterfaceHelper helper; +// helper.AddInterfaceXML("<interface...> ...</interface>"); +// helper.AddInterfaceXML("<interface...> ...</interface>"); +// helper.AddInterfaceXML(XXXAdaptor::GetIntrospect()); +// helper.RegisterWithDBusObject(object); +// } +class BRILLO_EXPORT IntrospectableInterfaceHelper { + public: + IntrospectableInterfaceHelper() = default; + + // Add the Introspection XML for an interface to this class. The |xml| string + // should contain an interface XML tag and its content. + void AddInterfaceXml(std::string xml); + + // Register the Introspectable Interface with a DBus object. Note that this + // class can be freed after registering with DBus object. + void RegisterWithDBusObject(DBusObject* object); + + private: + // Internal alias for convenience. + using StringResponse = std::unique_ptr<DBusMethodResponse<std::string>>; + using IntrospectCallback = base::Callback<void(StringResponse)>; + + // Create the method handler for Introspect method call. + IntrospectCallback GetHandler(); + + // Get the complete introspection XML. + std::string GetXmlString(); + + // Stores the list of introspection XMLs for each of the interfaces that was + // added to this class. + std::vector<std::string> interface_xmls; +}; + +} // namespace dbus_utils +} // namespace brillo + +#endif // LIBBRILLO_BRILLO_DBUS_INTROSPECTABLE_HELPER_H_ |