1 /* Copyright (C) 2013 BMW Group
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "DBusStubAdapter.h"
10 #include <dbus/dbus-protocol.h>
19 const std::string DBusStubAdapter::domain_ = "local";
21 DBusStubAdapter::DBusStubAdapter(const std::string& commonApiAddress,
22 const std::string& dbusInterfaceName,
23 const std::string& dbusBusName,
24 const std::string& dbusObjectPath,
25 const std::shared_ptr<DBusProxyConnection>& dbusConnection) :
26 commonApiDomain_(split(commonApiAddress, ':')[0]),
27 commonApiServiceId_(split(commonApiAddress, ':')[1]),
28 commonApiParticipantId_(split(commonApiAddress, ':')[2]),
29 dbusInterfaceName_(dbusInterfaceName),
30 dbusBusName_(dbusBusName),
31 dbusObjectPath_(dbusObjectPath),
32 dbusConnection_(dbusConnection),
33 isInitialized_(false) {
35 assert(!dbusBusName_.empty());
36 assert(!dbusInterfaceName_.empty());
37 assert(!dbusObjectPath_.empty());
38 assert(dbusObjectPath_[0] == '/');
39 assert(!dbusInterfaceName_.empty());
40 assert(dbusConnection_);
43 DBusStubAdapter::~DBusStubAdapter() {
46 void DBusStubAdapter::deinit() {
47 assert(dbusConnection_);
48 assert(isInitialized_);
50 dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusIntrospectionInterfaceHandlerToken_);
51 dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusInterfaceHandlerToken_);
54 void DBusStubAdapter::init() {
55 dbusIntrospectionInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
57 "org.freedesktop.DBus.Introspectable",
58 std::bind(&DBusStubAdapter::onIntrospectionInterfaceDBusMessage, this, std::placeholders::_1));
60 dbusInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
63 std::bind(&DBusStubAdapter::onInterfaceDBusMessage, this, std::placeholders::_1));
65 isInitialized_ = true;
68 const std::string DBusStubAdapter::getAddress() const {
69 return commonApiDomain_ + ":" + commonApiServiceId_ + ":" + commonApiParticipantId_;
72 const std::string& DBusStubAdapter::getDomain() const {
73 return commonApiDomain_;
76 const std::string& DBusStubAdapter::getServiceId() const {
77 return commonApiServiceId_;
80 const std::string& DBusStubAdapter::getInstanceId() const {
81 return commonApiParticipantId_;
84 bool DBusStubAdapter::onIntrospectionInterfaceDBusMessage(const DBusMessage& dbusMessage) {
85 bool dbusMessageHandled = false;
87 if (dbusMessage.isMethodCallType() && dbusMessage.hasMemberName("Introspect")) {
88 std::stringstream xmlData(std::ios_base::out);
89 xmlData << "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\""
90 DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n"
91 "<node name=\"" << dbusObjectPath_ << "\">\n"
92 "<interface name=\"org.freedesktop.DBus.Introspectable\">\n"
93 "<method name=\"Introspect\">\n"
94 "<arg type=\"s\" name=\"xml_data\" direction=\"out\"/>\n"
97 "<interface name=\"" << dbusInterfaceName_ << "\">\n"
98 << getMethodsDBusIntrospectionXmlData() << "\n"
102 DBusMessage dbusMessageReply = dbusMessage.createMethodReturn("s");
103 DBusOutputStream dbusOutputStream(dbusMessageReply);
104 dbusOutputStream << xmlData.str();
105 dbusOutputStream.flush();
107 dbusMessageHandled = dbusConnection_->sendDBusMessage(dbusMessageReply);
110 return dbusMessageHandled;
114 } // namespace CommonAPI