Configuration for object paths and connection names incorporated.
[profile/ivi/common-api-dbus-runtime.git] / src / CommonAPI / DBus / DBusServiceRegistry.h
1 /* Copyright (C) 2013 BMW Group\r
2  * Author: Manfred Bathelt (manfred.bathelt@bmw.de)\r
3  * Author: Juergen Gehring (juergen.gehring@bmw.de)\r
4  * This Source Code Form is subject to the terms of the Mozilla Public\r
5  * License, v. 2.0. If a copy of the MPL was not distributed with this\r
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
7 #ifndef COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_\r
8 #define COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_\r
9 \r
10 \r
11 #include <CommonAPI/types.h>\r
12 #include <CommonAPI/Attribute.h>\r
13 \r
14 #include "DBusConnection.h"\r
15 #include "DBusAddressTranslator.h"\r
16 \r
17 #include <unordered_map>\r
18 #include <map>\r
19 #include <unordered_set>\r
20 #include <string>\r
21 #include <vector>\r
22 #include <memory>\r
23 #include <list>\r
24 #include <mutex>\r
25 #include <algorithm>\r
26 \r
27 namespace CommonAPI {\r
28 namespace DBus {\r
29 \r
30 typedef Event<std::string, std::string, std::string> NameOwnerChangedEvent;\r
31 typedef Event<std::string, std::string, std::string>::Subscription NameOwnerChangedEventSubscription;\r
32 \r
33 //connectionName, objectPath\r
34 typedef std::pair<std::string, std::string> DBusInstanceId;\r
35 \r
36 typedef std::unordered_map<std::string, int> PropertyDictStub;\r
37 typedef std::unordered_map<std::string, PropertyDictStub> InterfaceToPropertyDict;\r
38 typedef std::unordered_map<std::string, InterfaceToPropertyDict> DBusObjectToInterfaceDict;\r
39 \r
40 class DBusConnection;\r
41 class DBusDaemonProxy;\r
42 \r
43 \r
44 class DBusServiceRegistry {\r
45  public:\r
46     static constexpr const char* getManagedObjectsDBusSignature_ = "a{oa{sa{sv}}}";\r
47 \r
48     DBusServiceRegistry() = delete;\r
49     DBusServiceRegistry(const DBusServiceRegistry&) = delete;\r
50     DBusServiceRegistry& operator=(const DBusServiceRegistry&) = delete;\r
51 \r
52     DBusServiceRegistry(std::shared_ptr<DBusConnection> connection);\r
53     ~DBusServiceRegistry();\r
54 \r
55     std::vector<std::string> getAvailableServiceInstances(const std::string& interfaceName,\r
56                                                           const std::string& domainName = "local");\r
57 \r
58     bool isServiceInstanceAlive(const std::string& participantId,\r
59                                 const std::string& serviceName,\r
60                                 const std::string& domainName = "local") const;\r
61 \r
62     bool isServiceInstanceAlive(const std::string& address) const;\r
63 \r
64     bool isReady() const;\r
65 \r
66     bool isReadyBlocking() const;\r
67 \r
68     void registerAvailabilityListener(const std::string& service, const std::function<void(bool)>& listener);\r
69 \r
70     std::future<bool>& getReadyFuture();\r
71 \r
72     DBusServiceStatusEvent& getServiceStatusEvent();\r
73 \r
74  private:\r
75     void cacheAllServices();\r
76 \r
77     void removeProvidedServiceInstancesFromCache(const std::string& serviceBusName);\r
78     void addProvidedServiceInstancesToCache(std::vector<std::string>& dbusNames);\r
79     void addProvidedServiceInstancesToCache(const std::string& dbusNames);\r
80     void addAllProvidedServiceInstancesToCache(const std::vector<std::string>& serviceBusNames);\r
81 \r
82     void getManagedObjects(const std::string& serviceBusName);\r
83 \r
84     void onDBusNameOwnerChangedEvent(const std::string& name, const std::string& oldOwner, const std::string& newOwner);\r
85 \r
86     bool isRemoteServiceVersionMatchingLocalVersion(const std::string& serviceBusName, const std::string& serviceInterfaceName);\r
87     bool isServiceInstanceAliveHelper(const std::string& connectionName) const;\r
88 \r
89     void onManagedPaths(const CallStatus& status, DBusObjectToInterfaceDict replyMessage, std::string dbusWellKnownBusName);\r
90     void onManagedPathsList(const CallStatus& status, DBusObjectToInterfaceDict managedObjects, std::list<std::string>::iterator iter, std::shared_ptr<std::list<std::string>> list);\r
91 \r
92     void onListNames(const CommonAPI::CallStatus&, std::vector<std::string>);\r
93     void updateListeners(const std::string& conName, const std::string& objName, const std::string& intName , bool available);\r
94 \r
95     std::multimap<std::string, DBusInstanceId> dbusCachedProvidersForInterfaces_;\r
96 \r
97     std::shared_ptr<DBusConnection> dbusConnection_;\r
98 \r
99     std::unordered_multimap<std::string, std::function<void(bool)>> availabilityCallbackList;\r
100 \r
101     NameOwnerChangedEvent::Subscription dbusNameOwnerChangedEventSubscription_;\r
102 \r
103     mutable bool ready;\r
104     mutable std::future<bool> readyFuture_;\r
105     mutable std::promise<bool> readyPromise_;\r
106 \r
107     mutable std::mutex readyMutex_;\r
108 \r
109     DBusServiceStatusEvent serviceStatusEvent_;\r
110 };\r
111 \r
112 } // namespace DBus\r
113 } // namespace CommonAPI\r
114 \r
115 #endif // COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_\r