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
11 #include <CommonAPI/types.h>
\r
12 #include <CommonAPI/Attribute.h>
\r
14 #include "DBusConnection.h"
\r
15 #include "DBusAddressTranslator.h"
\r
17 #include <unordered_map>
\r
19 #include <unordered_set>
\r
25 #include <algorithm>
\r
27 namespace CommonAPI {
\r
30 typedef Event<std::string, std::string, std::string> NameOwnerChangedEvent;
\r
31 typedef Event<std::string, std::string, std::string>::Subscription NameOwnerChangedEventSubscription;
\r
33 //connectionName, objectPath
\r
34 typedef std::pair<std::string, std::string> DBusInstanceId;
\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
40 class DBusConnection;
\r
41 class DBusDaemonProxy;
\r
44 class DBusServiceRegistry {
\r
46 static constexpr const char* getManagedObjectsDBusSignature_ = "a{oa{sa{sv}}}";
\r
48 DBusServiceRegistry() = delete;
\r
49 DBusServiceRegistry(const DBusServiceRegistry&) = delete;
\r
50 DBusServiceRegistry& operator=(const DBusServiceRegistry&) = delete;
\r
52 DBusServiceRegistry(std::shared_ptr<DBusConnection> connection);
\r
53 ~DBusServiceRegistry();
\r
55 std::vector<std::string> getAvailableServiceInstances(const std::string& interfaceName,
\r
56 const std::string& domainName = "local");
\r
58 bool isServiceInstanceAlive(const std::string& participantId,
\r
59 const std::string& serviceName,
\r
60 const std::string& domainName = "local") const;
\r
62 bool isServiceInstanceAlive(const std::string& address) const;
\r
64 bool isReady() const;
\r
66 bool isReadyBlocking() const;
\r
68 void registerAvailabilityListener(const std::string& service, const std::function<void(bool)>& listener);
\r
70 std::future<bool>& getReadyFuture();
\r
72 DBusServiceStatusEvent& getServiceStatusEvent();
\r
75 void cacheAllServices();
\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
82 void getManagedObjects(const std::string& serviceBusName);
\r
84 void onDBusNameOwnerChangedEvent(const std::string& name, const std::string& oldOwner, const std::string& newOwner);
\r
86 bool isRemoteServiceVersionMatchingLocalVersion(const std::string& serviceBusName, const std::string& serviceInterfaceName);
\r
87 bool isServiceInstanceAliveHelper(const std::string& connectionName) const;
\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
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
95 std::multimap<std::string, DBusInstanceId> dbusCachedProvidersForInterfaces_;
\r
97 std::shared_ptr<DBusConnection> dbusConnection_;
\r
99 std::unordered_multimap<std::string, std::function<void(bool)>> availabilityCallbackList;
\r
101 NameOwnerChangedEvent::Subscription dbusNameOwnerChangedEventSubscription_;
\r
103 mutable bool ready;
\r
104 mutable std::future<bool> readyFuture_;
\r
105 mutable std::promise<bool> readyPromise_;
\r
107 mutable std::mutex readyMutex_;
\r
109 DBusServiceStatusEvent serviceStatusEvent_;
\r
112 } // namespace DBus
\r
113 } // namespace CommonAPI
\r
115 #endif // COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_
\r