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