From 75e51b5ed3b639b9cf7b16b0ddbee7e362c44ef1 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Tue, 4 Apr 2017 15:47:00 +0200 Subject: MessageStorage/Processor, correctly resolve conversations (fixup 22adbd3) --- libdino/src/service/message_storage.vala | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 libdino/src/service/message_storage.vala (limited to 'libdino/src/service/message_storage.vala') diff --git a/libdino/src/service/message_storage.vala b/libdino/src/service/message_storage.vala new file mode 100644 index 00000000..ea765f96 --- /dev/null +++ b/libdino/src/service/message_storage.vala @@ -0,0 +1,68 @@ +using Gee; + +using Dino.Entities; + +namespace Dino { + +public class MessageStorage : StreamInteractionModule, Object { + public static ModuleIdentity IDENTITY = new ModuleIdentity("message_cache"); + public string id { get { return IDENTITY.id; } } + + private StreamInteractor stream_interactor; + private Database db; + + private HashMap> messages = new HashMap>(Conversation.hash_func, Conversation.equals_func); + + public static void start(StreamInteractor stream_interactor, Database db) { + MessageStorage m = new MessageStorage(stream_interactor, db); + stream_interactor.add_module(m); + } + + private MessageStorage(StreamInteractor stream_interactor, Database db) { + this.stream_interactor = stream_interactor; + this.db = db; + } + + public void add_message(Message message, Conversation conversation) { + message.persist(db); + init_conversation(conversation); + messages[conversation].add(message); + } + + public Gee.List get_messages(Conversation conversation, int count = 50) { + init_conversation(conversation); + if (messages[conversation].size > 0) { + return messages[conversation][int.max(messages[conversation].size - count - 1, 0) : messages[conversation].size]; + } + return new ArrayList(); + } + + public Message? get_last_message(Conversation conversation) { + init_conversation(conversation); + if (messages[conversation].size > 0) { + return messages[conversation][messages[conversation].size - 1]; + } + return null; + } + + public Gee.List? get_messages_before(Conversation? conversation, Message before, int count = 20) { + Gee.List db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), count, before); + return db_messages; + } + + public Message? get_message_by_id(string stanza_id, Conversation conversation) { + init_conversation(conversation); + for (int i = messages[conversation].size - 1; i > 0; i--) { + if (messages[conversation][i].stanza_id == stanza_id) return messages[conversation][i]; + } + return null; + } + + private void init_conversation(Conversation conversation) { + if (!messages.has_key(conversation)) { + messages[conversation] = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), 50, null); + } + } +} + +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf