icqinfo.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 338 行

C
338
字号
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: ICQinfo.c,v 1.18 2002/11/13 20:00:25 wjb Exp $
__________________________________________________________________________*/
#include "precomp.h"

UINT	g_uReloadKeyringMessage			= 0;
UINT	g_uAddedKeysMessage				= 0;
UINT	g_uOLEMessage					= 0;
UINT	g_uStreamMessage				= 0;
USERSTATE *g_userstate					= NULL;
//HANDLE hReceiveMutex					= NULL;

PPLUGININFO GetPluginInfo(HWND hwnd)
{
	return (PPLUGININFO) GetProp(hwnd, PLUGIN_INFO_PROP);
}

void SavePluginInfo(HWND hwnd, PPLUGININFO plugin)
{
	if (plugin->hwndCurrent != NULL)
		RemoveProp(plugin->hwndCurrent, PLUGIN_INFO_PROP);

	SetProp(hwnd, PLUGIN_INFO_PROP, (HANDLE) plugin);
	plugin->hwndCurrent = hwnd;
	return;
}

static DWORD WINAPI 
sUpdateThread (
		LPVOID		lpVoid)
{
	PGPError err;

	// We need to ensure we are not using the global keydb
	// or key iter at the same time in any one function
	WaitForSingleObject(hGlobalMutex,INFINITE);

	PGPFreeKeyIter(g_KeyIter);
	PGPFreeKeyDB(g_KeyDB);

	g_KeyIter=NULL;
	g_KeyDB=NULL;

	err=PGPclOpenDefaultKeyrings(PGPsc,
		kPGPOpenKeyDBFileOptions_None,&g_KeyDB);

	if(IsPGPError(err))
	{
		MessageBox(NULL,"Can't load keydb","PGPicq",
			MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
	}
	else
	{
		err=PGPNewKeyIterFromKeyDB (g_KeyDB, &g_KeyIter);

		if(IsPGPError(err))
		{
			MessageBox(NULL,"Can't create key iter","PGPicq",
				MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
		}
	}

	// Release Global Mutext on keydb and keyiter
	// so other windows can use it. This prevents
	// deadlock in the most obvious case.
	ReleaseMutex(hGlobalMutex);

	return 0;
}

static void
UpdateProc (
		PGPUserValue			userval,
		PGPNotificationReason	reason,
		PGPUInt32				uParam1,
		PGPUInt32				uParam2)
{
	if (reason == kPGPNotification_KeyDBChanged)
	{
		DWORD dwThreadID;

		CreateThread (NULL, 0, sUpdateThread, (void *)NULL, 0, &dwThreadID);
	}
}

LRESULT CALLBACK ICQProc(HWND hwnd, UINT msg, 
							   WPARAM wParam, LPARAM lParam)
{
	// See if user deselects caching via prefs
	PGPscCheckForPurge(msg,wParam);

	if (msg == g_uReloadKeyringMessage) 
	{
		UpdateProc(NULL, kPGPNotification_KeyDBChanged, 0, 0);
	}

	if (msg == g_uAddedKeysMessage) 
	{
		UpdateProc(NULL, kPGPNotification_KeyDBChanged, 0, 0);
	}

	switch(msg)
	{
		case WM_CREATE:
		{
			ShowWindow(hwnd, SW_HIDE);
			return 0;
		}

		case WM_DESTROY:
		{
			WaitForSingleObject(hGlobalMutex,INFINITE);

			PGPFreeKeyIter(g_KeyIter);
			PGPFreeKeyDB(g_KeyDB);
			PGPscDestroy(hwnd,PGPsc,PGPtls);

			ReleaseMutex(hGlobalMutex);

			CloseHandle(hGlobalMutex);

			hGlobalMutex=NULL;
			g_KeyDB=NULL;
			g_KeyIter=NULL;
			PGPsc=NULL;
			PGPtls=NULL;
			break;
		}
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

#define szAppName "PGPicq_HiddenWindow"

HWND ICQWindow(void)
{
	HWND hwnd;
	WNDCLASS wc;

	// Register the Server Window Class

	wc.style			= 0;
	wc.lpfnWndProc		= ICQProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= g_hinst;
	wc.hIcon			= 0;
	wc.hCursor			= 0;
	wc.hbrBackground	= 0;
	wc.lpszMenuName		= 0;
	wc.lpszClassName	= szAppName;

	RegisterClass(&wc);

	hwnd = CreateWindow(
		szAppName, szAppName, WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, NULL, NULL, g_hinst, NULL );

	return hwnd;
}

PPLUGININFO CreatePluginInfo(HWND hwnd)
{
	PPLUGININFO	plugin;
	PGPError err;

	if (PGPsc==NULL)
	{
		hGlobalMutex = CreateMutex(NULL, FALSE, NULL);

		PGPscInit(hwnd,&PGPsc,&PGPtls,0);

		err=PGPclOpenDefaultKeyrings(PGPsc,
			kPGPOpenKeyDBFileOptions_None,&g_KeyDB);
		if(IsntPGPError(err))
		{
			PGPNewKeyIterFromKeyDB (g_KeyDB, &g_KeyIter);

			PGPSetNotificationCallback(UpdateProc,
				NULL);
		}

		// register the reload messages
		g_uReloadKeyringMessage = 
			RegisterWindowMessage (kPGPclReloadKeyRingMsg);
		// register the key add from PGPsc messages
		g_uAddedKeysMessage = 
			RegisterWindowMessage (kPGPscAddedKeysMsg);
		// register the ole message
		g_uOLEMessage = 
			RegisterWindowMessage ("PGPicq OLE message");
		g_uStreamMessage = 
			RegisterWindowMessage ("PGPicq stream message");

//		hReceiveMutex = CreateMutex(NULL, FALSE, NULL);

		ICQWindow();
	}

	plugin=(PPLUGININFO)malloc(sizeof(PLUGININFO));
	memset(plugin,0x00,sizeof(PLUGININFO));

	return plugin;
}

BOOL UserHasState(USERSTATE *userstate,
				  char *szICQnum,
				  BOOL *bEncrypt)
{
	BOOL bRst;

	bRst=FALSE;

	WaitForSingleObject(hGlobalMutex,INFINITE);

	while(userstate!=NULL)
	{
		if(!strcmp(userstate->szICQnum,szICQnum))
		{
			*bEncrypt=userstate->bEncrypt;

			bRst=TRUE;
			break;
		}

		userstate=userstate->next;
	}

	ReleaseMutex(hGlobalMutex);

	return bRst;
}

void AddUserState(USERSTATE **userstate,
						char *szICQnum,
						BOOL bEncrypt)
{
	USERSTATE *newuser,*userindex;

	WaitForSingleObject(hGlobalMutex,INFINITE);

	userindex=*userstate;

	while(userindex!=NULL)
	{
		if(!strcmp(userindex->szICQnum,szICQnum))
		{
			// already exists
			userindex->bEncrypt=bEncrypt;
			break;
		}

		userindex=userindex->next;
	}

	if(userindex==NULL)
	{
		// doesn't exist.. new one
		newuser=(USERSTATE *)malloc(sizeof(USERSTATE));
	
		if(newuser!=NULL)
		{
			memset(newuser,0x00,sizeof(USERSTATE));

			newuser->szICQnum=(char *)malloc(strlen(szICQnum));

			if(newuser->szICQnum!=NULL)
			{
				strcpy(newuser->szICQnum,szICQnum);
				newuser->bEncrypt=bEncrypt;
	
				newuser->next=*userstate;
				*userstate=newuser;
			}
			else
			{
				// It failed somehow?
				free(newuser);
			}
		}
	}

	ReleaseMutex(hGlobalMutex);
}

void FreeUserState(USERSTATE *userstate)
{
	USERSTATE *freeatlast;

	WaitForSingleObject(hGlobalMutex,INFINITE);

	while(userstate!=NULL)
	{
		freeatlast=userstate;
		userstate=userstate->next;

		free(freeatlast->szICQnum);
		free(freeatlast);
	}

	ReleaseMutex(hGlobalMutex);
}

void FreePluginInfo(PPLUGININFO plugin)
{
	if (plugin == NULL)
		return;

	if (plugin->hwndCurrent != NULL)
	{
		RemoveProp(plugin->hwndCurrent, PLUGIN_INFO_PROP);
		plugin->hwndCurrent = NULL;
	}

	if(plugin->pDoc)
		DeleteRichOLE(plugin);

	if(plugin->hFont)
	{
		DeleteObject(plugin->hFont);
	}

	free(plugin);
}

/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?