diff options
-rw-r--r-- | tdecore/tdehw/hwlibdaemons/dbus/tde_dbus_hardwarecontrol.c | 151 |
1 files 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, + "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" + " \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n", + size); + strncat(data, "<node>\n", size-strlen(data)); + if(strcmp("/", path) == 0) { + strncat(data, " <node name=\"org\" />\n", size-strlen(data)); + } + else if(strcmp("/org", path) == 0) { + strncat(data, " <node name=\"trinitydesktop\" />\n", size-strlen(data)); + } + else if(strcmp("/org/trinitydesktop", path) == 0) { + strncat(data, " <node name=\"hardwarecontrol\" />\n", size-strlen(data)); + } + else if(strcmp("/org/trinitydesktop/hardwarecontrol", path) == 0) { + strncat(data, + " <interface name=\"org.trinitydesktop.hardwarecontrol.CPUGovernor\">\n" + " <method name=\"CanSetCPUGovernor\">\n" + " <arg name=\"cpu\" direction=\"in\" type=\"i\" />\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"SetCPUGovernor\">\n" + " <arg name=\"cpu\" direction=\"in\" type=\"i\" />\n" + " <arg name=\"governor\" direction=\"in\" type=\"s\" />\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " </interface>\n", + size-strlen(data)); + strncat(data, + " <interface name=\"org.trinitydesktop.hardwarecontrol.Brightness\">\n" + " <method name=\"CanSetBrightness\">\n" + " <arg name=\"device\" direction=\"in\" type=\"s\" />\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"SetBrightness\">\n" + " <arg name=\"device\" direction=\"in\" type=\"s\" />\n" + " <arg name=\"brightness\" direction=\"in\" type=\"s\" />\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " </interface>\n", + size-strlen(data)); + strncat(data, + " <interface name=\"org.trinitydesktop.hardwarecontrol.Power\">\n" + " <method name=\"CanStandby\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"Standby\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"CanSuspend\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"Suspend\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"CanHibernate\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " <method name=\"Hibernate\">\n" + " <arg name=\"value\" direction=\"out\" type=\"b\" />\n" + " </method>\n" + " </interface>\n", + size-strlen(data)); + } + strncat(data, "</node>\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 |