D-Bus тесно интегрирован в язык и его использование в Vala как никогда просто.
Для того, чтобы экспортировать класс как сервис D-Bus нужно просто написать аннотацию с атрибутами D-Bus и зарегистрировать экземпляр этого класса с локальной сессией D-Bus.
[DBus(name ="org.example.DemoService")]publicclassDemoService:Object {/* Private поле, не экспортируется через D-Bus */int counter;/* Public поле, не экспортируется через D-Bus */publicint status;/* Public свойство, экспортируется через D-Bus */publicint something { get; set; }/* Public сигнал, экспортируется через D-Bus * Может быть выброшен на стороне сервера и присоединен на стороне клиента. */public signal voidsig1();/* Public метод, экспортируется через D-Bus */publicvoidsome_method() { counter++;stdout.printf("Эврика! counter = %d\n", counter);sig1(); // генерация сигнала }/* Public method, exported via D-Bus and showing the sender who is is calling the method (not exported in the D-Bus interface) */publicvoidsome_method_sender(string message,GLib.BusName sender) { counter++;stdout.printf("Эврика! counter = %d, '%s' message from sender %s\n", counter, message, sender); }}
Регистрируем сервис и начинаем главный цикл:
voidon_bus_aquired (DBusConnection conn) {try { // запуск сервиса и регистрация его как dbus объектаvar service =newDemoService();conn.register_object ("/org/example/demo", service); } catch (IOError e) {stderr.printf ("Could not register service: %s\n",e.message); }}voidmain () { // пробуем зарегистрировать сервис в сессииBus.own_name (BusType.SESSION,"org.example.DemoService",/* name to register */BusNameOwnerFlags.NONE,/* flags */ on_bus_aquired,/* callback function on registration succeeded */ () => {},/* callback on name register succeeded */ () =>stderr.printf ("Could not acquire name\n"));/* callback on name lost */ // запуск главного циклаnewMainLoop ().run ();}
Все названия в Vala, имеющие вид lower_case_with_underscores автоматически транслируются к виду CamelCase как принято в D-Bus. Экспортируемый D-Bus интерфейс указанного примера будет иметь свойство Something, сигнал Sig1 и метод SomeMethod. Вы можете открыть новое окно терминала и вызвать метод командой: