From 744977cc61a0e729f5615ecaa506cba4818b0d58 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 19 Apr 2023 14:56:25 +0300 Subject: redundant CRtfLogWindow::LogEvents parameter removed, passing LOGINFO* is enough --- include/m_srmm_int.h | 11 ++-- libs/win32/mir_app.lib | Bin 249726 -> 249786 bytes libs/win64/mir_app.lib | Bin 246958 -> 247022 bytes plugins/IEView/src/ieview_logger.cpp | 113 +++++++++++++++++---------------- plugins/NewStory/src/history_log.cpp | 9 ++- plugins/Scriver/src/msglog.cpp | 31 +++++---- plugins/TabSRMM/src/chat_log.cpp | 4 +- plugins/TabSRMM/src/msgdlgother.cpp | 4 +- plugins/TabSRMM/src/msglog.cpp | 28 ++++----- plugins/TabSRMM/src/msgs.h | 4 +- src/core/stdmsg/src/msglog.cpp | 25 +++----- src/mir_app/src/chat.h | 4 +- src/mir_app/src/chat_log.cpp | 38 +++++------ src/mir_app/src/chat_manager.cpp | 9 ++- src/mir_app/src/chat_svc.cpp | 13 ++-- src/mir_app/src/mir_app.def | 2 +- src/mir_app/src/mir_app64.def | 2 +- src/mir_app/src/srmm_base.cpp | 13 ++-- src/mir_app/src/srmm_log_hpp.cpp | 118 +++++++++++++++++++---------------- 19 files changed, 221 insertions(+), 207 deletions(-) diff --git a/include/m_srmm_int.h b/include/m_srmm_int.h index 97e132e0a8..f18b2fa4c1 100644 --- a/include/m_srmm_int.h +++ b/include/m_srmm_int.h @@ -128,7 +128,7 @@ public: virtual HWND GetHwnd() = 0; virtual wchar_t* GetSelection() = 0; virtual void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) = 0; - virtual void LogEvents(struct SESSION_INFO *si, int iStart, bool bAppend) = 0; + virtual void LogEvents(const struct LOGINFO *lin) = 0; virtual void Resize() = 0; virtual void ScrollToBottom() = 0; virtual void UpdateOptions() {}; @@ -163,11 +163,12 @@ struct RtfLogStreamBase struct RtfChatLogStreamData { - int iStage = 0, iStartEvent = 0; - bool bStripFormat, bAppend = false, bIsFirst = false; + int iStage = 0, idx = 0; + bool bStripFormat, bRedraw, bIsFirst = false; CMStringA buf; struct SESSION_INFO *si; + const struct LOGINFO *lin; class CRtfLogWindow *pLog; }; @@ -195,7 +196,7 @@ public: virtual bool CreateRtfEvent(RtfLogStreamData *dat, DB::EventInfo &dbei) = 0; virtual void CreateRtfTail(RtfLogStreamData *dat); - void StreamChatRtfEvents(RtfChatLogStreamData *dat, bool bAppend); + void StreamChatRtfEvents(RtfChatLogStreamData *dat, bool bRedraw); virtual void CreateChatRtfHeader(RtfChatLogStreamData *dat); virtual void CreateChatRtfEvent(RtfChatLogStreamData *dat, const struct LOGINFO &lin); virtual void CreateChatRtfTail(RtfChatLogStreamData *dat); @@ -293,7 +294,7 @@ public: void RedrawLog(); void ShowColorChooser(int iCtrlId); - virtual void AddLog(); + virtual void AddLog(const LOGINFO &lin); virtual void CloseTab() {} virtual void DrawNickList(USERINFO *ui, DRAWITEMSTRUCT *dis) PURE; virtual void EventAdded(MEVENT, const DB::EventInfo &dbei) PURE; diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib index 193a1a891e..f7997fdee4 100644 Binary files a/libs/win32/mir_app.lib and b/libs/win32/mir_app.lib differ diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib index 92c848965b..f33ef41fdf 100644 Binary files a/libs/win64/mir_app.lib and b/libs/win64/mir_app.lib differ diff --git a/plugins/IEView/src/ieview_logger.cpp b/plugins/IEView/src/ieview_logger.cpp index 6f613882c2..5ab19373d0 100644 --- a/plugins/IEView/src/ieview_logger.cpp +++ b/plugins/IEView/src/ieview_logger.cpp @@ -103,7 +103,9 @@ public: HandleIEEvent(0, LPARAM(&event)); } - void LogEvents(SESSION_INFO *si, int iStart, bool bRedraw) override + //////////////////////////////////////////////////////////////////////////////////////// + + void LogEvent(const LOGINFO *lin) { IEVIEWEVENTDATA ied = {}; ied.dwFlags = IEEDF_UNICODE_NICK; @@ -116,60 +118,65 @@ public: event.eventData = &ied; event.count = 1; - for (int i = iStart; i < si->arEvents.getCount(); i++) { - auto &lin = si->arEvents[i]; - - ied.szNick.w = lin.ptszNick; - ied.szText.w = lin.ptszText; - ied.time = lin.time; - ied.bIsMe = lin.bIsMe; - - switch (lin.iType) { - case GC_EVENT_MESSAGE: - ied.iType = IEED_GC_EVENT_MESSAGE; - ied.dwData = IEEDD_GC_SHOW_NICK; - break; - case GC_EVENT_ACTION: - ied.iType = IEED_GC_EVENT_ACTION; - break; - case GC_EVENT_JOIN: - ied.iType = IEED_GC_EVENT_JOIN; - break; - case GC_EVENT_PART: - ied.iType = IEED_GC_EVENT_PART; - break; - case GC_EVENT_QUIT: - ied.iType = IEED_GC_EVENT_QUIT; - break; - case GC_EVENT_NICK: - ied.iType = IEED_GC_EVENT_NICK; - break; - case GC_EVENT_KICK: - ied.iType = IEED_GC_EVENT_KICK; - break; - case GC_EVENT_NOTICE: - ied.iType = IEED_GC_EVENT_NOTICE; - break; - case GC_EVENT_TOPIC: - ied.iType = IEED_GC_EVENT_TOPIC; - break; - case GC_EVENT_INFORMATION: - ied.iType = IEED_GC_EVENT_INFORMATION; - break; - case GC_EVENT_ADDSTATUS: - ied.iType = IEED_GC_EVENT_ADDSTATUS; - break; - case GC_EVENT_REMOVESTATUS: - ied.iType = IEED_GC_EVENT_REMOVESTATUS; - break; - } - - ied.dwData |= IEEDD_GC_SHOW_TIME | IEEDD_GC_SHOW_ICON; - ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK; - HandleIEEvent(0, LPARAM(&event)); + ied.szNick.w = lin->ptszNick; + ied.szText.w = lin->ptszText; + ied.time = lin->time; + ied.bIsMe = lin->bIsMe; + + switch (lin->iType) { + case GC_EVENT_MESSAGE: + ied.iType = IEED_GC_EVENT_MESSAGE; + ied.dwData = IEEDD_GC_SHOW_NICK; + break; + case GC_EVENT_ACTION: + ied.iType = IEED_GC_EVENT_ACTION; + break; + case GC_EVENT_JOIN: + ied.iType = IEED_GC_EVENT_JOIN; + break; + case GC_EVENT_PART: + ied.iType = IEED_GC_EVENT_PART; + break; + case GC_EVENT_QUIT: + ied.iType = IEED_GC_EVENT_QUIT; + break; + case GC_EVENT_NICK: + ied.iType = IEED_GC_EVENT_NICK; + break; + case GC_EVENT_KICK: + ied.iType = IEED_GC_EVENT_KICK; + break; + case GC_EVENT_NOTICE: + ied.iType = IEED_GC_EVENT_NOTICE; + break; + case GC_EVENT_TOPIC: + ied.iType = IEED_GC_EVENT_TOPIC; + break; + case GC_EVENT_INFORMATION: + ied.iType = IEED_GC_EVENT_INFORMATION; + break; + case GC_EVENT_ADDSTATUS: + ied.iType = IEED_GC_EVENT_ADDSTATUS; + break; + case GC_EVENT_REMOVESTATUS: + ied.iType = IEED_GC_EVENT_REMOVESTATUS; + break; + } + + ied.dwData |= IEEDD_GC_SHOW_TIME | IEEDD_GC_SHOW_ICON; + ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK; + HandleIEEvent(0, LPARAM(&event)); + } + + void LogEvents(const LOGINFO *lin) override + { + if (lin == nullptr) { + for (auto &it : m_pDlg.getChat()->arEvents) + LogEvent(it); } + else LogEvent(lin); - if (bRedraw) + if (lin) ScrollToBottom(); } diff --git a/plugins/NewStory/src/history_log.cpp b/plugins/NewStory/src/history_log.cpp index 87b0b7fc9d..35f3b47c97 100644 --- a/plugins/NewStory/src/history_log.cpp +++ b/plugins/NewStory/src/history_log.cpp @@ -60,10 +60,13 @@ public: SendMessage(m_hwnd, NSM_ADDEVENTS, (LPARAM)&tmp, 0); } - void LogEvents(SESSION_INFO *si, int iStart, bool) override + void LogEvents(const LOGINFO *lin) override { - for (int i=iStart; i < si->arEvents.getCount(); i++) - SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)&si->arEvents[i]); + if (lin == nullptr) { + for (auto &it: m_pDlg.getChat()->arEvents) + SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)it); + } + else SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)lin); } void Resize() override diff --git a/plugins/Scriver/src/msglog.cpp b/plugins/Scriver/src/msglog.cpp index cf5d714c83..8715878381 100644 --- a/plugins/Scriver/src/msglog.cpp +++ b/plugins/Scriver/src/msglog.cpp @@ -318,6 +318,8 @@ public: m_rtf.SendMsg(EM_AUTOURLDETECT, TRUE, 0); } + //////////////////////////////////////////////////////////////////////////////////////// + void CreateRtfHeader(RtfLogStreamData *streamData) override { HDC hdc = GetDC(nullptr); @@ -355,6 +357,8 @@ public: buf.Append("}"); } + //////////////////////////////////////////////////////////////////////////////////////// + bool CreateRtfEvent(RtfLogStreamData *streamData, DB::EventInfo &dbei) override { if (!DbEventIsShown(dbei)) @@ -549,6 +553,8 @@ public: return true; } + //////////////////////////////////////////////////////////////////////////////////////// + void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override { if (!bAppend) @@ -643,21 +649,20 @@ public: //////////////////////////////////////////////////////////////////////////////////////// - void LogEvents(SESSION_INFO *si, int iStart, bool bAppend) override + void LogEvents(const LOGINFO *lin) override { - if (m_rtf.GetHwnd() == nullptr || si == nullptr) + if (m_rtf.GetHwnd() == nullptr) return; - auto &lin = si->arEvents[iStart]; - if (!bAppend && (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) && !(m_pDlg.m_iLogFilterFlags & lin.iType)) - return; + auto *si = m_pDlg.getChat(); + bool bRedraw = lin == nullptr; RtfChatLogStreamData streamData; streamData.pLog = this; streamData.si = si; - streamData.iStartEvent = iStart; + streamData.lin = lin; streamData.bStripFormat = FALSE; - streamData.bIsFirst = bAppend ? 1 : m_rtf.GetRichTextLength() == 0; + streamData.bIsFirst = bRedraw ? 1 : m_rtf.GetRichTextLength() == 0; SCROLLINFO scroll; scroll.cbSize = sizeof(SCROLLINFO); @@ -680,20 +685,20 @@ public: // fix for the indent... must be a M$ bug if (sel.cpMax == 0) - bAppend = TRUE; + bRedraw = TRUE; // get the number of pixels per logical inch bool bFlag = false; - if (bAppend) { + if (bRedraw) { m_rtf.SetDraw(false); bFlag = true; } // stream in the event(s) - StreamChatRtfEvents(&streamData, bAppend); + StreamChatRtfEvents(&streamData, bRedraw); // do smileys - if (g_dat.smileyAddInstalled && (bAppend || (lin.ptszText && lin.iType != GC_EVENT_JOIN && lin.iType != GC_EVENT_NICK && lin.iType != GC_EVENT_ADDSTATUS && lin.iType != GC_EVENT_REMOVESTATUS))) { + if (g_dat.smileyAddInstalled && (bRedraw || (lin && lin->ptszText && lin->iType != GC_EVENT_JOIN && lin->iType != GC_EVENT_NICK && lin->iType != GC_EVENT_ADDSTATUS && lin->iType != GC_EVENT_REMOVESTATUS))) { newsel.cpMax = -1; newsel.cpMin = sel.cpMin; if (newsel.cpMin < 0) @@ -702,7 +707,7 @@ public: SMADD_RICHEDIT3 sm = { sizeof(sm) }; sm.hwndRichEditControl = m_rtf.GetHwnd(); sm.Protocolname = si->pszModule; - sm.rangeToReplace = bAppend ? nullptr : &newsel; + sm.rangeToReplace = bRedraw ? nullptr : &newsel; sm.flags = 0; sm.disableRedraw = TRUE; sm.hContact = m_pDlg.m_hContact; @@ -710,7 +715,7 @@ public: } // scroll log to bottom if the log was previously scrolled to bottom, else restore old position - if (bAppend || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50) + if (bRedraw || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50) ScrollToBottom(); else m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point); diff --git a/plugins/TabSRMM/src/chat_log.cpp b/plugins/TabSRMM/src/chat_log.cpp index 49e573aed3..a5e18db220 100644 --- a/plugins/TabSRMM/src/chat_log.cpp +++ b/plugins/TabSRMM/src/chat_log.cpp @@ -296,7 +296,7 @@ void CLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const LOGI SESSION_INFO *si = streamData->si; CMStringA &str = streamData->buf; - if (streamData->iStartEvent != 0) + if (streamData->idx != 0) str.Append("\\par "); if (m_pDlg.m_bDividerWanted) { @@ -304,7 +304,7 @@ void CLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const LOGI if (szStyle_div[0] == 0) mir_snprintf(szStyle_div, "\\f%u\\cf%u\\ul0\\b%d\\i%d\\fs%u", 17, 18, 0, 0, 5); - if (streamData->iStartEvent != si->arEvents.getCount() - 1 || !streamData->bAppend) + if (streamData->idx != si->arEvents.getCount()-1 || !streamData->bRedraw) str.AppendFormat("\\qc\\sl-1\\highlight%d %s ---------------------------------------------------------------------------------------\\par ", 18, szStyle_div); m_pDlg.m_bDividerWanted = false; } diff --git a/plugins/TabSRMM/src/msgdlgother.cpp b/plugins/TabSRMM/src/msgdlgother.cpp index 5043f45e8d..b04236acfb 100644 --- a/plugins/TabSRMM/src/msgdlgother.cpp +++ b/plugins/TabSRMM/src/msgdlgother.cpp @@ -41,7 +41,7 @@ void CMsgDialog::ActivateTooltip(int iCtrlId, const wchar_t *pwszMessage) ///////////////////////////////////////////////////////////////////////////////////////// -void CMsgDialog::AddLog() +void CMsgDialog::AddLog(const LOGINFO &lin) { if (g_plugin.bUseDividers) { if (g_plugin.bDividersUsePopupConfig) { @@ -56,7 +56,7 @@ void CMsgDialog::AddLog() } } - CSuper::AddLog(); + CSuper::AddLog(lin); } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/TabSRMM/src/msglog.cpp b/plugins/TabSRMM/src/msglog.cpp index 89cd3e7d34..04045292b2 100644 --- a/plugins/TabSRMM/src/msglog.cpp +++ b/plugins/TabSRMM/src/msglog.cpp @@ -1226,21 +1226,20 @@ void CLogWindow::LogEvents(MEVENT hDbEventFirst, int count, bool fAppend, DB::Ev ///////////////////////////////////////////////////////////////////////////////////////// -void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend) +void CLogWindow::LogEvents(const LOGINFO *lin) { - if (m_rtf.GetHwnd() == nullptr || si == nullptr) + if (m_rtf.GetHwnd() == nullptr) return; - auto &lin = si->arEvents[iStart]; - if (!bAppend && m_pDlg.AllowTyping() && !(m_pDlg.m_iLogFilterFlags & lin.iType)) - return; + auto si = m_pDlg.getChat(); + bool bRedraw = lin == nullptr; bool bFlag = false, bDoReplace, bAtBottom = AtBottom(); RtfChatLogStreamData streamData; streamData.pLog = this; streamData.si = si; - streamData.iStartEvent = iStart; + streamData.lin = lin; streamData.bStripFormat = FALSE; POINT point = { 0 }; @@ -1258,13 +1257,10 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend) // fix for the indent... must be a M$ bug if (sel.cpMax == 0) - bAppend = TRUE; - - // should the event(s) be appended to the current log - WPARAM wp = bAppend ? SF_RTF : SFF_SELECTION | SF_RTF; + bRedraw = TRUE; // get the number of pixels per logical inch - if (bAppend) { + if (bRedraw) { HDC hdc = GetDC(nullptr); g_chatApi.logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY); g_chatApi.logPixelSX = GetDeviceCaps(hdc, LOGPIXELSX); @@ -1273,16 +1269,16 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend) bFlag = true; } - StreamChatRtfEvents(&streamData, bAppend); + StreamChatRtfEvents(&streamData, bRedraw); // for new added events, only replace in message or action events. // no need to replace smileys or math formulas elsewhere - bDoReplace = (bAppend || (lin.ptszText && (lin.iType == GC_EVENT_MESSAGE || lin.iType == GC_EVENT_ACTION))); + bDoReplace = (bRedraw || (lin && lin->ptszText && (lin->iType == GC_EVENT_MESSAGE || lin->iType == GC_EVENT_ACTION))); // replace marked nicknames with hyperlinks to make the nicks clickable if (g_Settings.bClickableNicks) { FINDTEXTEX fi, fi2; - fi.chrg.cpMin = bAppend ? 0 : sel.cpMin; + fi.chrg.cpMin = bRedraw ? 0 : sel.cpMin; fi.chrg.cpMax = -1; fi.lpstrText = CLICKNICK_BEGIN; @@ -1326,7 +1322,7 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend) SMADD_RICHEDIT3 sm = { sizeof(sm) }; sm.hwndRichEditControl = m_rtf.GetHwnd(); sm.Protocolname = si->pszModule; - sm.rangeToReplace = bAppend ? nullptr : &newsel; + sm.rangeToReplace = bRedraw ? nullptr : &newsel; sm.disableRedraw = TRUE; sm.hContact = si->hContact; CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&sm); @@ -1350,7 +1346,7 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend) } // scroll log to bottom if the log was previously scrolled to bottom, else restore old position - if (bAppend || bAtBottom) + if (bRedraw || bAtBottom) ScrollToBottom(false, false); else m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point); diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h index 439f506308..69582f562d 100644 --- a/plugins/TabSRMM/src/msgs.h +++ b/plugins/TabSRMM/src/msgs.h @@ -593,7 +593,7 @@ public: LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override; LRESULT WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam) override; - void AddLog() override; + void AddLog(const LOGINFO &lin) override; void CloseTab() override; void DrawNickList(USERINFO *ui, DRAWITEMSTRUCT *dis) override; void EventAdded(MEVENT, const DB::EventInfo &dbei) override; @@ -696,7 +696,7 @@ public: void AppendUnicodeString(CMStringA &str, const wchar_t *pwszBuf) override; void Attach() override; void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override; - void LogEvents(SESSION_INFO *si, int iStart, bool) override; + void LogEvents(const LOGINFO *lin) override; void ScrollToBottom() override; void UpdateOptions() override; diff --git a/src/core/stdmsg/src/msglog.cpp b/src/core/stdmsg/src/msglog.cpp index 22486d106c..6331b6ec30 100644 --- a/src/core/stdmsg/src/msglog.cpp +++ b/src/core/stdmsg/src/msglog.cpp @@ -259,7 +259,6 @@ public: buffer.Append("}"); } - bool CreateRtfEvent(RtfLogStreamData *dat, DB::EventInfo &dbei) override { if (!DbEventIsShown(dbei)) @@ -478,19 +477,15 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// - void LogEvents(SESSION_INFO *si, int iStart, bool bAppend) override + void LogEvents(const LOGINFO *lin) override { - if (si == nullptr) - return; - - auto &lin = si->arEvents[iStart]; - if (!bAppend && si->iType == GCW_CHATROOM && (m_pDlg.m_iLogFilterFlags & lin.iType) == 0) - return; + auto *si = m_pDlg.getChat(); + bool bRedraw = lin == nullptr; RtfChatLogStreamData streamData; streamData.pLog = this; streamData.si = si; - streamData.iStartEvent = iStart; + streamData.lin = lin; streamData.bStripFormat = false; bool bFlag = false; @@ -515,10 +510,10 @@ public: // fix for the indent... must be a M$ bug if (sel.cpMax == 0) - bAppend = true; + bRedraw = true; // get the number of pixels per logical inch - if (bAppend) { + if (bRedraw) { HDC hdc = GetDC(nullptr); g_chatApi.logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY); g_chatApi.logPixelSX = GetDeviceCaps(hdc, LOGPIXELSX); @@ -528,10 +523,10 @@ public: } // stream in the event(s) - StreamChatRtfEvents(&streamData, bAppend); + StreamChatRtfEvents(&streamData, bRedraw); // do smileys - if (g_plugin.bSmileyInstalled && (bAppend || (lin.ptszText && lin.iType != GC_EVENT_JOIN && lin.iType != GC_EVENT_NICK && lin.iType != GC_EVENT_ADDSTATUS && lin.iType != GC_EVENT_REMOVESTATUS))) { + if (g_plugin.bSmileyInstalled && (bRedraw || (lin && lin->ptszText && lin->iType != GC_EVENT_JOIN && lin->iType != GC_EVENT_NICK && lin->iType != GC_EVENT_ADDSTATUS && lin->iType != GC_EVENT_REMOVESTATUS))) { CHARRANGE newsel; newsel.cpMax = -1; newsel.cpMin = sel.cpMin; @@ -542,14 +537,14 @@ public: sm.cbSize = sizeof(sm); sm.hwndRichEditControl = m_rtf.GetHwnd(); sm.Protocolname = si->pszModule; - sm.rangeToReplace = bAppend ? nullptr : &newsel; + sm.rangeToReplace = bRedraw ? nullptr : &newsel; sm.disableRedraw = TRUE; sm.hContact = si->hContact; CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&sm); } // scroll log to bottom if the log was previously scrolled to bottom, else restore old position - if (bAppend || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50) + if (bRedraw || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50) ScrollToBottom(); else m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point); diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index 5f6a1f0bde..1c50e3ac4a 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -61,15 +61,13 @@ void FreeMsgLogBitmaps(void); void ValidateFilename (wchar_t *filename); wchar_t* MakeTimeStamp(wchar_t *pszStamp, time_t time); wchar_t* GetChatLogsFilename(SESSION_INFO *si, time_t tTime); -char* Log_CreateRtfHeader(); -char* Log_CreateRTF(RtfChatLogStreamData *streamData); char* Log_SetStyle(int style); // chat_manager.cpp MODULEINFO* MM_AddModule(const char *pszModule); MODULEINFO* MM_FindModule(const char *pszModule); -BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted); +LOGINFO* SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted); BOOL SM_ChangeNick(SESSION_INFO *si, GCEVENT *gce); void SM_FreeSession(SESSION_INFO *si); char* SM_GetUsers(SESSION_INFO *si); diff --git a/src/mir_app/src/chat_log.cpp b/src/mir_app/src/chat_log.cpp index 5bbf07065d..60a68c78cf 100644 --- a/src/mir_app/src/chat_log.cpp +++ b/src/mir_app/src/chat_log.cpp @@ -86,10 +86,9 @@ char* Log_SetStyle(int style) return ""; } -static int Log_AppendRTF(RtfChatLogStreamData *streamData, bool simpleMode, CMStringA &buf, const wchar_t *line) +static int Log_AppendRTF(RtfChatLogStreamData *streamData, const LOGINFO &lin, bool simpleMode, CMStringA &buf, const wchar_t *line) { int textCharsCount = 0; - auto &lin = streamData->si->arEvents[streamData->iStartEvent]; for (; *line; line++, textCharsCount++) { if (*line == '\r' && line[1] == '\n') { @@ -267,6 +266,7 @@ wchar_t* MakeTimeStamp(wchar_t *pszStamp, time_t time) static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { RtfChatLogStreamData *dat = (RtfChatLogStreamData *)dwCookie; + auto *si = dat->si; if (dat->buf.IsEmpty()) { switch (dat->iStage) { @@ -276,17 +276,17 @@ static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, L break; case STREAMSTAGE_EVENTS: - { - auto &events = dat->si->arEvents; - if (dat->iStartEvent < events.getCount()) { - auto *si = dat->si; - auto &lin = events[dat->iStartEvent]; + if (!dat->lin) { + auto &events = si->arEvents; + if (dat->idx < events.getCount()) { + auto &lin = events[dat->idx]; if (si->iType == GCW_SERVER || (si->pDlg->m_iLogFilterFlags & lin.iType) != 0) dat->pLog->CreateChatRtfEvent(dat, lin); - dat->iStartEvent++; + dat->idx++; break; } } + else dat->pLog->CreateChatRtfEvent(dat, *dat->lin); dat->iStage = STREAMSTAGE_TAIL; __fallthrough; @@ -312,14 +312,16 @@ static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, L return 0; } -void CRtfLogWindow::StreamChatRtfEvents(RtfChatLogStreamData *streamData, bool bAppend) +void CRtfLogWindow::StreamChatRtfEvents(RtfChatLogStreamData *streamData, bool bRedraw) { - streamData->bAppend = bAppend; + streamData->bRedraw = bRedraw; + if (streamData->lin) + streamData->idx = streamData->si->arEvents.getCount()-1; EDITSTREAM stream = {}; stream.pfnCallback = ChatLogStreamCallback; stream.dwCookie = (DWORD_PTR)streamData; - m_rtf.SendMsg(EM_STREAMIN, bAppend ? SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream); + m_rtf.SendMsg(EM_STREAMIN, (bRedraw) ? SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -377,7 +379,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L CMStringA &buf = streamData->buf; // create new line, and set font and color - if (streamData->iStartEvent != 0) + if (streamData->idx != 0) buf.Append("\\par "); buf.AppendFormat("%s ", Log_SetStyle(0)); @@ -414,7 +416,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L wcsncpy_s(szOldTimeStamp, MakeTimeStamp(g_Settings->pszTimeStamp, si->LastTime), _TRUNCATE); if (!g_Settings->bShowTimeIfChanged || si->LastTime == 0 || mir_wstrcmp(szTimeStamp, szOldTimeStamp)) { si->LastTime = lin.time; - Log_AppendRTF(streamData, true, buf, szTimeStamp); + Log_AppendRTF(streamData, lin, true, buf, szTimeStamp); } buf.Append("\\tab "); } @@ -425,7 +427,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L CMStringW tmp((lin.bIsMe) ? g_Settings->pszOutgoingNick : g_Settings->pszIncomingNick); tmp.Replace(L"%n", lin.ptszNick); - Log_AppendRTF(streamData, TRUE, buf, tmp); + Log_AppendRTF(streamData, lin, true, buf, tmp); buf.AppendChar(' '); } @@ -435,11 +437,11 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L CMStringW wszCaption; bool bTextUsed = Chat_GetDefaultEventDescr(streamData->si, &lin, wszCaption); if (!wszCaption.IsEmpty()) - Log_AppendRTF(streamData, !bTextUsed, buf, wszCaption); + Log_AppendRTF(streamData, lin, !bTextUsed, buf, wszCaption); if (!bTextUsed && lin.ptszText) { if (!wszCaption.IsEmpty()) - Log_AppendRTF(streamData, false, buf, L" "); - Log_AppendRTF(streamData, false, buf, lin.ptszText); + Log_AppendRTF(streamData, lin, false, buf, L" "); + Log_AppendRTF(streamData, lin, false, buf, lin.ptszText); } } @@ -450,7 +452,7 @@ void CRtfLogWindow::CreateChatRtfTail(RtfChatLogStreamData *streamData) { CMStringA &str = streamData->buf; - if (streamData->bAppend) + if (streamData->bRedraw) str.Append("\\par}"); else str.Append("}");; diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index e12f308528..a9772c1113 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -194,10 +194,10 @@ static HICON SM_GetStatusIcon(SESSION_INFO *si, USERINFO *ui) return g_chatApi.hStatusIcons[0]; } -BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted) +LOGINFO* SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted) { if (si == nullptr) - return TRUE; + return nullptr; LOGINFO *li = new LOGINFO(); li->time = gce->time; @@ -206,7 +206,7 @@ BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted) li->hEvent = gce->hEvent; if (si->arEvents.find(li)) { delete li; - return TRUE; + return nullptr; } } else li->hEvent = si->iLastEvent++; @@ -225,9 +225,8 @@ BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted) si->arEvents.remove(0); si->bTrimmed = true; - return FALSE; } - return TRUE; + return li; } BOOL SM_RemoveUser(SESSION_INFO *si, const wchar_t *pszUID) diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index a6f665ba5e..64b05b018a 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -543,12 +543,13 @@ static BOOL HandleChatEvent(GCEVENT &gce, int bManyFix) if (USERINFO *ui = g_chatApi.UM_FindUser(si, gce.pszUID.w)) gce.pszNick.w = ui->pszNick; - int isOk = SM_AddEvent(si, &gce, bIsHighlighted); - if (si->pDlg) { - if (isOk) - si->pDlg->AddLog(); - else - si->pDlg->RedrawLog(); + if (auto *lin = SM_AddEvent(si, &gce, bIsHighlighted)) { + if (si->pDlg) { + if (!si->bTrimmed) + si->pDlg->AddLog(*lin); + else + si->pDlg->RedrawLog(); + } } if (!(gce.dwFlags & GCEF_NOTNOTIFY)) diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index db09732753..8664a4ddf2 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -324,7 +324,7 @@ Chat_UpdateOptions @418 NONAME ?ShowColorChooser@CSrmmBaseDialog@@QAEXH@Z @421 NONAME ?ShowFilterMenu@CSrmmBaseDialog@@UAEXXZ @422 NONAME ?OnInitDialog@CSrmmBaseDialog@@MAE_NXZ @423 NONAME -?AddLog@CSrmmBaseDialog@@UAEXXZ @425 NONAME +?AddLog@CSrmmBaseDialog@@UAEXABULOGINFO@@@Z @425 NONAME ?UpdateNickList@CSrmmBaseDialog@@UAEXXZ @428 NONAME ?onClick_BIU@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @430 NONAME ?onClick_BkColor@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @431 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 63930e04f8..de48b7f87c 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -324,7 +324,7 @@ Chat_UpdateOptions @418 NONAME ?ShowColorChooser@CSrmmBaseDialog@@QEAAXH@Z @421 NONAME ?ShowFilterMenu@CSrmmBaseDialog@@UEAAXXZ @422 NONAME ?OnInitDialog@CSrmmBaseDialog@@MEAA_NXZ @423 NONAME -?AddLog@CSrmmBaseDialog@@UEAAXXZ @425 NONAME +?AddLog@CSrmmBaseDialog@@UEAAXAEBULOGINFO@@@Z @425 NONAME ?UpdateNickList@CSrmmBaseDialog@@UEAAXXZ @428 NONAME ?onClick_BIU@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @430 NONAME ?onClick_BkColor@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @431 NONAME diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index 94a7a6d21e..a2b0441945 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -579,13 +579,10 @@ INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) return CDlgBase::DlgProc(msg, wParam, lParam); } -void CSrmmBaseDialog::AddLog() +void CSrmmBaseDialog::AddLog(const LOGINFO &lin) { - int iEventCount = m_si->arEvents.getCount(); - if (iEventCount) - m_pLog->LogEvents(m_si, iEventCount-1, false); - else - m_pLog->Clear(); + if (m_si->iType == GCW_SERVER || (m_iLogFilterFlags & lin.iType)) + m_pLog->LogEvents(&lin); } bool CSrmmBaseDialog::AllowTyping() const @@ -620,7 +617,7 @@ void CSrmmBaseDialog::RedrawLog() m_si->LastTime = 0; if (m_si->arEvents.getCount()) - m_pLog->LogEvents(m_si, 0, true); + m_pLog->LogEvents(nullptr); else ClearLog(); } @@ -659,7 +656,7 @@ void CSrmmBaseDialog::UpdateChatLog() } m_si->bHistoryInit = true; - m_pLog->LogEvents(m_si, 0, false); + m_pLog->LogEvents(nullptr); } void CSrmmBaseDialog::UpdateFilterButton() diff --git a/src/mir_app/src/srmm_log_hpp.cpp b/src/mir_app/src/srmm_log_hpp.cpp index 052e54c732..7d696d40bb 100644 --- a/src/mir_app/src/srmm_log_hpp.cpp +++ b/src/mir_app/src/srmm_log_hpp.cpp @@ -95,6 +95,8 @@ public: return (wchar_t *)CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event); } + //////////////////////////////////////////////////////////////////////////////////////// + void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override { if (!bAppend) @@ -109,8 +111,13 @@ public: CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event); } - void CHppLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool) override + //////////////////////////////////////////////////////////////////////////////////////// + + void LogEvent(const LOGINFO *lin) { + if (!lin->ptszText) + return; + IEVIEWEVENTDATA ied = {}; ied.dwFlags = IEEDF_UNICODE_NICK | IEEDF_UNICODE_TEXT; @@ -122,60 +129,63 @@ public: event.eventData = &ied; event.count = 1; - for (int i=iStart; i < si->arEvents.getCount(); i++) { - auto &pLog = si->arEvents[i]; - - if (pLog.ptszText) { - ied.szNick.w = pLog.ptszNick; - ied.szText.w = pLog.ptszText; - ied.time = pLog.time; - ied.bIsMe = pLog.bIsMe; - - switch (pLog.iType) { - case GC_EVENT_MESSAGE: - ied.iType = IEED_GC_EVENT_MESSAGE; - ied.dwData = IEEDD_GC_SHOW_NICK; - break; - case GC_EVENT_ACTION: - ied.iType = IEED_GC_EVENT_ACTION; - break; - case GC_EVENT_JOIN: - ied.iType = IEED_GC_EVENT_JOIN; - break; - case GC_EVENT_PART: - ied.iType = IEED_GC_EVENT_PART; - break; - case GC_EVENT_QUIT: - ied.iType = IEED_GC_EVENT_QUIT; - break; - case GC_EVENT_NICK: - ied.iType = IEED_GC_EVENT_NICK; - break; - case GC_EVENT_KICK: - ied.iType = IEED_GC_EVENT_KICK; - break; - case GC_EVENT_NOTICE: - ied.iType = IEED_GC_EVENT_NOTICE; - break; - case GC_EVENT_TOPIC: - ied.iType = IEED_GC_EVENT_TOPIC; - break; - case GC_EVENT_INFORMATION: - ied.iType = IEED_GC_EVENT_INFORMATION; - break; - case GC_EVENT_ADDSTATUS: - ied.iType = IEED_GC_EVENT_ADDSTATUS; - break; - case GC_EVENT_REMOVESTATUS: - ied.iType = IEED_GC_EVENT_REMOVESTATUS; - break; - } - ied.dwData |= g_Settings->bShowTime ? IEEDD_GC_SHOW_TIME : 0; - ied.dwData |= IEEDD_GC_SHOW_ICON; - ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK; - CallService(MS_HPP_EG_EVENT, 0, (LPARAM) & event); - } + ied.szNick.w = lin->ptszNick; + ied.szText.w = lin->ptszText; + ied.time = lin->time; + ied.bIsMe = lin->bIsMe; + + switch (lin->iType) { + case GC_EVENT_MESSAGE: + ied.iType = IEED_GC_EVENT_MESSAGE; + ied.dwData = IEEDD_GC_SHOW_NICK; + break; + case GC_EVENT_ACTION: + ied.iType = IEED_GC_EVENT_ACTION; + break; + case GC_EVENT_JOIN: + ied.iType = IEED_GC_EVENT_JOIN; + break; + case GC_EVENT_PART: + ied.iType = IEED_GC_EVENT_PART; + break; + case GC_EVENT_QUIT: + ied.iType = IEED_GC_EVENT_QUIT; + break; + case GC_EVENT_NICK: + ied.iType = IEED_GC_EVENT_NICK; + break; + case GC_EVENT_KICK: + ied.iType = IEED_GC_EVENT_KICK; + break; + case GC_EVENT_NOTICE: + ied.iType = IEED_GC_EVENT_NOTICE; + break; + case GC_EVENT_TOPIC: + ied.iType = IEED_GC_EVENT_TOPIC; + break; + case GC_EVENT_INFORMATION: + ied.iType = IEED_GC_EVENT_INFORMATION; + break; + case GC_EVENT_ADDSTATUS: + ied.iType = IEED_GC_EVENT_ADDSTATUS; + break; + case GC_EVENT_REMOVESTATUS: + ied.iType = IEED_GC_EVENT_REMOVESTATUS; + break; + } + ied.dwData |= g_Settings->bShowTime ? IEEDD_GC_SHOW_TIME : 0; + ied.dwData |= IEEDD_GC_SHOW_ICON; + ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK; + CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event); + } + + void LogEvents(const LOGINFO *lin) override + { + if (lin == nullptr) { + for (auto &it : m_pDlg.getChat()->arEvents) + LogEvent(it); } + else LogEvent(lin); } void Resize() override -- cgit v1.2.3