Added a way to deinitialize running services
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusStubAdapter.cpp
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"
8 #include "DBusUtils.h"
9
10 #include <dbus/dbus-protocol.h>
11
12 #include <cassert>
13 #include <functional>
14 #include <sstream>
15
16 namespace CommonAPI {
17 namespace DBus {
18
19 const std::string DBusStubAdapter::domain_ = "local";
20
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) {
34
35     assert(!dbusBusName_.empty());
36     assert(!dbusInterfaceName_.empty());
37     assert(!dbusObjectPath_.empty());
38     assert(dbusObjectPath_[0] == '/');
39     assert(!dbusInterfaceName_.empty());
40     assert(dbusConnection_);
41 }
42
43 DBusStubAdapter::~DBusStubAdapter() {
44 }
45
46 void DBusStubAdapter::deinit() {
47         assert(dbusConnection_);
48         assert(isInitialized_);
49
50         dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusIntrospectionInterfaceHandlerToken_);
51         dbusConnection_->getDBusObjectManager()->unregisterInterfaceHandler(dbusInterfaceHandlerToken_);
52 }
53
54 void DBusStubAdapter::init() {
55     dbusIntrospectionInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
56                     dbusObjectPath_,
57                     "org.freedesktop.DBus.Introspectable",
58                     std::bind(&DBusStubAdapter::onIntrospectionInterfaceDBusMessage, this, std::placeholders::_1));
59
60     dbusInterfaceHandlerToken_ = dbusConnection_->getDBusObjectManager()->registerInterfaceHandler(
61                     dbusObjectPath_,
62                     dbusInterfaceName_,
63                     std::bind(&DBusStubAdapter::onInterfaceDBusMessage, this, std::placeholders::_1));
64
65     isInitialized_ = true;
66 }
67
68 const std::string DBusStubAdapter::getAddress() const {
69     return commonApiDomain_ + ":" + commonApiServiceId_ + ":" + commonApiParticipantId_;
70 }
71
72 const std::string& DBusStubAdapter::getDomain() const {
73     return commonApiDomain_;
74 }
75
76 const std::string& DBusStubAdapter::getServiceId() const {
77     return commonApiServiceId_;
78 }
79
80 const std::string& DBusStubAdapter::getInstanceId() const {
81     return commonApiParticipantId_;
82 }
83
84 bool DBusStubAdapter::onIntrospectionInterfaceDBusMessage(const DBusMessage& dbusMessage) {
85     bool dbusMessageHandled = false;
86
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"
95                            "</method>\n"
96                        "</interface>\n"
97                        "<interface name=\"" << dbusInterfaceName_ << "\">\n"
98                            << getMethodsDBusIntrospectionXmlData() << "\n"
99                        "</interface>\n"
100                    "</node>";
101
102         DBusMessage dbusMessageReply = dbusMessage.createMethodReturn("s");
103         DBusOutputStream dbusOutputStream(dbusMessageReply);
104         dbusOutputStream << xmlData.str();
105         dbusOutputStream.flush();
106
107         dbusMessageHandled = dbusConnection_->sendDBusMessage(dbusMessageReply);
108     }
109
110     return dbusMessageHandled;
111 }
112
113 } // namespace dbus
114 } // namespace CommonAPI