From 1fdeea09282c898d637d61178a64a870439e45f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sl=C3=A1vek=20Banko?= Date: Sun, 25 Aug 2013 15:18:47 +0200 Subject: Supplementing tdehwlib dbus daemon: + Add reply to method Introspect + Processing signal NameAcquired + Error response to non-existent methods --- .../hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c | 151 ++++++++++++++++++++- 1 file changed, 146 insertions(+), 5 deletions(-) diff --git a/tdecore/tdehw/hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c b/tdecore/tdehw/hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c index 4cdbcea9b..24a391a3c 100644 --- a/tdecore/tdehw/hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c +++ b/tdecore/tdehw/hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c @@ -286,14 +286,149 @@ void reply_SetPower(DBusMessage* msg, DBusConnection* conn, char* state) { reply_SetGivenPath(msg, conn, "/sys/power/state", state); } -void listen() { - DBusMessage* msg; +void signal_NameAcquired(DBusMessage* msg) { + DBusMessageIter args; + char *name = NULL; + if(dbus_message_iter_init(msg, &args)) { + if(DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&args)) { + dbus_message_iter_get_basic(&args, &name); + } + } + fprintf(stderr, "[tde_dbus_hardwarecontrol] Name acquired: %s\n", name); +} + +void reply_Introspect(DBusMessage* msg, DBusConnection* conn) { DBusMessage* reply; DBusMessageIter args; + dbus_uint32_t serial = 0; + size_t size = 2048; + const char* member = dbus_message_get_member(msg); + const char *path = dbus_message_get_path(msg); + char *data = malloc(size); + + // compose reply + strncpy(data, + "\n", + size); + strncat(data, "\n", size-strlen(data)); + if(strcmp("/", path) == 0) { + strncat(data, " \n", size-strlen(data)); + } + else if(strcmp("/org", path) == 0) { + strncat(data, " \n", size-strlen(data)); + } + else if(strcmp("/org/trinitydesktop", path) == 0) { + strncat(data, " \n", size-strlen(data)); + } + else if(strcmp("/org/trinitydesktop/hardwarecontrol", path) == 0) { + strncat(data, + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n", + size-strlen(data)); + strncat(data, + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n", + size-strlen(data)); + strncat(data, + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n", + size-strlen(data)); + } + strncat(data, "\n", size-strlen(data)); + + // create a reply from the message + reply = dbus_message_new_method_return(msg); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &data)) { + fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_message_iter_append_basic failed\n", member); + return; + } + + // send the reply && flush the connection + if (!dbus_connection_send(conn, reply, &serial)) { + fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_connection_send failed\n", member); + return; + } + dbus_connection_flush(conn); + + // free the reply + dbus_message_unref(reply); + free((void*)data); +} + +void error_UnknownMessage(DBusMessage* msg, DBusConnection* conn) { + DBusMessage* reply; + dbus_uint32_t serial = 0; + const char* member = dbus_message_get_member(msg); + const char* interface = dbus_message_get_interface(msg); + + // print message + fprintf(stderr, "[tde_dbus_hardwarecontrol] Unknown method '%s' called on interface '%s', ignoring\n", member, interface); + if (DBUS_MESSAGE_TYPE_METHOD_CALL != dbus_message_get_type(msg)) { + return; + } + + // create a reply from the message + reply = dbus_message_new_error_printf(msg, + "org.freedesktop.DBus.Error.UnknownMethod", + "Method \"%s\" on interface \"%s\" doesn't exist", + member, interface); + + // send the reply && flush the connection + if (!dbus_connection_send(conn, reply, &serial)) { + fprintf(stderr, "[tde_dbus_hardwarecontrol] %s: dbus_connection_send failed\n", member); + return; + } + dbus_connection_flush(conn); + + // free the reply + dbus_message_unref(reply); +} + +void listen() { + DBusMessage* msg; DBusConnection* conn; DBusError err; int ret; - char* param; fprintf(stderr, "[tde_dbus_hardwarecontrol] Listening...\n"); @@ -327,7 +462,7 @@ void listen() { // non blocking read of the next available message dbus_connection_read_write(conn, 1000); // block for up to 1 second msg = dbus_connection_pop_message(conn); - + // loop again if we haven't got a message if (NULL == msg) { continue; @@ -364,8 +499,14 @@ void listen() { else if (dbus_message_is_method_call(msg, "org.trinitydesktop.hardwarecontrol.Power", "Hibernate")) { reply_SetPower(msg, conn, "disk"); } + else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameAcquired")) { + signal_NameAcquired(msg); + } + else if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect")) { + reply_Introspect(msg, conn); + } else { - fprintf(stderr, "[tde_dbus_hardwarecontrol] Unknown method '%s' called on interface '%s', ignoring\n", dbus_message_get_member(msg), dbus_message_get_interface(msg)); + error_UnknownMessage(msg, conn); } // free the message -- cgit v1.2.1