?? working.c
字號:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: Working.c,v 1.4 2002/10/30 01:45:13 sdas Exp $
____________________________________________________________________________*/
// System Headers
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
// PGPsdk Headers
#include "pgpErrors.h"
// Project Headers
#include "Working.h"
#include "WorkingResource.h"
#include "pgpDebug.h"
typedef struct _wdplt
{
HWND hWorkingDlg;
HINSTANCE hMod;
HINSTANCE hInst;
HWND hParent;
HANDLE hSemaphore;
char *Action;
char *FileName;
BOOL CancelPending;
float LastUpdate;
}WDPLT;
#define PGPM_PROGRESS_UPDATE WM_USER + 100
static WDPLT *g_pThreadArgs = NULL;
BOOL CALLBACK WorkingDlgProc (HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
BOOL ReturnCode = FALSE;
WDPLT *pThreadArgs;
switch (uMsg)
{
case WM_INITDIALOG:
{
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETRANGE, 0,
MAKELPARAM(0, 100));
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS, 0, 0);
if(lParam)
{
char Title[256];
SetWindowLong(hDlg, GWL_USERDATA, lParam);
pThreadArgs = (WDPLT *) lParam;
pThreadArgs->CancelPending = FALSE;
if(pThreadArgs->Action)
{
pThreadArgs->LastUpdate = (float) 0.0;
if(pThreadArgs->FileName)
wsprintf(Title,
"%s %s",
pThreadArgs->Action,
pThreadArgs->FileName);
else
strcpy(Title, pThreadArgs->Action);
SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM) Title);
}
}
SetFocus(hDlg);
SetActiveWindow(hDlg);
break;
}
case PGPM_PROGRESS_UPDATE:
{
char szTransfer[256];
int PercentComplete = 0;
float ftot, fsofar;
if((pThreadArgs = (WDPLT *) GetWindowLong(hDlg, GWL_USERDATA)))
{
if(!pThreadArgs->CancelPending)
{
if ((wParam != (WPARAM) lParam) &&
(wParam > 0) &&
(lParam > 0))
{
fsofar = (float) wParam;
ftot = (float) lParam;
PercentComplete = (int) ((fsofar / ftot) * 100.0);
fsofar /= 1024;
ftot /= 1024;
if(!pThreadArgs->LastUpdate ||
pThreadArgs->LastUpdate + 10 < fsofar)
{
pThreadArgs->LastUpdate = fsofar;
}
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
PercentComplete, 0);
}
else if ((wParam == -1) && (lParam == -1))
{
//if we are being told to be done
SetTimer(hDlg, 1, 250, NULL);//set up a timer
}
else if (wParam == (WPARAM) lParam)
{
LoadString(pThreadArgs->hInst, IDS_WORKINGTRANSFER,
szTransfer, sizeof(szTransfer));
SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
100, 0);
if(pThreadArgs && pThreadArgs->FileName)
SetDlgItemText(hDlg, IDC_PROGRESS_TEXT,
szTransfer);
}
}
else
{
EndDialog(hDlg, 0);
DestroyWindow(hDlg);
}
ReturnCode = TRUE;
}
break;
}
case WM_TIMER:
case WM_CLOSE:
case WM_DESTROY:
{
BOOL bRet = FALSE;
bRet = KillTimer(hDlg, 1);//kill the timer we set before
//NOTE: this does not clear any pending timer messages
//this if prevents us from potentially cleaning more than once
if((TRUE == bRet) && (pThreadArgs = (WDPLT *) GetWindowLong(hDlg, GWL_USERDATA)))
{
g_pThreadArgs = NULL;
SetWindowLong(hDlg, GWL_USERDATA, 0);//lose thread args data structure
if(pThreadArgs->Action)
{
free(pThreadArgs->Action);
pThreadArgs->Action = NULL;
}
if(pThreadArgs->FileName)
{
free(pThreadArgs->FileName);
pThreadArgs->FileName = NULL;
}
CloseHandle(pThreadArgs->hSemaphore);
pThreadArgs->hSemaphore = NULL;
free(pThreadArgs);
pThreadArgs = NULL;
//destroy this modeless dialog window
EndDialog(hDlg, 0);
DestroyWindow(hDlg);
ReturnCode = TRUE;//let the the dialogproc know that we have handled this already
}
//for messages other than WM_TIMER - namely WM_CLOSE and WM_DESTROY
//we let the default dialog proc handle it's stuff
break;
}
case WM_COMMAND:
{
switch(LOWORD (wParam))
{
case IDCANCEL:
{
if((pThreadArgs = (WDPLT *) GetWindowLong(hDlg,
GWL_USERDATA)))
pThreadArgs->CancelPending = TRUE;
else
{
EndDialog (hDlg, 0);
DestroyWindow(hDlg);
}
ReturnCode = TRUE;
break;
}
}
ReturnCode = TRUE;
break;
}
}
return (ReturnCode);
}
//----------------------------------------------------|
// Callback routine to be called by Encryption/Decryption/Signing
int WorkingCallback (void* arg, INT SoFar, INT Total)
{
int CancelHit = FALSE;
int ReturnCode = 0;
WDPLT *pThreadArgs;
if(arg)
{
SendMessage((HWND) arg, PGPM_PROGRESS_UPDATE, SoFar, Total);
if((pThreadArgs = (WDPLT *) GetWindowLong((HWND) arg, GWL_USERDATA)))
CancelHit = pThreadArgs->CancelPending;
}
if(CancelHit)
{
ReturnCode = kPGPError_UserAbort;
}
return(ReturnCode);
}
HWND WorkingDlgProcThread(HMODULE hMod,
HINSTANCE hInst,
HWND hParent,
char *Action,
char *FileName)
{
WDPLT *pThreadArgs;
pThreadArgs = (WDPLT *) calloc(sizeof(WDPLT), 1);
pThreadArgs->hWorkingDlg = NULL;
if((pThreadArgs->hSemaphore = CreateSemaphore(NULL, 0, 1, NULL)))
{
pThreadArgs->hMod = hMod;
pThreadArgs->hInst = hInst;
pThreadArgs->hParent = hParent;
if(Action)
{
if((pThreadArgs->Action = (char *) malloc(sizeof(char) *
(strlen(Action) + 1))))
strcpy(pThreadArgs->Action, Action);
}
else
pThreadArgs->Action = NULL;
if(FileName)
{
if((pThreadArgs->FileName = (char *) malloc(sizeof(char) *
(strlen(FileName) + 1))))
strcpy(pThreadArgs->FileName, FileName);
}
else
{
pThreadArgs->FileName = NULL;
}
}
if (g_pThreadArgs)
{
HWND hWorkingDlg = g_pThreadArgs->hWorkingDlg;
pThreadArgs->hWorkingDlg = hWorkingDlg;
SetWindowLong(hWorkingDlg, GWL_USERDATA, (LONG) pThreadArgs);
KillTimer(hWorkingDlg, 1);
SendDlgItemMessage(hWorkingDlg, IDC_PROGRESS, PBM_SETPOS, 100, 0);
if(pThreadArgs->Action)
{
char Title[256];
pThreadArgs->LastUpdate = (float) 0.0;
if(pThreadArgs->FileName)
wsprintf(Title,
"%s %s",
pThreadArgs->Action,
pThreadArgs->FileName);
else
strcpy(Title, pThreadArgs->Action);
SendMessage(hWorkingDlg, WM_SETTEXT, 0, (LPARAM) Title);
}
if(g_pThreadArgs->Action)
free(g_pThreadArgs->Action);
if(g_pThreadArgs->FileName)
free(g_pThreadArgs->FileName);
CloseHandle(g_pThreadArgs->hSemaphore);
free(g_pThreadArgs);
}
else
pThreadArgs->hWorkingDlg = CreateDialogParam(pThreadArgs->hMod,
MAKEINTRESOURCE(IDD_WORKING),
pThreadArgs->hParent,
(DLGPROC) WorkingDlgProc,
(LPARAM) pThreadArgs);
g_pThreadArgs = pThreadArgs;
return(pThreadArgs->hWorkingDlg);
}
/*__Editor_settings____
Local Variables:
tab-width: 4
End:
vi: ts=4 sw=4
vim: si
_____________________*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -