server-re/third-party/BugTrap-1.3-57bd515/source/TransferProgressDlg.cpp
2026-10-14 15:54:34 -04:00

365 lines
10 KiB
C++

/*
* This is a part of the BugTrap package.
* Copyright (c) 2005-2009 IntelleSoft.
* All rights reserved.
*
* Description: Transfer Progress dialog.
* Author: Maksim Pyatkovskiy.
*
* This source code is only intended as a supplement to the
* BugTrap package reference and related electronic documentation
* provided with the product. See these sources for detailed
* information regarding the BugTrap package.
*/
#include "StdAfx.h"
#include "resource.h"
#include "TransferProgressDlg.h"
#include "BugTrapUtils.h"
#include "BugTrapUI.h"
#include "StrStream.h"
#include "Globals.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/**
* @addtogroup BugTrapUI BugTrap Graphical User Interface
* @{
*/
#define IDC_DIALOG_PANE 100
/// Transfer thread handle.
static HANDLE g_hTransferThread = NULL;
/// Transfer thread parameters.
static CTransferThreadParams* g_pTransferThreadParams = NULL;
/**
* @brief WM_INITDIALOG handler of Transfer Status pane.
* @param hwnd - window handle.
* @param hwndFocus - system-defined focus window.
* @return true to setup focus to system-defined control.
*/
static BOOL TransferStatusPane_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM /*lParam*/)
{
hwndFocus;
CStrStream Stream(1024);
TCHAR szMessageText[128];
HICON hIcon;
DWORD dwErrorCode = g_pTransferThreadParams->GetErrorCode();
if (dwErrorCode == ERROR_SUCCESS)
{
hIcon = LoadIcon(NULL, IDI_INFORMATION);
LoadString(g_hInstance, IDS_STATUS_REPORTSENT, szMessageText, countof(szMessageText));
Stream << szMessageText;
}
else
{
hIcon = LoadIcon(NULL, IDI_ERROR);
LoadString(g_hInstance, IDS_ERROR_TRANSFERFAILED, szMessageText, countof(szMessageText));
Stream << szMessageText << _T('\n');
PCTSTR pszErrorMessage = g_pTransferThreadParams->GetErrorMessage();
if (pszErrorMessage == NULL)
{
TCHAR szErrorMessageTemplate[256];
LoadString(g_hInstance, IDS_UNDEFINED_ERROR_EX, szErrorMessageTemplate, countof(szErrorMessageTemplate));
TCHAR szErrorMessage[256];
_stprintf_s(szErrorMessage, countof(szErrorMessage), szErrorMessageTemplate, dwErrorCode);
pszErrorMessage = szErrorMessage;
}
Stream << pszErrorMessage;
}
HWND hwndCtl = GetDlgItem(hwnd, IDC_STATUSMESSAGE);
SetWindowText(hwndCtl, Stream);
ShowWindow(hwndCtl, SW_SHOW);
hwndCtl = GetDlgItem(hwnd, IDC_STATUSICON);
Static_SetIcon(hwndCtl, hIcon);
ShowWindow(hwndCtl, SW_SHOW);
return TRUE;
}
/**
* @brief WM_COMMAND handler of Transfer Status pane.
* @param hwnd - window handle.
* @param id - control ID.
* @param hwndCtl - control handle.
* @param codeNotify - notification code.
*/
static void TransferStatusPane_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
codeNotify; hwndCtl;
switch (id)
{
case IDCANCEL:
HWND hwndParent = GetParent(hwnd);
int nResult = g_pTransferThreadParams->GetErrorCode() == ERROR_SUCCESS;
EndDialog(hwndParent, nResult);
break;
}
}
/**
* @brief Dialog procedure of Transfer Status pane.
* @param hwndDlg - window handle.
* @param uMsg - message identifier.
* @param wParam - 1st message parameter.
* @param lParam - 2nd message parameter.
* @return message result.
*/
static INT_PTR CALLBACK TransferStatusPaneProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hwndDlg, WM_INITDIALOG, TransferStatusPane_OnInitDialog);
HANDLE_MSG(hwndDlg, WM_COMMAND, TransferStatusPane_OnCommand);
default:
return FALSE;
}
}
/**
* @brief Start progress animation.
* @param hwnd - window handle.
*/
static void StartProgressAnimation(HWND hwnd)
{
HWND hwndCtl = GetDlgItem(hwnd, IDC_UPLOAD_ANIMATION);
Animate_Open(hwndCtl, MAKEINTRESOURCE(IDR_UPLOAD_ANIMATION));
Animate_Play(hwndCtl, 0, -1, -1);
}
/**
* @brief Stop progress animation.
* @param hwnd - window handle.
*/
static void StopProgressAnimation(HWND hwnd)
{
HWND hwndCtl = GetDlgItem(hwnd, IDC_UPLOAD_ANIMATION);
Animate_Stop(hwndCtl);
Animate_Close(hwndCtl);
}
/**
* @brief WM_INITDIALOG handler of Transfer Progress pane.
* @param hwnd - window handle.
* @param hwndFocus - system-defined focus window.
* @param lParam - user-defined parameter.
* @return true to setup focus to system-defined control.
*/
static BOOL TransferProgressPane_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
lParam; hwndFocus;
HWND hwndCtl;
StartProgressAnimation(hwnd);
hwndCtl = GetDlgItem(hwnd, IDC_CONNECTINGTOSERVER_CMARK);
SendMessage(hwndCtl, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_pResManager->m_hCheckMark);
hwndCtl = GetDlgItem(hwnd, IDC_SENDINGREPORT_CMARK);
SendMessage(hwndCtl, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_pResManager->m_hCheckMark);
hwndCtl = GetDlgItem(hwnd, IDC_CHECKINGERRORSTATUS_CMARK);
SendMessage(hwndCtl, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_pResManager->m_hCheckMark);
return TRUE;
}
/**
* @brief WM_DESTROY handler of Transfer Progress pane.
* @param hwnd - window handle.
*/
static inline void TransferProgressPane_OnDestroy(HWND hwnd)
{
StopProgressAnimation(hwnd);
}
/**
* @brief WM_COMMAND handler of Transfer Progress pane.
* @param hwnd - window handle.
* @param id - control ID.
* @param hwndCtl - control handle.
* @param codeNotify - notification code.
*/
static void TransferProgressPane_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
hwnd; hwndCtl; codeNotify;
switch (id)
{
case IDCANCEL:
_ASSERTE(g_hTransferThread != NULL && g_pTransferThreadParams != NULL);
HANDLE hCancellationEvent = g_pTransferThreadParams->GetCancellationEvent();
SetEvent(hCancellationEvent);
break;
}
}
/**
* @brief Dialog procedure of Transfer Progress pane.
* @param hwndDlg - window handle.
* @param uMsg - message identifier.
* @param wParam - 1st message parameter.
* @param lParam - 2nd message parameter.
* @return message result.
*/
static INT_PTR CALLBACK TransferProgressPaneProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndCtl;
switch (uMsg)
{
HANDLE_MSG(hwndDlg, WM_INITDIALOG, TransferProgressPane_OnInitDialog);
HANDLE_MSG(hwndDlg, WM_COMMAND, TransferProgressPane_OnCommand);
HANDLE_MSG(hwndDlg, WM_DESTROY, TransferProgressPane_OnDestroy);
case UM_CONNECTINGTOSERVER:
hwndCtl = GetDlgItem(hwndDlg, IDC_CONNECTINGTOSERVER_CMARK);
ShowWindow(hwndCtl, SW_SHOW);
return TRUE;
case UM_SENDINGREPORT:
hwndCtl = GetDlgItem(hwndDlg, IDC_SENDINGREPORT_CMARK);
ShowWindow(hwndCtl, SW_SHOW);
return TRUE;
case UM_CHECKINGERRORSTATUS:
hwndCtl = GetDlgItem(hwndDlg, IDC_CHECKINGERRORSTATUS_CMARK);
ShowWindow(hwndCtl, SW_SHOW);
return TRUE;
default:
return FALSE;
}
}
/**
* Create child dialog pane.
* @param hwndParent - parent window handle.
* @param uDialogID - dialog ID.
* @param pfnDlgProc - dialog procedure.
* @param lParam - additional dialog parameter.
*/
static HWND CreateDialogPane(HWND hwndParent, UINT uDialogID, DLGPROC pfnDlgProc, LPARAM lParam = 0)
{
HWND hwndPane = CreateDialogParam(g_hInstance, MAKEINTRESOURCE(uDialogID), hwndParent, pfnDlgProc, lParam);
if (hwndPane)
{
SetWindowLong(hwndPane, GWL_ID, IDC_DIALOG_PANE);
DWORD dwStyleEx = GetWindowLong(hwndPane, GWL_EXSTYLE);
SetWindowLong(hwndPane, GWL_EXSTYLE, dwStyleEx | WS_EX_STATICEDGE);
RECT rcClient;
GetClientRect(hwndParent, &rcClient);
RECT rcPane;
GetWindowRect(hwndPane, &rcPane);
ScreenToClient(hwndParent, (PPOINT)&rcPane);
ScreenToClient(hwndParent, (PPOINT)&rcPane + 1);
int x = (rcClient.right - (rcPane.right - rcPane.left)) / 2;
int y = (rcClient.bottom - (rcPane.bottom - rcPane.top)) / 2;
SetWindowPos(hwndPane, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_FRAMECHANGED);
}
return hwndPane;
}
/**
* @brief WM_INITDIALOG handler of Transfer Progress dialog.
* @param hwnd - window handle.
* @param hwndFocus - system-defined focus window.
* @param lParam - user-defined parameter.
* @return true to setup focus to system-defined control.
*/
static BOOL TransferProgressDlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
lParam; hwndFocus;
CenterWindow(hwnd, GetParent(hwnd));
HWND hwndPane = CreateDialogPane(hwnd, IDD_TRANSFERPROGRESS_PANE, TransferProgressPaneProc);
if (hwndPane == NULL)
goto error;
_ASSERTE(g_pTransferThreadParams == NULL);
g_pTransferThreadParams = new CTransferThreadParams;
if (g_pTransferThreadParams == NULL)
goto error;
g_pTransferThreadParams->SetSinkWnd(hwnd);
_ASSERTE(g_hTransferThread == NULL);
g_hTransferThread = StartTransferThread(g_pTransferThreadParams);
if (g_hTransferThread == NULL)
goto error;
return TRUE;
error:
EndDialog(hwnd, FALSE);
return TRUE;
}
/**
* @brief WM_DESTROY handler of Transfer Progress dialog.
* @param hwnd - window handle.
*/
static void TransferProgressDlg_OnDestroy(HWND hwnd)
{
hwnd;
_ASSERTE(g_hTransferThread != NULL && g_pTransferThreadParams != NULL);
CloseTransferThread(g_hTransferThread);
g_hTransferThread = NULL;
delete g_pTransferThreadParams;
g_pTransferThreadParams = NULL;
}
/**
* @brief Dialog procedure of Transfer Progress dialog.
* @param hwndDlg - window handle.
* @param uMsg - message identifier.
* @param wParam - 1st message parameter.
* @param lParam - 2nd message parameter.
* @return message result.
*/
INT_PTR CALLBACK TransferProgressDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndPane;
switch (uMsg)
{
HANDLE_MSG(hwndDlg, WM_INITDIALOG, TransferProgressDlg_OnInitDialog);
HANDLE_MSG(hwndDlg, WM_DESTROY, TransferProgressDlg_OnDestroy);
case WM_COMMAND:
case UM_CONNECTINGTOSERVER:
case UM_SENDINGREPORT:
case UM_CHECKINGERRORSTATUS:
hwndPane = GetDlgItem(hwndDlg, IDC_DIALOG_PANE);
if (hwndPane)
SendMessage(hwndPane, uMsg, wParam, lParam);
return TRUE;
case UM_TRANSFERCOMPLETE:
hwndPane = GetDlgItem(hwndDlg, IDC_DIALOG_PANE);
if (hwndPane)
{
// on Windows 98 this causes an access violation in user32.dll
// why does it crash? - because this is Windows 98
//DestroyWindow(hwndPane);
// rather than destroying the window, let's hide it
ShowWindow(hwndPane, SW_HIDE);
// stop progress animation
StopProgressAnimation(hwndPane);
// and of course panel ID should be changed to avoid conflicts
SetWindowLong(hwndPane, GWL_ID, -1);
// finally we can create a new panel
hwndPane = CreateDialogPane(hwndDlg, IDD_TRANSFERSTATUS_PANE, TransferStatusPaneProc, wParam);
if (hwndPane)
{
SetFocus(hwndPane);
SendMessage(hwndPane, DM_SETDEFID, IDCANCEL, 0);
}
else
EndDialog(hwndDlg, FALSE);
}
return TRUE;
default:
return FALSE;
}
}
/** @} */