365 lines
10 KiB
C++
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;
|
|
}
|
|
}
|
|
|
|
/** @} */
|