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 + -
显示快捷键?