#include #include static void on_my_signal(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { g_print("Received a signal: %s\n", signal_name ? signal_name : "(null)"); g_print("interface: %s\n", interface_name ? interface_name : "(null)"); g_print("arg 1: %x\n", &connection); g_print("arg 2: %x\n", &sender_name); g_print("arg 3: %x\n", &object_path); } int main(int argc, char *argv[]) { GMainLoop *loop; GDBusConnection *conn; GError *error = NULL; loop = g_main_loop_new(NULL, FALSE); /* Connect to session bus (equivalent of g-bus-get-sync 'session) */ conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); if (!conn) { g_printerr("Cannot get session bus: %s\n", error->message); g_error_free(error); return 1; } /* Subscribe to DBus signals */ guint subscription_id = g_dbus_connection_signal_subscribe( conn, "org.gnu.test.DBus", /* sender */ "org.gnu.test.DBus", /* interface */ "Signal1", /* signal */ "/org/gnu/test/DBus", /* object path */ NULL, /* arg0 filter */ G_DBUS_SIGNAL_FLAGS_NONE, on_my_signal, /* callback */ NULL, /* user data */ NULL /* user data free func */ ); g_print("subscription: %u\n", subscription_id); /* * Call MyMethod1 */ GVariant *result1 = g_dbus_connection_call_sync( conn, "org.gnu.test.DBus", /* bus name */ "/org/gnu/test/DBus", /* object path */ "org.gnu.test.DBus", /* interface */ "Method1", /* method */ g_variant_new("(s)", "Lucky number"), G_VARIANT_TYPE("(x)"), /* expected reply type */ G_DBUS_CALL_FLAGS_NONE, -1, /* timeout */ NULL, /* cancellable */ &error ); if (!result1) { g_printerr("Method1 call failed: %s\n", error->message); g_error_free(error); return 1; } gint64 out1; g_variant_get(result1, "(x)", &out1); g_print("Result of Method1: %ld\n", (long)out1); g_variant_unref(result1); /* * Call MyMethod2 */ GVariant *result2 = g_dbus_connection_call_sync( conn, "org.gnu.test.DBus", /* bus name */ "/org/gnu/test/DBus", /* object path */ "org.gnu.test.DBus", /* interface */ "Method2", /* method */ g_variant_new("(x)", (gint64)10), G_VARIANT_TYPE("(sx)"), /* expected reply type */ G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error ); if (!result2) { g_printerr("Method2 call failed: %s\n", error->message); g_error_free(error); return 1; } gchar *str_out; gint64 num_out; g_variant_get(result2, "(sx)", &str_out, &num_out); g_print("Result of Method2:\n"); g_print("%s\n", str_out); g_print("%ld\n", (long)num_out); g_free(str_out); g_variant_unref(result2); /* Run main loop to receive signals */ g_main_loop_run(loop); g_main_loop_unref(loop); return 0; }