Vala DBus Server Example

using GLib;

[DBus (name = "org.gnome.TestServer")]
public class TestServer : Object {
    int64 counter;

    public int64 ping (string msg) {
        message ("%s", msg);
        return counter++;
    }
}

void main () {
    var loop = new MainLoop (null, false);

    try {
        var conn = DBus.Bus.get (DBus.BusType. SESSION);

        dynamic DBus.Object bus = conn.get_object ("org.freedesktop.DBus",
                                                   "/org/freedesktop/DBus",
                                                   "org.freedesktop.DBus");
        
        // try to register service in session bus
        uint request_name_result = bus.request_name ("org.gnome.TestService", (uint) 0);

        if (request_name_result == DBus.RequestNameReply.PRIMARY_OWNER) {
            // start server

            var server = new TestServer ();
            conn.register_object ("/org/gnome/test", server);

            loop.run ();
        } else {        
            // client       
            dynamic DBus.Object test_server_object = conn.get_object ("org.gnome.TestService",
                                                                      "/org/gnome/test",
                                                                      "org.gnome.TestServer");

            int64 pong = test_server_object.ping ("Hello from Vala");
            message ("%lli", pong);
        }
    } catch (Error e) {
        stderr.printf ("Oops: %s\n", e.message);
    }
}

This also works with interfaces

[DBus (name = "org.gnome.TestServer")]
public interface TestServerAPI {
    public abstract int64 ping (string msg);
}

public class TestServer : Object, TestServerAPI {
    int64 counter;

    public int64 ping (string msg) {
        message ("%s", msg);
        return counter++;
    }
}

Compile

$ valac --pkg dbus-glib-1 -o dbustest dbustest.vala

Notes

Requires Vala 0.3.1

A common mistake is to register a local object reference, i.e

private void my_func (DBus.Connection conn) {
    ...
    var server = new TestServer ();
    conn.register_object ("/org/gnome/test", server);

    ...
}

This won't work and you won't get any error messages when registering the object. server object will be finalized after my_func ends (when the reference is removed). The object will be unregistered from the bus, immediately after registered.

Passing objects over D-Bus

Samples at Vala/DBusServerSamplePassingObjects

Vala/DBusServerSample (last edited 2008-12-22 11:37:35 by PhilipVanHoof)