82 lines
2.7 KiB
C++
82 lines
2.7 KiB
C++
// 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.
|
|
|
|
#include <brillo/dbus/introspectable_helper.h>
|
|
|
|
#include <memory>
|
|
|
|
#include <base/bind.h>
|
|
#include <dbus/dbus-shared.h>
|
|
|
|
namespace brillo {
|
|
namespace dbus_utils {
|
|
|
|
using base::Bind;
|
|
using std::string;
|
|
using std::unique_ptr;
|
|
|
|
void IntrospectableInterfaceHelper::AddInterfaceXml(string xml) {
|
|
interface_xmls.push_back(xml);
|
|
}
|
|
|
|
void IntrospectableInterfaceHelper::RegisterWithDBusObject(DBusObject* object) {
|
|
DBusInterface* itf = object->AddOrGetInterface(DBUS_INTERFACE_INTROSPECTABLE);
|
|
|
|
itf->AddMethodHandler("Introspect", GetHandler());
|
|
}
|
|
|
|
IntrospectableInterfaceHelper::IntrospectCallback
|
|
IntrospectableInterfaceHelper::GetHandler() {
|
|
return Bind(
|
|
[](const string& xml, StringResponse response) { response->Return(xml); },
|
|
GetXmlString());
|
|
}
|
|
|
|
string IntrospectableInterfaceHelper::GetXmlString() {
|
|
constexpr const char header[] =
|
|
"<!DOCTYPE node PUBLIC "
|
|
"\"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
|
|
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
|
|
"\n"
|
|
"<node>\n"
|
|
" <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
|
|
" <method name=\"Introspect\">\n"
|
|
" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
|
|
" </method>\n"
|
|
" </interface>\n"
|
|
" <interface name=\"org.freedesktop.DBus.Properties\">\n"
|
|
" <method name=\"Get\">\n"
|
|
" <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n"
|
|
" <arg name=\"propname\" direction=\"in\" type=\"s\"/>\n"
|
|
" <arg name=\"value\" direction=\"out\" type=\"v\"/>\n"
|
|
" </method>\n"
|
|
" <method name=\"Set\">\n"
|
|
" <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n"
|
|
" <arg name=\"propname\" direction=\"in\" type=\"s\"/>\n"
|
|
" <arg name=\"value\" direction=\"in\" type=\"v\"/>\n"
|
|
" </method>\n"
|
|
" <method name=\"GetAll\">\n"
|
|
" <arg name=\"interface\" direction=\"in\" type=\"s\"/>\n"
|
|
" <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>\n"
|
|
" </method>\n"
|
|
" </interface>\n";
|
|
constexpr const char footer[] = "</node>\n";
|
|
|
|
size_t result_len = strlen(header) + strlen(footer);
|
|
for (const string& xml : interface_xmls) {
|
|
result_len += xml.size();
|
|
}
|
|
|
|
string result = header;
|
|
result.reserve(result_len + 1); // +1 for null terminator
|
|
for (const string& xml : interface_xmls) {
|
|
result.append(xml);
|
|
}
|
|
result.append(footer);
|
|
return result;
|
|
}
|
|
|
|
} // namespace dbus_utils
|
|
} // namespace brillo
|