1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #include "DBusStubAdapter.h"
6 #include <dbus/dbus-protocol.h>
15 const std::string DBusStubAdapter::domain_ = "local";
17 DBusStubAdapter::DBusStubAdapter(const std::string& dbusBusName,
18 const std::string& dbusObjectPath,
19 const std::string& interfaceName,
20 const std::shared_ptr<DBusProxyConnection>& dbusConnection) :
21 dbusBusName_(dbusBusName),
22 dbusObjectPath_(dbusObjectPath),
23 interfaceName_(interfaceName),
24 dbusConnection_(dbusConnection),
25 isInitialized_(false) {
27 assert(!dbusBusName_.empty());
28 assert(!interfaceName_.empty());
29 assert(!dbusObjectPath_.empty());
30 assert(dbusObjectPath_[0] == '/');
31 assert(!interfaceName.empty());
32 assert(dbusConnection_);
35 DBusStubAdapter::~DBusStubAdapter() {
36 assert(dbusConnection_);
37 assert(isInitialized_);
39 dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusIntrospectionInterfaceHandlerToken_);
40 dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusInterfaceHandlerToken_);
43 void DBusStubAdapter::init() {
44 dbusIntrospectionInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
46 "org.freedesktop.DBus.Introspectable",
47 std::bind(&DBusStubAdapter::onIntrospectionInterfaceDBusMessage, this, std::placeholders::_1));
49 dbusInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
52 std::bind(&DBusStubAdapter::onInterfaceDBusMessage, this, std::placeholders::_1));
54 isInitialized_ = true;
57 const std::string DBusStubAdapter::getAddress() const {
58 return domain_ + ":" + interfaceName_ + ":" + dbusBusName_;
61 const std::string& DBusStubAdapter::getDomain() const {
65 const std::string& DBusStubAdapter::getServiceId() const {
66 return interfaceName_;
69 const std::string& DBusStubAdapter::getInstanceId() const {
70 return dbusObjectPath_;
73 bool DBusStubAdapter::onIntrospectionInterfaceDBusMessage(const DBusMessage& dbusMessage) {
74 bool dbusMessageHandled = false;
76 if (dbusMessage.isMethodCallType() && dbusMessage.hasMemberName("Introspect")) {
77 std::stringstream xmlData(std::ios_base::out);
78 xmlData << "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\""
79 DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n"
80 "<node name=\"" << dbusObjectPath_ << "\">\n"
81 "<interface name=\"org.freedesktop.DBus.Introspectable\">\n"
82 "<method name=\"Introspect\">\n"
83 "<arg type=\"s\" name=\"xml_data\" direction=\"out\"/>\n"
86 "<interface name=\"" << interfaceName_ << "\">\n"
87 << getMethodsDBusIntrospectionXmlData() << "\n"
91 DBusMessage dbusMessageReply = dbusMessage.createMethodReturn("s");
92 DBusOutputStream dbusOutputStream(dbusMessageReply);
93 dbusOutputStream << xmlData.str();
94 dbusOutputStream.flush();
96 dbusMessageHandled = dbusConnection_->sendDBusMessage(dbusMessageReply);
99 return dbusMessageHandled;
103 } // namespace CommonAPI