problems with simple glib and dbus example
Diego Jacobi
jacobidiego at gmail.com
Sat Sep 27 09:29:31 PDT 2008
Is there another list to ask this?
I dont know what else to try and there seams to be very little example
of dbus-glib.
With Python it dos works, but the wrapper is different, the Proxy can
connect to all signals, and in C/Glib it cant.
Cheers.
Diego
2008/9/25 Diego Jacobi <jacobidiego at gmail.com>:
> Hello List, i am trying to do an application using dbus and glib, but
> it seems like the signals that i request are never received, so i made
> a much simpler example and also doesnt works.
>
> Can you please tell me why?
>
>
> /* Compile With:
> ** gcc `pkg-config --cflags --libs glib-2.0 dbus-glib-1` signals.c -o signals
> **
> ** Sources:
> ** http://dbus.freedesktop.org/doc/dbus-tutorial.html
> ** https://stage.maemo.org/svn/maemo/projects/haf/doc/api/dbus-glib/example-signal-recipient_8c-source.html
> */
>
> #include <dbus/dbus-glib.h>
> #include <stdlib.h>
>
> GMainLoop *mainloop;
>
> static gboolean emit_signal (gpointer arg)
> {
> DBusGProxy *proxy = arg;
>
> g_printf ("Signal Emitted\n");
> dbus_g_proxy_call_no_reply (proxy, "HelloSignal",
> G_TYPE_STRING, "Hello world",
> G_TYPE_INVALID,
> G_TYPE_INVALID);
> return TRUE;
> }
>
> static void hello_signal_handler (DBusGProxy *proxy, GString
> hello_string, gpointer user_data) {
> g_printf ("Received signal and it says: %s\n", hello_string);
> g_main_loop_quit(mainloop);
> }
>
> static void destroy_signal(GObject *sender, gpointer data)
> {
> //g_debug("'destroy' signal triggered");
> g_main_loop_quit(mainloop);
> }
>
> int main (int argc, char **argv)
> {
> DBusGConnection *bus;
> DBusGProxy *proxy;
> GError *error = NULL;
>
> g_type_init ();
>
> mainloop = g_main_loop_new (NULL, FALSE);
>
> bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
> if (!bus){
> g_printerr("Couldn't connect to session bus: %s", error->message);
> exit (1);
> }
>
> /* We use _for_name_owner in order to track this particular service
> * instance, which lets us receive signals.
> */
> proxy = dbus_g_proxy_new_for_name (bus,
> "org.designfu.TestService",
> "/org/designfu/TestService/object",
> "org.designfu.TestService");
> if (!proxy){
> g_printerr("Failed to get name owner: %s", error->message);
> exit (1);
> }
>
> /* IMPORTANT:
> * Note because this signal's signature is VOID__STRING, we do not
> * need to register a marshaller, since there is a builtin one.
> * However for other signatures, you must generate a marshaller,
> * then call dbus_g_object_register_marshaller. It would look like
> * this:
> * dbus_g_object_register_marshaller
> (g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, G_TYPE_STRING,
> G_TYPE_INVALID);
> */
>
> /* Tell DBus what the type signature of the signal callback is; this
> * allows us to sanity-check incoming messages before invoking the
> * callback. You need to do this once for each proxy you create,
> * not every time you want to connect to the signal.
> */
> dbus_g_proxy_add_signal (proxy, "HelloSignal", G_TYPE_STRING, G_TYPE_INVALID);
>
> /* Actually connect to the signal. Note you can call
> * dbus_g_proxy_connect_signal multiple times for one invocation of
> * dbus_g_proxy_add_signal.
> */
> dbus_g_proxy_connect_signal (proxy, "HelloSignal", G_CALLBACK
> (hello_signal_handler),NULL, NULL);
>
> g_signal_connect (G_OBJECT (proxy), "destroy",G_CALLBACK
> (destroy_signal), NULL);
>
> g_timeout_add (2000, emit_signal, proxy);
>
> g_main_loop_run (mainloop);
>
> exit (0);
> }
>
>
>
> The code just emits a signals every 2 seconds and should also receive
> it and quit from the mainloop the first time, but it never quits.
>
More information about the dbus
mailing list