From 156262f08922cf65d9aff58257d623f7eab70f2f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 3 Dec 2023 16:32:28 +0300 Subject: SRMM: sending quoted event as PSS_MESSAGE parameter --- plugins/Scriver/src/globals.cpp | 10 ++--- plugins/Scriver/src/msgdialog.cpp | 8 ++-- plugins/Scriver/src/msgs.h | 6 +-- plugins/Scriver/src/msgtimedout.cpp | 12 +++--- plugins/Scriver/src/msgutils.cpp | 6 +-- plugins/Scriver/src/sendqueue.cpp | 28 +++++++------- plugins/Scriver/src/sendqueue.h | 57 +++++++++++++++-------------- plugins/Scriver/src/tabs.cpp | 2 +- plugins/Scriver/src/tabs.h | 2 +- plugins/TabSRMM/src/generic_msghandlers.cpp | 2 +- plugins/TabSRMM/src/sendlater.cpp | 11 +++--- plugins/TabSRMM/src/sendlater.h | 2 +- plugins/TabSRMM/src/sendqueue.cpp | 9 +++-- plugins/TabSRMM/src/sendqueue.h | 1 + 14 files changed, 82 insertions(+), 74 deletions(-) (limited to 'plugins') diff --git a/plugins/Scriver/src/globals.cpp b/plugins/Scriver/src/globals.cpp index d3b03fb516..a9b36e00e5 100644 --- a/plugins/Scriver/src/globals.cpp +++ b/plugins/Scriver/src/globals.cpp @@ -102,23 +102,23 @@ static int ackevent(WPARAM, LPARAM lParam) return 0; MCONTACT hContact = pAck->hContact; - MessageSendQueueItem *item = FindSendQueueItem(hContact, pAck->hProcess); + auto *item = SendQueue::FindItem(hContact, pAck->hProcess); if (item == nullptr) - item = FindSendQueueItem(hContact = db_mc_getMeta(pAck->hContact), pAck->hProcess); + item = SendQueue::FindItem(hContact = db_mc_getMeta(pAck->hContact), pAck->hProcess); if (item == nullptr) return 0; auto *pSender = item->pDlg; if (pAck->result == ACKRESULT_FAILED) { if (item->hwndErrorDlg != nullptr) - item = FindOldestPendingSendQueueItem(pSender, hContact); + item = SendQueue::FindOldestPendingItem(pSender, hContact); if (item != nullptr && item->hwndErrorDlg == nullptr) { if (pSender != nullptr) { pSender->StopMessageSending(); pSender->ShowError((wchar_t *)pAck->lParam, item); } - else RemoveSendQueueItem(item); + else SendQueue::RemoveItem(item); } return 0; } @@ -143,7 +143,7 @@ static int ackevent(WPARAM, LPARAM lParam) if (item->hwndErrorDlg != nullptr) DestroyWindow(item->hwndErrorDlg); - if (RemoveSendQueueItem(item) && g_plugin.bAutoClose) { + if (SendQueue::RemoveItem(item) && g_plugin.bAutoClose) { if (pSender != nullptr) pSender->Close(); } diff --git a/plugins/Scriver/src/msgdialog.cpp b/plugins/Scriver/src/msgdialog.cpp index 8821644dcd..5ef1d370be 100644 --- a/plugins/Scriver/src/msgdialog.cpp +++ b/plugins/Scriver/src/msgdialog.cpp @@ -218,7 +218,7 @@ bool CMsgDialog::OnInitDialog() StartFlashing(); } - m_iMessagesInProgress = ReattachSendQueueItems(this, m_hContact); + m_iMessagesInProgress = SendQueue::ReattachItems(this, m_hContact); if (m_iMessagesInProgress > 0) ShowMessageSending(); } @@ -247,7 +247,7 @@ void CMsgDialog::OnDestroy() m_hStatusIconOverlay = nullptr; } - ReleaseSendQueueItems(this); + SendQueue::ReleaseItems(this); if (g_dat.flags.bSaveDrafts) { ptrA szText(m_message.GetRichTextRtf(true)); if (szText) @@ -296,7 +296,7 @@ void CMsgDialog::onClick_Ok(CCtrlButton *pButton) pf2.dwMask = PFM_RTLPARA; m_message.SendMsg(EM_GETPARAFORMAT, 0, (LPARAM)&pf2); - MessageSendQueueItem msi = {}; + SendQueue::Item msi = {}; if (pf2.wEffects & PFE_RTLPARA) msi.flags |= PREF_RTL; @@ -1001,7 +1001,7 @@ INT_PTR CMsgDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) case WM_TIMER: if (wParam == TIMERID_MSGSEND) - ReportSendQueueTimeouts(this); + SendQueue::ReportTimeouts(this); else if (wParam == TIMERID_UNREAD) { TabControlData tcd; tcd.iFlags = TCDF_ICON; diff --git a/plugins/Scriver/src/msgs.h b/plugins/Scriver/src/msgs.h index 7c9fd6c3c5..78f75add4f 100644 --- a/plugins/Scriver/src/msgs.h +++ b/plugins/Scriver/src/msgs.h @@ -54,7 +54,7 @@ class CMsgDialog : public CSrmmBaseDialog void Init(void); int InputAreaShortcuts(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void MessageDialogResize(int w, int h); - void MessageSend(const MessageSendQueueItem &msg); + void MessageSend(const SendQueue::Item &msg); void ShowAvatar(void); void SetDialogToType(void); void SetStatusIcon(void); @@ -141,8 +141,8 @@ public: void UpdateStatusBar() override; void UpdateTitle() override; - void HandleError(bool bRetry, MessageSendQueueItem *pItem); - void ShowError(const wchar_t *pwszMsg, MessageSendQueueItem *pItem); + void HandleError(bool bRetry, SendQueue::Item *pItem); + void ShowError(const wchar_t *pwszMsg, SendQueue::Item *pItem); void FixTabIcons(); void GetAvatar(); diff --git a/plugins/Scriver/src/msgtimedout.cpp b/plugins/Scriver/src/msgtimedout.cpp index 2ea8412755..f65e9a2c29 100644 --- a/plugins/Scriver/src/msgtimedout.cpp +++ b/plugins/Scriver/src/msgtimedout.cpp @@ -28,12 +28,12 @@ class CErrorDlg : public CDlgBase ptrW m_wszText; CMStringW m_wszName, m_wszDescr; CMsgDialog *m_pOwner; - MessageSendQueueItem *m_queueItem; + SendQueue::Item *m_queueItem; CCtrlBase m_errorText, m_msgText; public: - CErrorDlg(CMsgDialog *pOwner, const wchar_t *pwszDescr, MessageSendQueueItem *pItem) : + CErrorDlg(CMsgDialog *pOwner, const wchar_t *pwszDescr, SendQueue::Item *pItem) : CDlgBase(g_plugin, IDD_MSGSENDERROR), m_pOwner(pOwner), m_wszText(mir_utf8decodeW(pItem->sendBuffer)), @@ -75,21 +75,21 @@ public: } }; -void CMsgDialog::ShowError(const wchar_t *pwszMsg, MessageSendQueueItem *pItem) +void CMsgDialog::ShowError(const wchar_t *pwszMsg, SendQueue::Item *pItem) { auto *pDlg = new CErrorDlg(this, pwszMsg, pItem); pDlg->SetParent(m_hwnd); pDlg->Show(); } -void CMsgDialog::HandleError(bool bRetry, MessageSendQueueItem *pItem) +void CMsgDialog::HandleError(bool bRetry, SendQueue::Item *pItem) { if (bRetry) { StartMessageSending(); - SendSendQueueItem(pItem); + SendQueue::SendItem(pItem); } else { - RemoveSendQueueItem(pItem); + SendQueue::RemoveItem(pItem); SetFocus(m_message.GetHwnd()); } } diff --git a/plugins/Scriver/src/msgutils.cpp b/plugins/Scriver/src/msgutils.cpp index fdbeb7a117..62429f8c9c 100644 --- a/plugins/Scriver/src/msgutils.cpp +++ b/plugins/Scriver/src/msgutils.cpp @@ -259,17 +259,17 @@ void CMsgDialog::LoadSettings() LoadMsgDlgFont(MSGFONTID_MESSAGEAREA, nullptr, &m_clrInputFG); } -void CMsgDialog::MessageSend(const MessageSendQueueItem &msi) +void CMsgDialog::MessageSend(const SendQueue::Item &msi) { StartMessageSending(); - MessageSendQueueItem *item = CreateSendQueueItem(this); + SendQueue::Item *item = SendQueue::CreateItem(this); item->hContact = m_hContact; item->proto = mir_strdup(m_szProto); item->flags = msi.flags; item->sendBufferSize = msi.sendBufferSize; item->sendBuffer = mir_strndup(msi.sendBuffer, msi.sendBufferSize); - SendSendQueueItem(item); + SendQueue::SendItem(item); } // Don't send to protocols who don't support typing diff --git a/plugins/Scriver/src/sendqueue.cpp b/plugins/Scriver/src/sendqueue.cpp index 2447759f57..a450e2f280 100644 --- a/plugins/Scriver/src/sendqueue.cpp +++ b/plugins/Scriver/src/sendqueue.cpp @@ -23,12 +23,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "stdafx.h" -static OBJLIST arQueue(1, PtrKeySortT); +using namespace SendQueue; + +static OBJLIST arQueue(1, PtrKeySortT); static mir_cs queueMutex; -MessageSendQueueItem* CreateSendQueueItem(CMsgDialog *pDlg) +Item* SendQueue::CreateItem(CMsgDialog *pDlg) { - MessageSendQueueItem *item = new MessageSendQueueItem(); + Item *item = new Item(); item->pDlg = pDlg; mir_cslock lck(queueMutex); @@ -36,7 +38,7 @@ MessageSendQueueItem* CreateSendQueueItem(CMsgDialog *pDlg) return item; } -MessageSendQueueItem* FindOldestPendingSendQueueItem(CMsgDialog *pDlg, MCONTACT hContact) +Item* SendQueue::FindOldestPendingItem(CMsgDialog *pDlg, MCONTACT hContact) { mir_cslock lck(queueMutex); for (auto &it : arQueue) @@ -46,7 +48,7 @@ MessageSendQueueItem* FindOldestPendingSendQueueItem(CMsgDialog *pDlg, MCONTACT return nullptr; } -MessageSendQueueItem* FindSendQueueItem(MCONTACT hContact, HANDLE hSendId) +Item* SendQueue::FindItem(MCONTACT hContact, HANDLE hSendId) { mir_cslock lock(queueMutex); for (auto &it : arQueue) @@ -56,7 +58,7 @@ MessageSendQueueItem* FindSendQueueItem(MCONTACT hContact, HANDLE hSendId) return nullptr; } -bool RemoveSendQueueItem(MessageSendQueueItem *item) +bool SendQueue::RemoveItem(Item *item) { auto *pDlg = item->pDlg; { @@ -71,7 +73,7 @@ bool RemoveSendQueueItem(MessageSendQueueItem *item) return true; } -void ReportSendQueueTimeouts(CMsgDialog *pDlg) +void SendQueue::ReportTimeouts(CMsgDialog *pDlg) { int timeout = g_plugin.iMsgTimeout * 1000; @@ -80,7 +82,7 @@ void ReportSendQueueTimeouts(CMsgDialog *pDlg) for (auto &it : arQueue.rev_iter()) { if (it->timeout >= timeout) continue; - + it->timeout += 1000; if (it->timeout < timeout || it->pDlg != pDlg || it->hwndErrorDlg != nullptr) continue; @@ -93,7 +95,7 @@ void ReportSendQueueTimeouts(CMsgDialog *pDlg) } } -void ReleaseSendQueueItems(CMsgDialog *pDlg) +void SendQueue::ReleaseItems(CMsgDialog *pDlg) { mir_cslock lock(queueMutex); @@ -109,7 +111,7 @@ void ReleaseSendQueueItems(CMsgDialog *pDlg) } } -int ReattachSendQueueItems(CMsgDialog *pDlg, MCONTACT hContact) +int SendQueue::ReattachItems(CMsgDialog *pDlg, MCONTACT hContact) { int count = 0; @@ -125,14 +127,14 @@ int ReattachSendQueueItems(CMsgDialog *pDlg, MCONTACT hContact) return count; } -void RemoveAllSendQueueItems() +void SendQueue::RemoveAllItems() { mir_cslock lock(queueMutex); arQueue.destroy(); } -void SendSendQueueItem(MessageSendQueueItem* item) +void SendQueue::SendItem(Item *item) { item->timeout = 0; - item->hSendId = ProtoChainSend(item->hContact, PSS_MESSAGE, item->flags, (LPARAM)item->sendBuffer); + item->hSendId = ProtoChainSend(item->hContact, PSS_MESSAGE, item->pDlg->m_hQuoteEvent, (LPARAM)item->sendBuffer); } diff --git a/plugins/Scriver/src/sendqueue.h b/plugins/Scriver/src/sendqueue.h index ea4e7599a4..0fc3658678 100644 --- a/plugins/Scriver/src/sendqueue.h +++ b/plugins/Scriver/src/sendqueue.h @@ -24,35 +24,38 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SRMM_SENDQUEUE_H #define SRMM_SENDQUEUE_H -struct MessageSendQueueItem : public MZeroedObject +namespace SendQueue { - ~MessageSendQueueItem() + struct Item : public MZeroedObject { - mir_free(proto); - mir_free(sendBuffer); - } - - CMsgDialog *pDlg; - MCONTACT hContact; - char *proto; - int hSendId; - int timeout; - char *sendBuffer; - int sendBufferSize; - int codepage; - int flags; - HWND hwndErrorDlg; + ~Item() + { + mir_free(proto); + mir_free(sendBuffer); + } + + CMsgDialog *pDlg; + MCONTACT hContact; + char *proto; + int hSendId; + int timeout; + char *sendBuffer; + int sendBufferSize; + int codepage; + int flags; + HWND hwndErrorDlg; + }; + + Item* CreateItem(CMsgDialog *pDlg); + Item* FindItem(MCONTACT hContact, HANDLE hSendId); + Item* FindOldestPendingItem(CMsgDialog *pDlg, MCONTACT hContact); + + bool RemoveItem(Item *item); + void ReportTimeouts(CMsgDialog *pDlg); + void ReleaseItems(CMsgDialog *pDlg); + int ReattachItems(CMsgDialog *pDlg, MCONTACT hContact); + void RemoveAllItems(); + void SendItem(Item *item); }; -MessageSendQueueItem* CreateSendQueueItem(CMsgDialog *pDlg); -MessageSendQueueItem* FindOldestPendingSendQueueItem(CMsgDialog *pDlg, MCONTACT hContact); -MessageSendQueueItem* FindSendQueueItem(MCONTACT hContact, HANDLE hSendId); - -bool RemoveSendQueueItem(MessageSendQueueItem* item); -void ReportSendQueueTimeouts(CMsgDialog *pDlg); -void ReleaseSendQueueItems(CMsgDialog *pDlg); -int ReattachSendQueueItems(CMsgDialog *pDlg, MCONTACT hContact); -void RemoveAllSendQueueItems(); -void SendSendQueueItem(MessageSendQueueItem* item); - #endif diff --git a/plugins/Scriver/src/tabs.cpp b/plugins/Scriver/src/tabs.cpp index 8af0659443..ae5955063c 100644 --- a/plugins/Scriver/src/tabs.cpp +++ b/plugins/Scriver/src/tabs.cpp @@ -267,7 +267,7 @@ void ParentWindowData::CloseOtherChilden(CMsgDialog *pChildDlg) ActivateChild(pChildDlg); } -void ParentWindowData::MessageSend(const MessageSendQueueItem &msg) +void ParentWindowData::MessageSend(const SendQueue::Item &msg) { for (int i = 0; i < m_iChildrenCount; i++) { CMsgDialog *pDlg = GetChildFromTab(m_hwndTabs, i); diff --git a/plugins/Scriver/src/tabs.h b/plugins/Scriver/src/tabs.h index 41a0de8cb1..9f9d714a29 100644 --- a/plugins/Scriver/src/tabs.h +++ b/plugins/Scriver/src/tabs.h @@ -108,7 +108,7 @@ struct ParentWindowData CMsgDialog *GetChildFromHWND(HWND hwnd); void PopupWindow(CMsgDialog *pDlg, bool bIncoming); void RemoveChild(HWND child); - void MessageSend(const MessageSendQueueItem &msg); + void MessageSend(const SendQueue::Item &msg); void SetContainerWindowStyle(); void StartFlashing(); void ToggleInfoBar(); diff --git a/plugins/TabSRMM/src/generic_msghandlers.cpp b/plugins/TabSRMM/src/generic_msghandlers.cpp index f1182724f8..1fd5be9ee4 100644 --- a/plugins/TabSRMM/src/generic_msghandlers.cpp +++ b/plugins/TabSRMM/src/generic_msghandlers.cpp @@ -1187,7 +1187,7 @@ void CMsgDialog::DM_ErrorDetected(int type, int flag) if (job->iSendId == 0 && job->hContact == 0) break; - job->iSendId = ProtoChainSend(job->hContact, PSS_MESSAGE, job->dwFlags, (LPARAM)job->szSendBuffer); + job->iSendId = ProtoChainSend(job->hContact, PSS_MESSAGE, job->hEvent, (LPARAM)job->szSendBuffer); resent++; } diff --git a/plugins/TabSRMM/src/sendlater.cpp b/plugins/TabSRMM/src/sendlater.cpp index 1e8614d1fd..110ec8ed24 100644 --- a/plugins/TabSRMM/src/sendlater.cpp +++ b/plugins/TabSRMM/src/sendlater.cpp @@ -54,6 +54,7 @@ struct CSendLaterJob : public MZeroedObject char szId[20]; // database key name (time stamp of original send) MCONTACT hContact; // original contact where the message has been assigned MCONTACT hTargetContact; // *real* contact (can be different for metacontacts, e.g). + MEVENT hEvent; HANDLE hProcess; // returned from the protocols sending service. needed to find it in the ACK handler time_t created; // job was created at this time (important to kill jobs, that are too old) time_t lastSent; // time at which the delivery was initiated. used to handle timeouts @@ -125,7 +126,7 @@ struct CSendLaterJob : public MZeroedObject iSendCount++; hTargetContact = cc; bCode = JOB_WAITACK; - hProcess = (HANDLE)ProtoChainSend(cc, PSS_MESSAGE, 0, (LPARAM)sendBuffer); + hProcess = (HANDLE)ProtoChainSend(cc, PSS_MESSAGE, hEvent, (LPARAM)sendBuffer); return 0; } @@ -649,10 +650,10 @@ bool SendLater::processCurrentJob() static int _cdecl addStub(const char *szSetting, void *lParam) { - return(SendLater::addJob(szSetting, lParam)); + return(SendLater::addJob(szSetting, INT_PTR(lParam), 0)); } -static void processSingleContact(const MCONTACT hContact) +static void processSingleContact(MCONTACT hContact) { int iCount = db_get_dw(hContact, "SendLater", "count", 0); if (iCount) @@ -680,9 +681,8 @@ void SendLater::processContacts() // @param lParam: a contact handle for which the job should be scheduled // @return 0 on failure, 1 otherwise -int SendLater::addJob(const char *szSetting, void *lParam) +int SendLater::addJob(const char *szSetting, MCONTACT hContact, MEVENT hEvent) { - MCONTACT hContact = (UINT_PTR)lParam; DBVARIANT dbv = { 0 }; char *szOrig_Utf = nullptr; @@ -716,6 +716,7 @@ int SendLater::addJob(const char *szSetting, void *lParam) strncpy_s(job->szId, szSetting, _TRUNCATE); job->szId[19] = 0; job->hContact = hContact; + job->hEvent = hEvent; job->created = atol(&szSetting[1]); size_t iLen = mir_strlen(szOrig_Utf); diff --git a/plugins/TabSRMM/src/sendlater.h b/plugins/TabSRMM/src/sendlater.h index 5dc2a58df3..7374907bc5 100644 --- a/plugins/TabSRMM/src/sendlater.h +++ b/plugins/TabSRMM/src/sendlater.h @@ -55,7 +55,7 @@ namespace SendLater bool processCurrentJob(); void processContacts(); void startJobListProcess(); - int addJob(const char *szSetting, void *lParam); + int addJob(const char *szSetting, MCONTACT, MEVENT); void addContact(const MCONTACT hContact); HANDLE processAck(const ACKDATA *ack); diff --git a/plugins/TabSRMM/src/sendqueue.cpp b/plugins/TabSRMM/src/sendqueue.cpp index 4f6c35a3cd..6028357c3c 100644 --- a/plugins/TabSRMM/src/sendqueue.cpp +++ b/plugins/TabSRMM/src/sendqueue.cpp @@ -151,7 +151,7 @@ static void DoSplitSendA(LPVOID param) char savedChar = *szSaved; *szSaved = 0; - int id = ProtoChainSend(job->hContact, PSS_MESSAGE, job->dwFlags, (LPARAM)szTemp); + int id = ProtoChainSend(job->hContact, PSS_MESSAGE, job->hEvent, (LPARAM)szTemp); if (!fFirstSend) { job->iSendId = id; fFirstSend = TRUE; @@ -165,7 +165,7 @@ static void DoSplitSendA(LPVOID param) } } else { - int id = ProtoChainSend(job->hContact, PSS_MESSAGE, job->dwFlags, (LPARAM)szTemp); + int id = ProtoChainSend(job->hContact, PSS_MESSAGE, job->hEvent, (LPARAM)szTemp); if (!fFirstSend) { job->iSendId = id; fFirstSend = TRUE; @@ -244,6 +244,7 @@ int SendQueue::sendQueued(CMsgDialog *dat, const int iEntry) goto send_unsplitted; m_jobs[iEntry].hContact = ccActive->getActiveContact(); + m_jobs[iEntry].hEvent = dat->m_hQuoteEvent; m_jobs[iEntry].hOwnerWnd = hwndDlg; m_jobs[iEntry].iStatus = SQ_INPROGRESS; m_jobs[iEntry].iAcksNeeded = 1; @@ -273,7 +274,7 @@ int SendQueue::sendQueued(CMsgDialog *dat, const int iEntry) clearJob(iEntry); return 0; } - m_jobs[iEntry].iSendId = ProtoChainSend(dat->m_hContact, PSS_MESSAGE, m_jobs[iEntry].dwFlags, (LPARAM)m_jobs[iEntry].szSendBuffer); + m_jobs[iEntry].iSendId = ProtoChainSend(dat->m_hContact, PSS_MESSAGE, m_jobs[iEntry].hEvent, (LPARAM)m_jobs[iEntry].szSendBuffer); if (dat->m_sendMode & SMODE_NOACK) { // fake the ack if we are not interested in receiving real acks ACKDATA ack = {}; @@ -590,7 +591,7 @@ int SendQueue::doSendLater(int iJobIndex, CMsgDialog *dat, MCONTACT hContact, bo } else { mir_snprintf(tszMsg, required, "%s%s", utf_header.get(), job->szSendBuffer); - SendLater::addJob(tszMsg, (void*)hContact); + SendLater::addJob(tszMsg, hContact, dat->m_hQuoteEvent); } mir_free(tszMsg); diff --git a/plugins/TabSRMM/src/sendqueue.h b/plugins/TabSRMM/src/sendqueue.h index b4dd4c5d11..ceba6c9f70 100644 --- a/plugins/TabSRMM/src/sendqueue.h +++ b/plugins/TabSRMM/src/sendqueue.h @@ -45,6 +45,7 @@ struct SendJob size_t iSendLength; // length of message in utf-8 octets (used to check maxlen) int sendCount; MCONTACT hContact; + MEVENT hEvent; HWND hOwnerWnd; unsigned iStatus; wchar_t* pwszErrorMsg; -- cgit v1.2.3