From 556d6a85c9d5f4e2d29b94526689568b4081c006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Mon, 1 Dec 2014 22:24:48 +0000 Subject: Facebook: Optimize marking chat messages as read Not mark as read every single message when loading history messages. git-svn-id: http://svn.miranda-ng.org/main/trunk@11206 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/FacebookRM/src/process.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'protocols/FacebookRM/src/process.cpp') diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index b4e182842e..d7e676324b 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -492,9 +492,9 @@ void FacebookProto::LoadLastMessages(void *p) facy.handle_error("LoadLastMessages"); return; } - + // Temporarily disable marking messages as read for this contact - facy.ignore_read.insert(std::make_pair(hContact, true)); + facy.ignore_read.insert(hContact); CODE_BLOCK_TRY @@ -547,11 +547,8 @@ CODE_BLOCK_END facy.handle_success("LoadLastMessages"); // Enable marking messages as read for this contact - std::map::iterator it = facy.ignore_read.find(hContact); - if (it != facy.ignore_read.end()) { - it->second = false; - } - + facy.ignore_read.erase(hContact); + // And force mark read OnDbEventRead(hContact, NULL); } @@ -676,6 +673,8 @@ void FacebookProto::ReceiveMessages(std::vector messages, boo } } + std::set *hChatContacts = new std::set(); + for(std::vector::size_type i = 0; i < messages.size(); i++) { DWORD timestamp = local_timestamp || !messages[i]->time ? ::time(NULL) : messages[i]->time; @@ -752,7 +751,7 @@ void FacebookProto::ReceiveMessages(std::vector messages, boo UpdateChat(tthread_id.c_str(), messages[i]->user_id.c_str(), messages[i]->sender_name.c_str(), messages[i]->message_text.c_str(), timestamp); // Automatically mark message as read because chatroom doesn't support onRead event (yet) - ForkThread(&FacebookProto::ReadMessageWorker, (void*)hChatContact); + hChatContacts->insert(hChatContact); // std::set checks duplicates at insert automatically } else { // Single-user message debugLogA(" Got message: %s", messages[i]->message_text.c_str()); @@ -823,6 +822,12 @@ void FacebookProto::ReceiveMessages(std::vector messages, boo delete messages[i]; } messages.clear(); + + if (!hChatContacts->empty()) { + ForkThread(&FacebookProto::ReadMessageWorker, (void*)hChatContacts); + } else { + delete hChatContacts; + } } void FacebookProto::ProcessMessages(void* data) -- cgit v1.2.3