⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 working.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	$Id: Working.cpp,v 1.1 2002/11/19 02:19:38 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"
#include "cpgpextmodeless.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);
				}

				//let outlook know that we are going to be showing modal window
				//we actually do not show modal window - so we cheat :)
				//pThreadArgs->peemc->EnableModeless(GetParent(hDlg), FALSE);

			}
			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,
						  LPEXCHEXTMODELESSCALLBACK peemc,
						  CPGPExtModeless *ppemOurMdClbk)
{
	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);
		if(NULL != ppemOurMdClbk)
			ppemOurMdClbk->AddWindow(pThreadArgs->hWorkingDlg);
	}

	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 + -