summaryrefslogtreecommitdiff
path: root/include/CommonAPI/DBus/DBusEvent.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/CommonAPI/DBus/DBusEvent.hpp')
-rw-r--r--include/CommonAPI/DBus/DBusEvent.hpp50
1 files changed, 47 insertions, 3 deletions
diff --git a/include/CommonAPI/DBus/DBusEvent.hpp b/include/CommonAPI/DBus/DBusEvent.hpp
index a3bfe01..3ce945c 100644
--- a/include/CommonAPI/DBus/DBusEvent.hpp
+++ b/include/CommonAPI/DBus/DBusEvent.hpp
@@ -24,6 +24,7 @@ namespace DBus {
template <typename _Event, typename... _Arguments>
class DBusEvent: public _Event, public DBusProxyConnection::DBusSignalHandler {
public:
+ typedef typename _Event::Subscription Subscription;
typedef typename _Event::Listener Listener;
DBusEvent(DBusProxyBase &_proxy,
@@ -31,6 +32,7 @@ public:
std::tuple<_Arguments...> _arguments)
: proxy_(_proxy),
name_(_name), signature_(_signature),
+ getMethodName_(""),
arguments_(_arguments) {
interface_ = proxy_.getDBusAddress().getInterface();
@@ -44,9 +46,25 @@ public:
: proxy_(_proxy),
name_(_name), signature_(_signature),
path_(_path), interface_(_interface),
+ getMethodName_(""),
arguments_(_arguments) {
}
+ DBusEvent(DBusProxyBase &_proxy,
+ const std::string &_name,
+ const std::string &_signature,
+ const std::string &_getMethodName,
+ std::tuple<_Arguments...> _arguments)
+ : proxy_(_proxy),
+ name_(_name),
+ signature_(_signature),
+ getMethodName_(_getMethodName),
+ arguments_(_arguments) {
+
+ interface_ = proxy_.getDBusAddress().getInterface();
+ path_ = proxy_.getDBusAddress().getObjectPath();
+ }
+
virtual ~DBusEvent() {
proxy_.removeSignalMemberHandler(subscription_, this);
}
@@ -54,14 +72,29 @@ public:
virtual void onSignalDBusMessage(const DBusMessage &_message) {
handleSignalDBusMessage(_message, typename make_sequence<sizeof...(_Arguments)>::type());
}
+
+ virtual void onInitialValueSignalDBusMessage(const DBusMessage&_message, const uint32_t tag) {
+ handleSignalDBusMessage(tag, _message, typename make_sequence<sizeof...(_Arguments)>::type());
+ }
+
protected:
- virtual void onFirstListenerAdded(const Listener&) {
- subscription_ = proxy_.addSignalMemberHandler(
- path_, interface_, name_, signature_, this);
+ virtual void onFirstListenerAdded(const Listener& listener) {
+ subscription_ = proxy_.addSignalMemberHandler(
+ path_, interface_, name_, signature_, getMethodName_, this, false);
+ }
+
+ virtual void onListenerAdded(const Listener& listener, const Subscription subscription) {
+ if ("" != getMethodName_) {
+ proxy_.getCurrentValueForSignalListener(getMethodName_, this, subscription);
+ }
}
virtual void onLastListenerRemoved(const Listener&) {
proxy_.removeSignalMemberHandler(subscription_, this);
+ std::get<0>(subscription_) = "";
+ std::get<1>(subscription_) = "";
+ std::get<2>(subscription_) = "";
+ std::get<3>(subscription_) = "";
}
template<int ... _Indices>
@@ -74,12 +107,23 @@ public:
}
}
+ template<int ... _Indices>
+ inline void handleSignalDBusMessage(const uint32_t tag, const DBusMessage &_message, index_sequence<_Indices...>) {
+ DBusInputStream input(_message);
+ if (DBusSerializableArguments<
+ _Arguments...
+ >::deserialize(input, std::get<_Indices>(arguments_)...)) {
+ this->notifySpecificListener(tag, std::get<_Indices>(arguments_)...);
+ }
+ }
+
DBusProxyBase &proxy_;
std::string name_;
std::string signature_;
std::string path_;
std::string interface_;
+ std::string getMethodName_;
DBusProxyConnection::DBusSignalHandlerToken subscription_;
std::tuple<_Arguments...> arguments_;