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
8 #include <CommonAPI/types.h>
\r
9 #include <CommonAPI/Attribute.h>
\r
11 #include "DBusConnection.h"
\r
13 #include <unordered_map>
\r
15 #include <unordered_set>
\r
22 namespace CommonAPI {
\r
25 typedef Event<std::string, std::string, std::string> NameOwnerChangedEvent;
\r
27 typedef Event<std::string, std::string, std::string>::Subscription NameOwnerChangedEventSubscription;
\r
29 typedef std::pair<std::string, std::string> DBusServiceInstanceId;
\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
35 class DBusConnection;
\r
36 class DBusDaemonProxy;
\r
39 class DBusServiceRegistry {
\r
41 static constexpr const char* getManagedObjectsDBusSignature_ = "a{oa{sa{sv}}}";
\r
43 DBusServiceRegistry() = delete;
\r
44 DBusServiceRegistry(const DBusServiceRegistry&) = delete;
\r
45 DBusServiceRegistry& operator=(const DBusServiceRegistry&) = delete;
\r
47 DBusServiceRegistry(std::shared_ptr<DBusConnection> connection);
\r
48 ~DBusServiceRegistry();
\r
50 std::vector<std::string> getAvailableServiceInstances(const std::string& interfaceName,
\r
51 const std::string& domainName = "local");
\r
53 bool isServiceInstanceAlive(const std::string& instanceID,
\r
54 const std::string& interfaceName,
\r
55 const std::string& domainName = "local");
\r
57 bool isServiceInstanceAlive(const std::string& address);
\r
61 bool isReadyBlocking();
\r
63 void registerAvailabilityListener(const std::string& service, const std::function<void(bool)>& listener);
\r
65 std::future<bool>& getReadyFuture();
\r
67 DBusServiceStatusEvent& getServiceStatusEvent();
\r
70 void cacheAllServices();
\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
77 void getManagedObjects(const std::string& serviceBusName);
\r
79 void onDBusNameOwnerChangedEvent(const std::string& name, const std::string& oldOwner, const std::string& newOwner);
\r
81 bool isRemoteServiceVersionMatchingLocalVersion(const std::string& serviceBusName, const std::string& serviceInterfaceName);
\r
82 bool isServiceInstanceAliveHelper(const std::string& connectionName) const;
\r
84 DBusServiceInstanceId findInstanceIdMapping(const std::string& instanceId) const;
\r
85 std::string findInstanceIdMapping(const DBusServiceInstanceId& dbusInstanceId) const;
\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
90 std::multimap<std::string, DBusServiceInstanceId> dbusCachedProvidersForInterfaces_;
\r
92 std::shared_ptr<DBusConnection> dbusConnection_;
\r
94 std::unordered_multimap<std::string, std::function<void(bool)>> availabilityCallbackList;
\r
98 void onListNames(const CommonAPI::CallStatus&, std::vector<std::string>);
\r
100 NameOwnerChangedEvent::Subscription dbusNameOwnerChangedEventSubscription_;
\r
102 void updateListeners(const std::string& conName, const std::string& objName, const std::string& intName , bool available);
\r
104 mutable std::future<bool> readyFuture_;
\r
105 mutable std::promise<bool> readyPromise_;
\r
107 std::mutex readyMutex_;
\r
109 DBusServiceStatusEvent serviceStatusEvent_;
\r
113 } // namespace DBus
\r
114 } // namespace CommonAPI
\r
116 #endif // COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_
\r