1 #ifndef _DBUSSIGNALLER_H_
2 #define _DBUSSIGNALLER_H_
9 #include "abstractproperty.h"
15 static DBusSignaller* factory(int timeout)
18 return singleton = new DBusSignaller(timeout);
22 void fireSignal(GDBusConnection* conn, std::string objPath, std::string iface, std::string sigName, AbstractProperty* prop)
24 DBusSignal signal(conn, objPath, iface, sigName, prop);
26 queue[objPath] = signal;
32 DBusSignal():connection(nullptr), property(nullptr){}
33 DBusSignal(GDBusConnection* conn, std::string objPath, std::string iface, std::string sigName, AbstractProperty* var)
34 : connection(conn), objectPath(objPath), interface(iface), signalName(sigName), property(var)
39 GDBusConnection* connection;
40 std::string objectPath;
41 std::string interface;
42 std::string signalName;
43 AbstractProperty* property;
50 DBusSignaller(int timeout)
52 g_timeout_add(timeout,[](gpointer userData)
54 std::map<std::string, DBusSignal> *q = static_cast<std::map<std::string, DBusSignal>*>(userData);
55 std::map<std::string, DBusSignal> queue = *q;
59 DBusSignal signal = sig.second;
61 GError* error = nullptr;
63 AbstractProperty* property = signal.property;
65 GVariant* val = g_variant_ref(property->toGVariant());
67 /// Send PropertiesChanged signal
69 GVariantBuilder builder;
70 g_variant_builder_init(&builder, G_VARIANT_TYPE_DICTIONARY);
72 g_variant_builder_add(&builder, "{sv}", property->name().c_str(), val);
73 g_variant_builder_add(&builder, "{sv}", std::string(property->name() + "Sequence").c_str(), g_variant_new("i", property->sequence()));
74 g_variant_builder_add(&builder, "{sv}", "Time", g_variant_new("d", property->timestamp()) );
76 g_dbus_connection_emit_signal(signal.connection, NULL, signal.objectPath.c_str(), signal.interface.c_str(), signal.signalName.c_str(), g_variant_new("(sa{sv}as)",
77 signal.interface.c_str(),
78 &builder, NULL), &error);
82 DebugOut(DebugOut::Error)<<error->message<<std::endl;
85 queue.erase(signal.objectPath);
96 std::map<std::string, DBusSignal> queue;
98 static DBusSignaller * singleton;