From a7bf177e6e4aedcaafca186b50e6666788e45f98 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 10 Feb 2023 19:46:31 +0300 Subject: ME_DB_EVENT_MARKED_READ: recursion prevention --- protocols/JabberG/src/jabber_events.cpp | 41 ++++++++++++++------------------- protocols/JabberG/src/jabber_proto.cpp | 1 - protocols/JabberG/src/jabber_proto.h | 2 +- protocols/JabberG/src/jabber_rc.cpp | 2 +- 4 files changed, 19 insertions(+), 27 deletions(-) (limited to 'protocols/JabberG') diff --git a/protocols/JabberG/src/jabber_events.cpp b/protocols/JabberG/src/jabber_events.cpp index da9f81c7bc..d2a863bfa5 100644 --- a/protocols/JabberG/src/jabber_events.cpp +++ b/protocols/JabberG/src/jabber_events.cpp @@ -60,6 +60,23 @@ void CJabberProto::OnContactDeleted(MCONTACT hContact) ListRemove(LIST_CHATROOM, jid); } +///////////////////////////////////////////////////////////////////////////////////////// +// OnMarkRead - mark an event read + +void CJabberProto::OnMarkRead(MCONTACT hContact, MEVENT hDbEvent) +{ + auto *pMark = m_arChatMarks.find((CChatMark *)&hDbEvent); + if (pMark) { + if (IsSendAck(hContact)) { + XmlNode reply("message"); reply << XATTR("to", pMark->szFrom) << XATTR("id", pMark->szId) + << XCHILDNS("displayed", JABBER_FEAT_CHAT_MARKERS) << XATTR("id", pMark->szId); + m_ThreadInfo->send(reply); + } + + m_arChatMarks.remove(pMark); + } +} + ///////////////////////////////////////////////////////////////////////////////////////// // JabberDbSettingChanged - process database changes @@ -157,30 +174,6 @@ void __cdecl CJabberProto::OnAddContactForever(MCONTACT hContact) Contact::Hide(hContact, false); } -int __cdecl CJabberProto::OnDbMarkedRead(WPARAM, LPARAM hDbEvent) -{ - MCONTACT hContact = db_event_getContact(hDbEvent); - if (!hContact) - return 0; - - // filter out only events of my protocol - const char *szProto = Proto_GetBaseAccountName(hContact); - if (mir_strcmp(szProto, m_szModuleName)) - return 0; - - auto *pMark = m_arChatMarks.find((CChatMark *)&hDbEvent); - if (pMark) { - if (IsSendAck(hContact)) { - XmlNode reply("message"); reply << XATTR("to", pMark->szFrom) << XATTR("id", pMark->szId) - << XCHILDNS("displayed", JABBER_FEAT_CHAT_MARKERS) << XATTR("id", pMark->szId); - m_ThreadInfo->send(reply); - } - - m_arChatMarks.remove(pMark); - } - return 0; -} - int __cdecl CJabberProto::OnDbSettingChanged(WPARAM hContact, LPARAM lParam) { if (hContact == 0 || !m_bJabberOnline) diff --git a/protocols/JabberG/src/jabber_proto.cpp b/protocols/JabberG/src/jabber_proto.cpp index 9762a297f8..6c425da2c4 100644 --- a/protocols/JabberG/src/jabber_proto.cpp +++ b/protocols/JabberG/src/jabber_proto.cpp @@ -199,7 +199,6 @@ CJabberProto::CJabberProto(const char *aProtoName, const wchar_t *aUserName) : HookProtoEvent(ME_LANGPACK_CHANGED, &CJabberProto::OnLangChanged); HookProtoEvent(ME_OPT_INITIALISE, &CJabberProto::OnOptionsInit); HookProtoEvent(ME_SKIN_ICONSCHANGED, &CJabberProto::OnReloadIcons); - HookProtoEvent(ME_DB_EVENT_MARKED_READ, &CJabberProto::OnDbMarkedRead); HookProtoEvent(ME_DB_CONTACT_SETTINGCHANGED, &CJabberProto::OnDbSettingChanged); m_iqManager.FillPermanentHandlers(); diff --git a/protocols/JabberG/src/jabber_proto.h b/protocols/JabberG/src/jabber_proto.h index c2eaba0b3f..9f5d8d5c0b 100644 --- a/protocols/JabberG/src/jabber_proto.h +++ b/protocols/JabberG/src/jabber_proto.h @@ -150,6 +150,7 @@ struct CJabberProto : public PROTO, public IJabberInterface void OnBuildProtoMenu(void) override; void OnContactDeleted(MCONTACT) override; + void OnMarkRead(MCONTACT, MEVENT) override; void OnModulesLoaded() override; void OnShutdown() override; @@ -163,7 +164,6 @@ struct CJabberProto : public PROTO, public IJabberInterface //====| Events |====================================================================== void __cdecl OnAddContactForever(MCONTACT hContact); - int __cdecl OnDbMarkedRead(WPARAM, LPARAM); int __cdecl OnDbSettingChanged(WPARAM, LPARAM); int __cdecl OnIdleChanged(WPARAM, LPARAM); int __cdecl OnLangChanged(WPARAM, LPARAM); diff --git a/protocols/JabberG/src/jabber_rc.cpp b/protocols/JabberG/src/jabber_rc.cpp index a5bae9e944..27d389cee3 100644 --- a/protocols/JabberG/src/jabber_rc.cpp +++ b/protocols/JabberG/src/jabber_rc.cpp @@ -564,7 +564,7 @@ int CJabberProto::AdhocForwardHandler(const TiXmlElement*, CJabberIqInfo *pInfo, nEventsSent++; - db_event_markRead(hContact, hDbEvent); + db_event_markRead(hContact, hDbEvent, true); if (bRemoveCListEvents) g_clistApi.pfnRemoveEvent(hContact, hDbEvent); } -- cgit v1.2.3