Возможно ли, чтобы класс, аннотированный с помощью [DBus (name = ...)], реализовывал интерфейс?
Следуя примеру на https://live.gnome.org/Vala/DBusServerSample, Я реализую клиент-серверное приложение D-BUS.
Одна особенность, которую я нашел в этом примере, заключалась в том, что не было отдельного определения интерфейса. Я хотел бы иметь интерфейс, используемый на стороне клиента, в отдельном файле, и чтобы класс сервера реализовывал этот интерфейс. Таким образом, я могу заставить компилятор сообщать мне, когда я что-то пропускаю.
Это не похоже на работу со свойствами, хотя. Следующее определение совместимо с тем, что у меня есть:
/* interface.vala */
namespace org.test {
[DBus (name = "org.test.Items")]
public interface IItems : Object {
/**
* The object paths to the item instances.
*
* These objects are of type org.test.items.Item.
*/
public abstract ObjectPath[] items {
owned get;
}
/**
* The signal that is emitted when a new item is added.
*
* When this signal is emitted, the item will be available.
*
* @param id
* The object path to the item instance.
*/
public signal void item_added(ObjectPath id);
/**
* The signal that is emitted when an item is removed.
*
* When this signal is emitted, the item will be unavailable.
*
* @param id
* The object path to the item instance.
*/
public signal void item_removed(ObjectPath id);
/**
* Adds a new item.
*
* The URL will be parsed, and if it contains a valid item, it will be
* added.
*
* @param url
* The URL to the item. This should typically be the URL of the
* RSS feed.
* @return the ID of the item added, which can be used to query D-BUS
* for it
* @throws IOError if a D-BUS error occurs
*/
public abstract ObjectPath add_item(string url) throws IOError;
/**
* Removes an item.
*
* @param id
* The ID of the item to remove.
* @throws IOError if a D-BUS error occurs
*/
public abstract void remove_item(ObjectPath id) throws IOError;
}
}
/* server.vala */
using Gee;
namespace org.test {
[DBus (name = "org.test.Items")]
public class Items : DBUSObject, IItems {
private ArrayList<Item> _items;
[DBus (visible = false)]
protected override void dbus_register(DBusConnection conn,
ObjectPath path) throws IOError {
conn.register_object(path, this);
}
[DBus (visible = false)]
public Items() {
base("org.test.Items", "/org/test", "Items", true);
_items = new ArrayList<Item>();
}
[DBus (visible = false)]
~Items() {
unregister();
}
/**
* @see interface.vala::org.test.IItems.comics
*/
public ObjectPath[] items {
owned get {
ObjectPath[] result = {};
foreach (var item in _items) {
result += new ObjectPath(item.path);
}
return result;
}
}
/**
* @see interface.vala::org.test.IItems.add_comic
*/
public ObjectPath add_item(string url) throws IOError {
/* . . . */
}
/**
* @see interface.vala::org.test.IItems.remove_item
*/
public void remove_item(ObjectPath id) throws IOError {
/* . . . */
}
}
}
Когда я его компилирую, я не получаю ошибку от valac, но когда скомпилированный сгенерированный код C компоновщик жалуется: undefined reference to 'org_test_items_get_items'
.
На эту функцию ссылается _dbus_org_test_items_get_items
, но она не существует