From 425b12911e11a8902d2f1963c2ac9c17a8904b30 Mon Sep 17 00:00:00 2001
From: George Hazan <ghazan@miranda.im>
Date: Fri, 25 Aug 2017 18:48:18 +0300
Subject: Scriver: killing that old shit with error dialog

---
 plugins/Scriver/src/globals.cpp     |  9 +---
 plugins/Scriver/src/msgdialog.cpp   |  4 +-
 plugins/Scriver/src/msgs.h          | 29 +++++++----
 plugins/Scriver/src/msgtimedout.cpp | 98 ++++++++++++++++---------------------
 plugins/Scriver/src/sendqueue.cpp   | 14 +-----
 plugins/Scriver/src/version.h       |  2 +-
 6 files changed, 68 insertions(+), 88 deletions(-)

(limited to 'plugins/Scriver/src')

diff --git a/plugins/Scriver/src/globals.cpp b/plugins/Scriver/src/globals.cpp
index 670aabd547..7a174bf528 100644
--- a/plugins/Scriver/src/globals.cpp
+++ b/plugins/Scriver/src/globals.cpp
@@ -128,13 +128,8 @@ static int ackevent(WPARAM, LPARAM lParam)
 			if (hwndSender != nullptr) {
 				SendMessage(hwndSender, DM_STOPMESSAGESENDING, 0, 0);
 
-				ErrorWindowData *ewd = (ErrorWindowData*)mir_alloc(sizeof(ErrorWindowData));
-				ewd->szName = mir_wstrdup(pcli->pfnGetContactDisplayName(item->hContact, 0));
-				ewd->szDescription = mir_a2u((char *)pAck->lParam);
-				ewd->szText = GetSendBufferMsg(item);
-				ewd->hwndParent = hwndSender;
-				ewd->queueItem = item;
-				SendMessage(hwndSender, DM_SHOWERRORMESSAGE, 0, (LPARAM)ewd);
+				CErrorDlg *pDlg = new CErrorDlg(_A2T((char *)pAck->lParam), hwndSender, item);
+				SendMessage(hwndSender, DM_SHOWERRORMESSAGE, 0, (LPARAM)pDlg);
 			}
 			else RemoveSendQueueItem(item);
 		}
diff --git a/plugins/Scriver/src/msgdialog.cpp b/plugins/Scriver/src/msgdialog.cpp
index 838642e9b3..b47ae074f9 100644
--- a/plugins/Scriver/src/msgdialog.cpp
+++ b/plugins/Scriver/src/msgdialog.cpp
@@ -1542,9 +1542,9 @@ INT_PTR CSrmmWindow::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 
 	case DM_SHOWERRORMESSAGE:
 		if (lParam) {
-			ErrorWindowData *ewd = (ErrorWindowData *)lParam;
 			SendMessage(m_hwnd, DM_STOPMESSAGESENDING, 0, 0);
-			ewd->queueItem->hwndErrorDlg = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_MSGSENDERROR), m_hwnd, ErrorDlgProc, (LPARAM)ewd);//m_hwnd
+			CErrorDlg *pDlg = (CErrorDlg*)lParam;
+			pDlg->Create();
 		}
 		break;
 
diff --git a/plugins/Scriver/src/msgs.h b/plugins/Scriver/src/msgs.h
index 86de8bf663..bb209cb686 100644
--- a/plugins/Scriver/src/msgs.h
+++ b/plugins/Scriver/src/msgs.h
@@ -36,15 +36,6 @@ struct ToolbarButton
 	int width;
 };
 
