From 123fa87f68c42b4f121ad315623a9fb5a39ab30c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 14 Apr 2023 23:33:11 +0300 Subject: all LogStreamInEvents implementations unified, old memory allocation schema dropped --- plugins/Scriver/src/globals.h | 2 +- plugins/Scriver/src/msglog.cpp | 256 ++++++++++++------------------------- plugins/Scriver/src/msgoptions.cpp | 6 +- 3 files changed, 86 insertions(+), 178 deletions(-) (limited to 'plugins/Scriver/src') diff --git a/plugins/Scriver/src/globals.h b/plugins/Scriver/src/globals.h index 995d823ebb..69758366a4 100644 --- a/plugins/Scriver/src/globals.h +++ b/plugins/Scriver/src/globals.h @@ -135,6 +135,6 @@ int ImageList_AddIcon_Ex2(HIMAGELIST hIml, HICON hIcon); int ImageList_ReplaceIcon_Ex(HIMAGELIST hIml, int nIndex, int id); int ImageList_AddIcon_ProtoEx(HIMAGELIST hIml, const char *szProto, int status); -void StreamInTestEvents(HWND hEditWnd, GlobalMessageData *gdat); +void StreamInTestEvents(CDlgBase *pDlg, GlobalMessageData *gdat); #endif diff --git a/plugins/Scriver/src/msglog.cpp b/plugins/Scriver/src/msglog.cpp index 6b3e777bca..9371504a9d 100644 --- a/plugins/Scriver/src/msglog.cpp +++ b/plugins/Scriver/src/msglog.cpp @@ -31,27 +31,11 @@ static int logPixelSY; static char* pLogIconBmpBits[3]; static HIMAGELIST g_hImageList; -#define STREAMSTAGE_HEADER 0 -#define STREAMSTAGE_EVENTS 1 -#define STREAMSTAGE_TAIL 2 -#define STREAMSTAGE_STOP 3 - -struct LogStreamData +struct RtfLogStreamData : public RtfLogStreamBase { - int stage; - MCONTACT hContact; - MEVENT hDbEvent, hDbEventLast; - char *buffer; - size_t bufferOffset, bufferLen; - int eventsToInsert; - int isFirst; - class CLogWindow *pLog; GlobalMessageData *gdat; - DB::EventInfo *dbei; }; -static DWORD CALLBACK LogStreamInEvents(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb); - bool DbEventIsMessageOrCustom(const DB::EventInfo &dbei) { return dbei.eventType == EVENTTYPE_MESSAGE || dbei.eventType == EVENTTYPE_FILE || dbei.isSrmm(); @@ -108,51 +92,6 @@ static void AppendUnicodeToBuffer(CMStringA &buf, const wchar_t *line) buf.AppendChar('}'); } -// mir_free() the return value -static char* CreateRTFHeader() -{ - HDC hdc = GetDC(nullptr); - logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY); - ReleaseDC(nullptr, hdc); - - CMStringA buf; - - buf.Append("{\\rtf1\\ansi\\deff0{\\fonttbl"); - for (int i = 0; i < fontOptionsListSize; i++) { - LOGFONT lf; - LoadMsgDlgFont(i, &lf, nullptr); - buf.AppendFormat("{\\f%u\\fnil\\fcharset%u %S;}", i, lf.lfCharSet, lf.lfFaceName); - } - buf.Append("}{\\colortbl "); - - COLORREF colour; - for (int i = 0; i < fontOptionsListSize; i++) { - LoadMsgDlgFont(i, nullptr, &colour); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - } - if (GetSysColorBrush(COLOR_HOTLIGHT) == nullptr) - colour = RGB(0, 0, 255); - else - colour = GetSysColor(COLOR_HOTLIGHT); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - colour = g_plugin.getDword(SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - colour = g_plugin.getDword(SRMSGSET_INCOMINGBKGCOLOUR, SRMSGDEFSET_INCOMINGBKGCOLOUR); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - colour = g_plugin.getDword(SRMSGSET_OUTGOINGBKGCOLOUR, SRMSGDEFSET_OUTGOINGBKGCOLOUR); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - colour = g_plugin.getDword(SRMSGSET_LINECOLOUR, SRMSGDEFSET_LINECOLOUR); - buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); - buf.Append("}"); - return buf.Detach(); -} - -// mir_free() the return value -static char* CreateRTFTail() -{ - return mir_strdup("}"); -} - // return value is static static char* SetToStyle(int style) { @@ -222,7 +161,7 @@ int isSameDate(time_t time1, time_t time2) return 0; } -static void AppendWithCustomLinks(DBEVENTINFO &dbei, int style, CMStringA &buf) +static void AppendWithCustomLinks(const DB::EventInfo &dbei, int style, CMStringA &buf) { if (dbei.pBlob == nullptr) return; @@ -322,6 +261,13 @@ void FreeMsgLogIcons(void) ///////////////////////////////////////////////////////////////////////////////////////// // CLogWindow - built-in log window +const char *szBuiltinEvents[] = { + "O Lord, bless this Thy hand grenade that with it Thou mayest blow Thine enemies", + "to tiny bits, in Thy mercy", + "Lorem ipsum dolor sit amet,", + "consectetur adipisicing elit", +}; + class CLogWindow : public CRtfLogWindow { typedef CRtfLogWindow CSuper; @@ -372,12 +318,63 @@ public: m_rtf.SendMsg(EM_AUTOURLDETECT, TRUE, 0); } - char* CreateRTFFromEvent(DB::EventInfo &dbei, LogStreamData *streamData) + void CreateRtfHeader(RtfLogStreamData *streamData) override + { + HDC hdc = GetDC(nullptr); + logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(nullptr, hdc); + + auto &buf = streamData->buf; + + buf.Append("{\\rtf1\\ansi\\deff0{\\fonttbl"); + for (int i = 0; i < fontOptionsListSize; i++) { + LOGFONT lf; + LoadMsgDlgFont(i, &lf, nullptr); + buf.AppendFormat("{\\f%u\\fnil\\fcharset%u %S;}", i, lf.lfCharSet, lf.lfFaceName); + } + buf.Append("}{\\colortbl "); + + COLORREF colour; + for (int i = 0; i < fontOptionsListSize; i++) { + LoadMsgDlgFont(i, nullptr, &colour); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + } + if (GetSysColorBrush(COLOR_HOTLIGHT) == nullptr) + colour = RGB(0, 0, 255); + else + colour = GetSysColor(COLOR_HOTLIGHT); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + colour = g_plugin.getDword(SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + colour = g_plugin.getDword(SRMSGSET_INCOMINGBKGCOLOUR, SRMSGDEFSET_INCOMINGBKGCOLOUR); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + colour = g_plugin.getDword(SRMSGSET_OUTGOINGBKGCOLOUR, SRMSGDEFSET_OUTGOINGBKGCOLOUR); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + colour = g_plugin.getDword(SRMSGSET_LINECOLOUR, SRMSGDEFSET_LINECOLOUR); + buf.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); + buf.Append("}"); + } + + bool CreateRtfEvent(RtfLogStreamData *streamData, DB::EventInfo &dbei) override { + if (!DbEventIsShown(dbei)) + return false; + + if (streamData->dbei) { + if (streamData->eventsToInsert == _countof(szBuiltinEvents)) + return false; + + dbei.flags = DBEF_UTF | ((streamData->eventsToInsert < 2) ? DBEF_SENT : 0); + dbei.pBlob = (uint8_t *)TranslateU(szBuiltinEvents[streamData->eventsToInsert]); + dbei.cbBlob = (int)mir_strlen((char *)dbei.pBlob); + } + int style, showColon = 0; int isGroupBreak = TRUE; int highlight = 0; + auto *gdat = streamData->gdat; + auto &buf = streamData->buf; if ((gdat->flags.bGroupMessages) && dbei.flags == LOWORD(m_lastEventType) && dbei.eventType == EVENTTYPE_MESSAGE && HIWORD(m_lastEventType) == EVENTTYPE_MESSAGE && @@ -385,21 +382,21 @@ public: isGroupBreak = FALSE; } + bool bIsRtl = (dbei.flags & DBEF_RTL) != 0; ptrW wszText(DbEvent_GetTextW(&dbei, CP_UTF8)), wszNick; // test contact - if (m_pDlg.m_hContact != 0) { + if (streamData->dbei == 0) { if (dbei.flags & DBEF_SENT) wszNick = Contact::GetInfo(CNF_DISPLAY, 0, m_pDlg.m_szProto); else wszNick = mir_wstrdup(Clist_GetContactDisplayName(m_pDlg.m_hContact)); + + if (!m_pDlg.m_bUseRtl && Utils_IsRtl(wszText)) + bIsRtl = true; } else wszNick = mir_wstrdup((dbei.flags & DBEF_SENT) ? TranslateT("Me") : TranslateT("My contact")); - if (!m_pDlg.m_bUseRtl && Utils_IsRtl(wszText)) - dbei.flags |= DBEF_RTL; - - CMStringA buf; if (!streamData->isFirst && !m_isMixed) { if (isGroupBreak || gdat->flags.bMarkFollowups) buf.Append("\\par"); @@ -407,13 +404,13 @@ public: buf.Append("\\line"); } - if (dbei.flags & DBEF_RTL) + if (bIsRtl) m_isMixed = 1; if (!streamData->isFirst && isGroupBreak && (gdat->flags.bDrawLines)) buf.AppendFormat("\\sl-1\\slmult0\\highlight%d\\cf%d\\fs1 \\par\\sl0", fontOptionsListSize + 4, fontOptionsListSize + 4); - buf.Append((dbei.flags & DBEF_RTL) ? "\\rtlpar" : "\\ltrpar"); + buf.Append(bIsRtl ? "\\rtlpar" : "\\ltrpar"); if (dbei.eventType == EVENTTYPE_MESSAGE) highlight = fontOptionsListSize + 2 + ((dbei.flags & DBEF_SENT) ? 1 : 0); @@ -429,7 +426,7 @@ public: } streamData->isFirst = FALSE; if (m_isMixed) { - if (dbei.flags & DBEF_RTL) + if (bIsRtl) buf.Append("\\ltrch\\rtlch"); else buf.Append("\\rtlch\\ltrch"); @@ -505,7 +502,7 @@ public: showColon = 1; } if (showColon && dbei.eventType == EVENTTYPE_MESSAGE) { - if (dbei.flags & DBEF_RTL) + if (bIsRtl) buf.AppendFormat("\\~%s: ", SetToStyle(dbei.flags & DBEF_SENT ? MSGFONTID_MYCOLON : MSGFONTID_YOURCOLON)); else buf.AppendFormat("%s: ", SetToStyle(dbei.flags & DBEF_SENT ? MSGFONTID_MYCOLON : MSGFONTID_YOURCOLON)); @@ -549,7 +546,7 @@ public: m_lastEventTime = dbei.timestamp; m_lastEventType = MAKELONG(dbei.flags, dbei.eventType); - return buf.Detach(); + return true; } void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override @@ -561,7 +558,7 @@ public: m_rtf.SetDraw(false); m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&oldSel); - LogStreamData streamData = {}; + RtfLogStreamData streamData = {}; streamData.hContact = m_pDlg.m_hContact; streamData.hDbEvent = hDbEventFirst; streamData.hDbEventLast = m_pDlg.m_hDbEventLast; @@ -570,9 +567,6 @@ public: streamData.isFirst = bAppend ? m_rtf.GetRichTextLength() == 0 : 1; streamData.gdat = &g_dat; - EDITSTREAM stream = {}; - stream.pfnCallback = LogStreamInEvents; - stream.dwCookie = (DWORD_PTR)&streamData; sel.cpMin = 0; POINT scrollPos; @@ -606,7 +600,8 @@ public: m_isMixed = 0; } - m_rtf.SendMsg(EM_STREAMIN, bAppend ? SFF_SELECTION | SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream); + StreamRtfEvents(&streamData, bAppend); + if (bottomScroll) { sel.cpMin = sel.cpMax = -1; m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel); @@ -814,91 +809,7 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// -const char *szBuiltinEvents[] = { - "O Lord, bless this Thy hand grenade that with it Thou mayest blow Thine enemies", - "to tiny bits, in Thy mercy", - "Lorem ipsum dolor sit amet,", - "consectetur adipisicing elit", -}; - -static DWORD CALLBACK LogStreamInEvents(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) -{ - LogStreamData *dat = (LogStreamData *)dwCookie; - - if (dat->buffer == nullptr) { - dat->bufferOffset = 0; - switch (dat->stage) { - case STREAMSTAGE_HEADER: - dat->buffer = CreateRTFHeader(); - dat->stage = STREAMSTAGE_EVENTS; - break; - - case STREAMSTAGE_EVENTS: - // predefined text event - if (dat->dbei != nullptr) { - dat->dbei->flags = DBEF_UTF | ((dat->eventsToInsert < 2) ? DBEF_SENT : 0); - dat->dbei->pBlob = (uint8_t *)TranslateU(szBuiltinEvents[dat->eventsToInsert++]); - dat->dbei->cbBlob = (int)mir_strlen((char *)dat->dbei->pBlob); - dat->buffer = dat->pLog->CreateRTFFromEvent(*dat->dbei, dat); - if (dat->eventsToInsert == _countof(szBuiltinEvents)) { - dat->dbei->pBlob = nullptr; - dat->dbei = nullptr; - } - } - // usual database event - else if (dat->eventsToInsert) { - do { - dat->buffer = nullptr; - - DB::EventInfo dbei(dat->hDbEvent); - if (dbei && DbEventIsShown(dbei)) { - dat->buffer = dat->pLog->CreateRTFFromEvent(dbei, dat); - - if (!(dbei.flags & DBEF_SENT) && (dbei.eventType == EVENTTYPE_MESSAGE || dbei.isSrmm())) { - db_event_markRead(dat->hContact, dat->hDbEvent); - g_clistApi.pfnRemoveEvent(dat->hContact, dat->hDbEvent); - } - else if (dbei.eventType == EVENTTYPE_JABBER_CHATSTATES || dbei.eventType == EVENTTYPE_JABBER_PRESENCE) - db_event_markRead(dat->hContact, dat->hDbEvent); - } - - if (dat->buffer) - dat->hDbEventLast = dat->hDbEvent; - dat->hDbEvent = db_event_next(dat->hContact, dat->hDbEvent); - if (--dat->eventsToInsert == 0) - break; - } while (dat->buffer == nullptr && dat->hDbEvent); - } - if (dat->buffer) - break; - - dat->stage = STREAMSTAGE_TAIL; - __fallthrough; - - case STREAMSTAGE_TAIL: - dat->buffer = CreateRTFTail(); - dat->stage = STREAMSTAGE_STOP; - break; - - case STREAMSTAGE_STOP: - *pcb = 0; - return 0; - } - dat->bufferLen = mir_strlen(dat->buffer); - } - *pcb = min(cb, LONG(dat->bufferLen - dat->bufferOffset)); - memcpy(pbBuff, dat->buffer + dat->bufferOffset, *pcb); - dat->bufferOffset += *pcb; - if (dat->bufferOffset == dat->bufferLen) { - mir_free(dat->buffer); - dat->buffer = nullptr; - } - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -void StreamInTestEvents(HWND hEditWnd, GlobalMessageData *gdat) +void StreamInTestEvents(CDlgBase *pDlg, GlobalMessageData *gdat) { DB::EventInfo dbei; dbei.flags = DBEF_UTF; @@ -906,22 +817,19 @@ void StreamInTestEvents(HWND hEditWnd, GlobalMessageData *gdat) dbei.timestamp = time(0); dbei.szModule = SRMM_MODULE; - CMsgDialog *dat = new CMsgDialog(0, false); + auto *pLog = new CLogWindow(*(CMsgDialog*)pDlg); - LogStreamData streamData = {}; + RtfLogStreamData streamData = {}; streamData.isFirst = TRUE; streamData.dbei = &dbei; - streamData.pLog = new CLogWindow(*dat); + streamData.pLog = pLog; streamData.gdat = gdat; + pLog->StreamRtfEvents(&streamData, false); - EDITSTREAM stream = { 0 }; - stream.pfnCallback = LogStreamInEvents; - stream.dwCookie = (DWORD_PTR)&streamData; - SendMessage(hEditWnd, EM_STREAMIN, SF_RTF, (LPARAM)&stream); - SendMessage(hEditWnd, EM_HIDESELECTION, FALSE, 0); + SendDlgItemMessage(pDlg->GetHwnd(), IDC_SRMM_LOG, EM_HIDESELECTION, FALSE, 0); - delete streamData.pLog; - delete dat; + dbei.pBlob = nullptr; + delete pLog; } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/Scriver/src/msgoptions.cpp b/plugins/Scriver/src/msgoptions.cpp index 226307dcd2..3ffb686ae7 100644 --- a/plugins/Scriver/src/msgoptions.cpp +++ b/plugins/Scriver/src/msgoptions.cpp @@ -296,12 +296,12 @@ public: void onChange_Cascade(CCtrlCheck *pCheck) { - chkSavePerContact.SetState(!pCheck->GetState()); + chkSavePerContact.SetState(!pCheck->IsChecked()); } void onChange_SavePerContact(CCtrlCheck *pCheck) { - chkCascade.SetState(!pCheck->GetState()); + chkCascade.SetState(!pCheck->IsChecked()); } }; @@ -528,7 +528,7 @@ class CLogOptionsDlg : public CBaseOptionDlg pf2.dxOffset = (gdat.flags.bIndentText) ? gdat.indentSize * 1440 / g_dat.logPixelSX : 0; m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2); - StreamInTestEvents(m_rtf.GetHwnd(), &gdat); + StreamInTestEvents(this, &gdat); } public: -- cgit v1.2.3