Vala DBus Server Example
Contents
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
