diff options
Diffstat (limited to 'frameworks/middleware/examples/dbus/ping-server.c')
| -rw-r--r-- | frameworks/middleware/examples/dbus/ping-server.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/frameworks/middleware/examples/dbus/ping-server.c b/frameworks/middleware/examples/dbus/ping-server.c new file mode 100644 index 0000000..36dd122 --- /dev/null +++ b/frameworks/middleware/examples/dbus/ping-server.c @@ -0,0 +1,72 @@ +#include <dbus/dbus.h> +#include <dbus/dbus-glib.h> +#include <time.h> + +static DBusHandlerResult signal_filter + (DBusConnection *connection, DBusMessage *message, void *user_data); + +int main(int argc, char **argv) +{ + GMainLoop *loop; + DBusConnection *bus; + DBusError error; + + loop = g_main_loop_new (NULL, FALSE); + dbus_error_init (&error); + bus = dbus_bus_get (DBUS_BUS_SESSION, &error); + + if (!bus) { + g_warning ("Failed to connect to the D-BUS daemon: %s", error.message); + dbus_error_free (&error); + return 1; + } + + dbus_connection_setup_with_g_main (bus, NULL); + /* listening to messages from all objects as no path is specified */ + dbus_bus_add_match (bus, "type='signal',interface='de.linutronix.Ping'", + &error); + dbus_connection_add_filter (bus, signal_filter, loop, NULL); + g_main_loop_run (loop); + + return 0; +} + +static DBusHandlerResult signal_filter + (DBusConnection *connection, DBusMessage *message, void *user_data) +{ + /* User data is the event loop we are running in */ + GMainLoop *loop = user_data; + + /* A signal from the bus saying we are about to be disconnected */ + if (dbus_message_is_signal(message, "org.freedesktop.Local", + "Disconnected")) + { + /* Tell the main loop to quit */ + g_main_loop_quit (loop); + /* We have handled this message, don't pass it on */ + return DBUS_HANDLER_RESULT_HANDLED; + } + else if (dbus_message_is_signal (message, "de.linutronix.Ping", "Ping")) + { + DBusError error; + char *s; + + dbus_error_init (&error); + + if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &s, + DBUS_TYPE_INVALID)) + { + struct timespec rx_time; + clock_gettime(CLOCK_MONOTONIC, &rx_time); + g_print("ping received: %s - %d:%d\n", s, rx_time.tv_sec, + rx_time.tv_nsec/1000); + // dbus_free (s); + } else { + g_print("ping received, but error getting message: %s\n", error.message); + dbus_error_free (&error); + } + return DBUS_HANDLER_RESULT_HANDLED; + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + |
