using GLib; using Gee; public class Repository : DBusServiceProxy { public signal void conversations_updated(); public signal void messages_updated(string conversation_guid); public static Repository get_instance() { if (instance == null) { instance = new Repository(); } return instance; } private static Repository instance = null; private DBusService.Repository? dbus_repository; private uint dbus_watch_id; private Repository() { this.dbus_watch_id = Bus.watch_name(BusType.SESSION, DBUS_NAME, BusNameWatcherFlags.NONE, (name, name_owner) => { connect_to_repository(); }); } private void connect_to_repository() { try { this.dbus_repository = Bus.get_proxy_sync(BusType.SESSION, DBUS_NAME, DBUS_PATH); this.dbus_repository.conversations_updated.connect(() => { conversations_updated(); }); this.dbus_repository.messages_updated.connect((conversation_guid) => { messages_updated(conversation_guid); }); conversations_updated(); } catch (GLib.Error e) { warning("Failed to connect to repository: %s", e.message); } } public Conversation[] get_conversations(int limit = 200) throws DBusServiceProxyError, GLib.Error { if (dbus_repository == null) { throw new DBusServiceProxyError.NOT_CONNECTED("Repository not connected"); } var conversations = dbus_repository.get_conversations(limit, 0); Conversation[] returned_conversations = new Conversation[conversations.length]; for (int i = 0; i < conversations.length; i++) { returned_conversations[i] = new Conversation.from_hash_table(conversations[i]); } return returned_conversations; } public Message[] get_messages(string conversation_guid, string last_message_id = "") throws DBusServiceProxyError, GLib.Error { if (dbus_repository == null) { throw new DBusServiceProxyError.NOT_CONNECTED("Repository not connected"); } var messages = dbus_repository.get_messages(conversation_guid, last_message_id); Message[] returned_messages = new Message[messages.length]; for (int i = 0; i < messages.length; i++) { returned_messages[i] = new Message.from_hash_table(messages[i]); } return returned_messages; } public string send_message(string conversation_guid, string message) throws DBusServiceProxyError, GLib.Error { if (dbus_repository == null) { throw new DBusServiceProxyError.NOT_CONNECTED("Repository not connected"); } return dbus_repository.send_message(conversation_guid, message); } public void sync_conversation(string conversation_guid) throws DBusServiceProxyError, GLib.Error { if (dbus_repository == null) { throw new DBusServiceProxyError.NOT_CONNECTED("Repository not connected"); } dbus_repository.sync_conversation(conversation_guid); } }