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.
