Bugfixing, regenerated test files
[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& dbusInterfaceName,\r
59                                 const std::string& dbusConnectionName,\r
60                                 const std::string& dbusObjectPath) const;\r
61 \r
62     bool isReady() const;\r
63 \r
64     bool isReadyBlocking() const;\r
65 \r
66     void registerAvailabilityListener(const std::string& service, const std::function<void(bool)>& listener);\r
67 \r
68     std::future<bool>& getReadyFuture();\r
69 \r
70     DBusServiceStatusEvent& getServiceStatusEvent();\r
71 \r
72  private:\r
73     void cacheAllServices();\r
74 \r
75     void removeProvidedServiceInstancesFromCache(const std::string& serviceBusName);\r
76     void addProvidedServiceInstancesToCache(std::vector<std::string>& dbusNames);\r
77     void addProvidedServiceInstancesToCache(const std::string& dbusNames);\r
78     void addAllProvidedServiceInstancesToCache(const std::vector<std::string>& serviceBusNames);\r
79 \r
80     void getManagedObjects(const std::string& serviceBusName);\r
81 \r
82     void onDBusNameOwnerChangedEvent(const std::string& name, const std::string& oldOwner, const std::string& newOwner);\r
83 \r
84     bool isRemoteServiceVersionMatchingLocalVersion(const std::string& serviceBusName, const std::string& serviceInterfaceName);\r
85     bool isServiceInstanceAliveHelper(const std::string& connectionName) 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     void onListNames(const CommonAPI::CallStatus&, std::vector<std::string>);\r
91     void updateListeners(const std::string& conName, const std::string& objName, const std::string& intName , bool available);\r
92 \r
93     std::multimap<std::string, DBusInstanceId> dbusCachedProvidersForInterfaces_;\r
94 \r
95     std::shared_ptr<DBusConnection> dbusConnection_;\r
96 \r
97     std::unordered_multimap<std::string, std::function<void(bool)>> availabilityCallbackList;\r
98 \r
99     NameOwnerChangedEvent::Subscription dbusNameOwnerChangedEventSubscription_;\r
100 \r
101     mutable bool ready;\r
102     mutable std::future<bool> readyFuture_;\r
103     mutable std::promise<bool> readyPromise_;\r
104 \r
105     mutable std::mutex readyMutex_;\r
106 \r
107     DBusServiceStatusEvent serviceStatusEvent_;\r
108 };\r
109 \r
110 } // namespace DBus\r
111 } // namespace CommonAPI\r
112 \r
113 #endif // COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_\r