1 /* Copyright (C) 2013 BMW Group
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_
8 #define COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_
10 #include <CommonAPI/types.h>
11 #include <CommonAPI/Attribute.h>
12 #include <CommonAPI/Proxy.h>
14 #include "DBusProxyConnection.h"
15 #include "DBusAddressTranslator.h"
16 #include "DBusDaemonProxy.h"
18 #include <unordered_map>
21 #include <unordered_set>
29 #include <condition_variable>
35 typedef Event<std::string, std::string, std::string> NameOwnerChangedEvent;
36 typedef Event<std::string, std::string, std::string>::Subscription NameOwnerChangedEventSubscription;
38 //connectionName, objectPath
39 typedef std::pair<std::string, std::string> DBusInstanceId;
41 class DBusProxyConnection;
42 class DBusDaemonProxy;
45 class DBusServiceRegistry: public std::enable_shared_from_this<DBusServiceRegistry> {
47 enum class DBusServiceState {
55 typedef std::function<void(const AvailabilityStatus& availabilityStatus)> DBusServiceListener;
56 typedef std::list<DBusServiceListener> DBusServiceListenerList;
57 typedef DBusServiceListenerList::iterator Subscription;
59 typedef std::pair<std::string, std::string> DBusObjectInterfacePair;
60 typedef std::unordered_map<DBusObjectInterfacePair, std::pair<AvailabilityStatus, DBusServiceListenerList> > DBusInstanceList;
61 typedef std::unordered_map<std::string, std::pair<DBusServiceState, DBusInstanceList> > DBusServiceList;
64 DBusServiceRegistry(std::shared_ptr<DBusProxyConnection> dbusProxyConnection);
66 virtual ~DBusServiceRegistry();
70 bool isServiceInstanceAlive(const std::string& dbusInterfaceName, const std::string& dbusConnectionName, const std::string& dbusObjectPath);
72 Subscription subscribeAvailabilityListener(const std::string& commonApiAddress,
73 DBusServiceListener serviceListener);
74 void unsubscribeAvailabilityListener(const std::string& commonApiAddress,
75 Subscription& listenerSubscription);
77 virtual std::vector<std::string> getAvailableServiceInstances(const std::string& interfaceName,
78 const std::string& domainName = "local");
81 DBusServiceRegistry(const DBusServiceRegistry&) = delete;
82 DBusServiceRegistry& operator=(const DBusServiceRegistry&) = delete;
84 SubscriptionStatus onDBusDaemonProxyStatusEvent(const AvailabilityStatus& availabilityStatus);
85 SubscriptionStatus onDBusDaemonProxyNameOwnerChangedEvent(const std::string& name, const std::string& oldOwner, const std::string& newOwner);
87 void onListNamesCallback(const CommonAPI::CallStatus& callStatus, std::vector<std::string> dbusNames);
89 void resolveDBusServiceInstances(DBusServiceList::iterator& dbusServiceIterator);
90 void onGetManagedObjectsCallback(const CallStatus& status, DBusDaemonProxy::DBusObjectToInterfaceDict managedObjects, const std::string& dbusServiceName);
92 size_t getAvailableServiceInstances(const std::string& dbusInterfaceName, std::vector<std::string>& availableServiceInstances);
94 bool waitDBusServicesAvailable(std::unique_lock<std::mutex>& lock, std::chrono::milliseconds& timeout);
96 void onDBusServiceAvailabilityStatus(const std::string& dbusServiceName, const AvailabilityStatus& availabilityStatus);
97 DBusServiceList::iterator onDBusServiceAvailabilityStatus(DBusServiceList::iterator& dbusServiceIterator, const AvailabilityStatus& availabilityStatus);
98 DBusServiceList::iterator onDBusServiceOffline(DBusServiceList::iterator& dbusServiceIterator, const DBusServiceState& dbusServiceState);
100 static void onDBusServiceInstanceAvailable(
101 DBusInstanceList& dbusInstanceList,
102 const std::string& dbusObjectPath,
103 const std::string& dbusInterfaceName);
105 static DBusInstanceList::iterator addDBusServiceInstance(
106 DBusInstanceList& dbusInstanceList,
107 const std::string& dbusObjectPath,
108 const std::string& dbusInterfaceName);
110 static void notifyDBusServiceListeners(DBusServiceListenerList& dbusServiceListenerList, const AvailabilityStatus& availabilityStatus);
112 static bool isDBusServiceName(const std::string& name);
115 std::shared_ptr<DBusDaemonProxy> dbusDaemonProxy_;
117 DBusServiceList dbusServices_;
118 AvailabilityStatus dbusServicesStatus_;
119 std::condition_variable dbusServiceChanged_;
121 std::mutex dbusServicesMutex_;
123 ProxyStatusEvent::Subscription dbusDaemonProxyStatusEventSubscription_;
124 NameOwnerChangedEvent::Subscription dbusDaemonProxyNameOwnerChangedEventSubscription_;
128 } // namespace CommonAPI
130 #endif // COMMONAPI_DBUS_DBUS_SERVICE_REGISTRY_H_