Initial import to Git
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusStubAdapter.cpp
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"
5
6 #include <dbus/dbus-protocol.h>
7
8 #include <cassert>
9 #include <functional>
10 #include <sstream>
11
12 namespace CommonAPI {
13 namespace DBus {
14
15 const std::string DBusStubAdapter::domain_ = "local";
16
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) {
26
27     assert(!dbusBusName_.empty());
28     assert(!interfaceName_.empty());
29     assert(!dbusObjectPath_.empty());
30     assert(dbusObjectPath_[0] == '/');
31     assert(!interfaceName.empty());
32     assert(dbusConnection_);
33 }
34
35 DBusStubAdapter::~DBusStubAdapter() {
36         assert(dbusConnection_);
37         assert(isInitialized_);
38
39     dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusIntrospectionInterfaceHandlerToken_);
40         dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusInterfaceHandlerToken_);
41 }
42
43 void DBusStubAdapter::init() {
44     dbusIntrospectionInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
45                     dbusObjectPath_,
46                     "org.freedesktop.DBus.Introspectable",
47                     std::bind(&DBusStubAdapter::onIntrospectionInterfaceDBusMessage, this, std::placeholders::_1));
48
49     dbusInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
50                     dbusObjectPath_,
51                     interfaceName_,
52                     std::bind(&DBusStubAdapter::onInterfaceDBusMessage, this, std::placeholders::_1));
53
54     isInitialized_ = true;
55 }
56
57 const std::string DBusStubAdapter::getAddress() const {
58         return domain_ + ":" + interfaceName_ + ":" + dbusBusName_;
59 }
60
61 const std::string& DBusStubAdapter::getDomain() const {
62     return domain_;
63 }
64
65 const std::string& DBusStubAdapter::getServiceId() const {
66     return interfaceName_;
67 }
68
69 const std::string& DBusStubAdapter::getInstanceId() const {
70     return dbusObjectPath_;
71 }
72
73 bool DBusStubAdapter::onIntrospectionInterfaceDBusMessage(const DBusMessage& dbusMessage) {
74     bool dbusMessageHandled = false;
75
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"
84                            "</method>\n"
85                        "</interface>\n"
86                        "<interface name=\"" << interfaceName_ << "\">\n"
87                            << getMethodsDBusIntrospectionXmlData() << "\n"
88                        "</interface>\n"
89                    "</node>";
90
91         DBusMessage dbusMessageReply = dbusMessage.createMethodReturn("s");
92         DBusOutputStream dbusOutputStream(dbusMessageReply);
93         dbusOutputStream << xmlData.str();
94         dbusOutputStream.flush();
95
96         dbusMessageHandled = dbusConnection_->sendDBusMessage(dbusMessageReply);
97     }
98
99     return dbusMessageHandled;
100 }
101
102 } // namespace dbus
103 } // namespace CommonAPI