Vala DBus Server Example

using GLib;

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

        public int64 ping (string msg) {
                message (msg);
                return counter++;
        }
}

void main () {
        MainLoop 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 (pong.to_string ());
                }
        } catch (Error foo) {
                stderr.printf("Oops %s\n", foo.message);
        }
}

Since May 25 you can also do this 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 (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){
    ...
    TestServer 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.

Vala/DBusServerSample (last edited 2008-06-29 09:29:11 by JuergBilleter)