-struct ErrorWindowData
-{
-	wchar_t *szName;
-	wchar_t *szDescription;
-	wchar_t *szText;
-	MessageSendQueueItem *queueItem;
-	HWND hwndParent;
-};
-
 struct TabCtrlData
 {
 	int lastClickTime;
@@ -276,7 +267,25 @@ public:
 #define EVENTTYPE_JABBER_CHATSTATES	2000
 #define EVENTTYPE_JABBER_PRESENCE	2001
 
-INT_PTR CALLBACK ErrorDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+class CErrorDlg : public CDlgBase
+{
+	ptrW m_wszText;
+	CMStringW m_wszName, m_wszDescr;
+	MessageSendQueueItem *m_queueItem;
+	HWND m_hwndParent;
+
+	CCtrlButton m_btnOk, m_btnCancel;
+
+protected:
+	virtual void OnInitDialog() override;
+
+public:
+	CErrorDlg(const wchar_t *pwszDescr, HWND, MessageSendQueueItem*);
+
+	void onOk(CCtrlButton*);
+	void onCancel(CCtrlButton*);
+};
+
 int DbEventIsShown(DBEVENTINFO &dbei);
 int DbEventIsCustomForMsgWindow(DBEVENTINFO *dbei);
 int DbEventIsMessageOrCustom(DBEVENTINFO *dbei);
diff --git a/plugins/Scriver/src/msgtimedout.cpp b/plugins/Scriver/src/msgtimedout.cpp
index 19dbca5900..e9fb7d7435 100644
--- a/plugins/Scriver/src/msgtimedout.cpp
+++ b/plugins/Scriver/src/msgtimedout.cpp
@@ -23,64 +23,50 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "stdafx.h"
 
-INT_PTR CALLBACK ErrorDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+CErrorDlg::CErrorDlg(const wchar_t *pwszDescr, HWND hWnd, MessageSendQueueItem *pItem)
+	: CDlgBase(g_hInst, IDD_MSGSENDERROR),
+	m_wszText(mir_utf8decodeW(pItem->sendBuffer)),
+	m_wszDescr(pwszDescr != nullptr ? pwszDescr : TranslateT("An unknown error has occurred.")),
+	m_hwndParent(hWnd),
+	m_queueItem(pItem),
+
+	m_btnOk(this, IDOK),
+	m_btnCancel(this, IDCANCEL)
+{
+	const wchar_t *pwszName = pcli->pfnGetContactDisplayName(pItem->hContact, 0);
+	if (pwszName)
+		m_wszName.Format(L"%s - %s", TranslateT("Send error"), pwszName);
+	else
+		m_wszName = TranslateT("Send error");
+
+	m_btnOk.OnClick = Callback(this, &CErrorDlg::onOk);
+	m_btnCancel.OnClick = Callback(this, &CErrorDlg::onCancel);
+}
+
+void CErrorDlg::OnInitDialog()
 {
-	ErrorWindowData *ewd = (ErrorWindowData *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
-	//if (ewd==nullptr && msg!=WM_INITDIALOG) return FALSE;
-	switch (msg) {
-		case WM_INITDIALOG:
-		{
-			RECT rc, rcParent;
-			wchar_t szText[2048];
-			ewd = (ErrorWindowData *) lParam;
-			SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) ewd);
-			TranslateDialogDefault(hwndDlg);
-			if (ewd != nullptr) {
-				ShowWindow(GetParent(ewd->hwndParent), SW_RESTORE);
-				if (ewd->szDescription)
-					SetDlgItemText(hwndDlg, IDC_ERRORTEXT, ewd->szDescription);
-				else
-					SetDlgItemText(hwndDlg, IDC_ERRORTEXT, TranslateT("An unknown error has occurred."));
+	ShowWindow(GetParent(m_hwndParent), SW_RESTORE);
+	
+	SetDlgItemText(m_hwnd, IDC_ERRORTEXT, m_wszDescr);
+	SetWindowText(m_hwnd, m_wszName);
 
-				if (ewd->szText) {
-					SETTEXTEX  st = {0};
-					st.flags = ST_DEFAULT;
-					st.codepage = 1200;
-					
-					SendDlgItemMessage(hwndDlg, IDC_MSGTEXT, EM_SETTEXTEX, (WPARAM)&st, (LPARAM)ewd->szText);
-				}
-				if (ewd->szName)
-					mir_snwprintf(szText, L"%s - %s", TranslateT("Send error"), ewd->szName);
-				else
-					wcsncpy_s(szText, TranslateT("Send error"), _TRUNCATE);
+	SETTEXTEX st = { 0 };
+	st.flags = ST_DEFAULT;
+	st.codepage = 1200;
+	SendDlgItemMessage(m_hwnd, IDC_MSGTEXT, EM_SETTEXTEX, (WPARAM)&st, (LPARAM)m_wszText.get());
 
-				SetWindowText(hwndDlg, szText);
-				GetWindowRect(hwndDlg, &rc);
-				GetWindowRect(GetParent(ewd->hwndParent), &rcParent);
-				SetWindowPos(hwndDlg, HWND_TOP, rcParent.left + (rcParent.right - rcParent.left - rc.right + rc.left) / 2, rcParent.top + (rcParent.bottom - rcParent.top - rc.bottom + rc.top) / 2, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
-			}
-		}
-		return TRUE;
-		case WM_COMMAND:
-			switch (LOWORD(wParam)) {
-				case IDOK:
-					SendMessage(ewd->hwndParent, DM_ERRORDECIDED, MSGERROR_RETRY, (LPARAM)ewd->queueItem);
-					DestroyWindow(hwndDlg);
-					break;
-				case IDCANCEL:
-					SendMessage(ewd->hwndParent, DM_ERRORDECIDED, MSGERROR_CANCEL, (LPARAM)ewd->queueItem);
-					DestroyWindow(hwndDlg);
-					break;
-			}
-			break;
-		case WM_DESTROY:
-			SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);
-			mir_free(ewd->szName);
-			mir_free(ewd->szDescription);
-			mir_free(ewd->szText);
-			mir_free(ewd);
-			break;
+	RECT rc, rcParent;
+	GetWindowRect(m_hwnd, &rc);
+	GetWindowRect(GetParent(m_hwndParent), &rcParent);
+	SetWindowPos(m_hwnd, HWND_TOP, rcParent.left + (rcParent.right - rcParent.left - rc.right + rc.left) / 2, rcParent.top + (rcParent.bottom - rcParent.top - rc.bottom + rc.top) / 2, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
+}
 
-	}
-	return FALSE;
+void CErrorDlg::onOk(CCtrlButton*)
+{
+	SendMessage(m_hwndParent, DM_ERRORDECIDED, MSGERROR_RETRY, (LPARAM)m_queueItem);
+}
+
+void CErrorDlg::onCancel(CCtrlButton*)
+{
+	SendMessage(m_hwndParent, DM_ERRORDECIDED, MSGERROR_CANCEL, (LPARAM)m_queueItem);
 }
diff --git a/plugins/Scriver/src/sendqueue.cpp b/plugins/Scriver/src/sendqueue.cpp
index 576f7a9131..b4bbd3055f 100644
--- a/plugins/Scriver/src/sendqueue.cpp
+++ b/plugins/Scriver/src/sendqueue.cpp
@@ -26,11 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 static MessageSendQueueItem *global_sendQueue = nullptr;
 static mir_cs queueMutex;
 
-wchar_t* GetSendBufferMsg(MessageSendQueueItem *item)
-{
-	return mir_utf8decodeW(item->sendBuffer);
-}
-
 MessageSendQueueItem* CreateSendQueueItem(HWND hwndSender)
 {
 	MessageSendQueueItem *item = (MessageSendQueueItem*)mir_calloc(sizeof(MessageSendQueueItem));
@@ -103,13 +98,8 @@ void ReportSendQueueTimeouts(HWND hwndSender)
 			if (item->timeout >= timeout) {
 				if (item->hwndSender == hwndSender && item->hwndErrorDlg == nullptr) {
 					if (hwndSender != nullptr) {
-						ErrorWindowData *ewd = (ErrorWindowData *)mir_alloc(sizeof(ErrorWindowData));
-						ewd->szName = mir_wstrdup(pcli->pfnGetContactDisplayName(item->hContact, 0));
-						ewd->szDescription = mir_wstrdup(TranslateT("The message send timed out."));
-						ewd->szText = GetSendBufferMsg(item);
-						ewd->hwndParent = hwndSender;
-						ewd->queueItem = item;
-						PostMessage(hwndSender, DM_SHOWERRORMESSAGE, 0, (LPARAM)ewd);
+						CErrorDlg *pDlg = new CErrorDlg(TranslateT("The message send timed out."), hwndSender, item);
+						PostMessage(hwndSender, DM_SHOWERRORMESSAGE, 0, (LPARAM)pDlg);
 					}
 					else {
 						/* TODO: Handle errors outside messaging window in a better way */
diff --git a/plugins/Scriver/src/version.h b/plugins/Scriver/src/version.h
index 0e20a58284..b695210147 100644
--- a/plugins/Scriver/src/version.h
+++ b/plugins/Scriver/src/version.h
@@ -1,7 +1,7 @@
 #define __MAJOR_VERSION          3
 #define __MINOR_VERSION          0
 #define __RELEASE_NUM            1
-#define __BUILD_NUM              6
+#define __BUILD_NUM              7
 
 #include <stdver.h>
 
-- 
cgit v1.2.3