Vala: объект, реализующий интерфейс D-BUS, ошибка со свойствами - PullRequest
0 голосов
/ 13 августа 2011

Возможно ли, чтобы класс, аннотированный с помощью [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, но она не существует

1 Ответ

0 голосов
/ 14 августа 2011

Это явно ошибка. Правильное место для сообщения об ошибках: http://bugzilla.gnome.org.

...