static void _RGISGrpPanelNewCBK (Widget widget,RGISGrpPanel *grpPanel,XmAnyCallbackStruct *callData) { char *groupName; DBDataset *dataset = UIDataset (); DBObjData *dbData = dataset->Data (); DBObjTable *groupTable = dbData->Table (DBrNGroups); DBObjTableField *group; DBObjRecord *record; if ((groupName = UIGetString ((char *) "Group Name",16)) == (char *) NULL) return; if (groupTable == (DBObjTable *) NULL) { DBObjTable *items = dbData->Table (DBrNItems); DBObjectLIST<DBObjTable> *tables = dbData->Tables (); DBTableFieldDefinition fieldDefs [] = { DBTableFieldDefinition (groupName, DBTableFieldInt,(char *) "%1d",sizeof (DBByte)), DBTableFieldDefinition () }; tables->Add (groupTable = new DBObjTable (DBrNGroups,fieldDefs)); grpPanel->Groups (groupTable->Fields ()); group = groupTable->Field (groupName); for (record = items->First ();record != (DBObjRecord *) NULL;record = items->Next ()) group->Int (groupTable->Add (record->Name ()),true); } else { groupTable->AddField (group = new DBObjTableField (groupName,DBTableFieldInt,"%1d",sizeof (DBByte))); for (record = groupTable->First ();record != (DBObjRecord *) NULL;record = groupTable->Next ()) group->Int (record,true); } grpPanel->Add (group); }
void RGISEditGridRenameLayerCBK (Widget widget, RGISWorkspace *workspace,XmAnyCallbackStruct *callData) { char *layerName; DBDataset *dataset = UIDataset (); DBObjData *dbData = dataset->Data (); DBGridIF *gridIF; if ((layerName = UIGetString ((char *) "Layer Name",DBStringLength)) == (char *) NULL) return; gridIF= new DBGridIF (dbData); gridIF->RenameLayer (layerName); delete gridIF; workspace->CurrentData (dbData); }
int CExtImpl::EncryptSignMessage(HWND hwnd, IMessage *pmsg, RECIPIENTDIALOGSTRUCT *prds, PGPOptionListRef *pSignOptions) { IStream *pstrmBody = 0; STATSTG StreamStats; DWORD dwInSize; UINT nOutSize; BOOL bExchangeUser = FALSE; char *pInput; char *pOutput = NULL; LPMAPITABLE ptableAttach = 0; SizedSPropTagArray(1, tagaTable) = { 1, {PR_ATTACH_NUM}}; SRowSet *prAttach = 0; PGPError nError = kPGPError_NoErr; HRESULT hr; char szName[256]; char szFile[256]; UIGetString(szName, sizeof(szName), IDS_LOGNAME); UIGetString(szFile, sizeof(szFile), IDS_DLL); pmsg->GetAttachmentTable(0, &ptableAttach); HrQueryAllRows(ptableAttach, (SPropTagArray *)&tagaTable, NULL, NULL, 0, &prAttach); hr = pmsg->OpenProperty(PR_BODY, &IID_IStream, STGM_READ, 0, (IUnknown**)&pstrmBody); if (FAILED(hr)) { UIDisplayStringID(hwnd, IDS_E_NOBODY); ptableAttach->Release(); return kPGPError_ItemNotFound; } pstrmBody->Stat(&StreamStats, STATFLAG_NONAME); dwInSize = StreamStats.cbSize.LowPart; pInput = (char *) calloc(dwInSize+1, sizeof(char)); if (!pInput) { UIDisplayStringID(hwnd, IDS_E_NOMEMORY); pstrmBody->Release(); ptableAttach->Release(); return kPGPError_OutOfMemory; } pstrmBody->Read(pInput, dwInSize, &dwInSize); pstrmBody->Release(); pInput[dwInSize] = 0; nError = EncryptSignBuffer(UIGetInstance(), hwnd, _pgpContext, _tlsContext, szName, szFile, pInput, dwInSize, prds, NULL, pSignOptions, (VOID ** )&pOutput, &nOutSize, _bEncrypt, _bSign, FALSE); if ((dwInSize > 0) && IsntPGPError(nError)) { LARGE_INTEGER li = {0,0}; ULARGE_INTEGER uli = {1,0}; BOOL fPartied; pmsg->OpenProperty(PR_BODY, &IID_IStream, STGM_READWRITE, MAPI_MODIFY, (IUnknown**)&pstrmBody); pstrmBody->Seek(li, STREAM_SEEK_SET, NULL); pstrmBody->Write("\0", 1, NULL); pstrmBody->SetSize(uli); pstrmBody->Commit(STGC_DEFAULT); pstrmBody->Release(); RTFSync(pmsg, RTF_SYNC_BODY_CHANGED, &fPartied); pmsg->OpenProperty(PR_BODY, &IID_IStream, STGM_READWRITE, MAPI_MODIFY, (IUnknown**)&pstrmBody); } if (IsntPGPError(nError)) { LARGE_INTEGER li = {0,0}; ULARGE_INTEGER uli = {nOutSize + prAttach->cRows, 0}; BOOL fPartied; pstrmBody->Seek(li, STREAM_SEEK_SET, NULL); pstrmBody->Write(pOutput, nOutSize, NULL); pstrmBody->SetSize(uli); pstrmBody->Commit(STGC_DEFAULT); pstrmBody->Release(); RTFSync(pmsg, RTF_SYNC_BODY_CHANGED, &fPartied); PGPFreeData(pOutput); } free(pInput); if (IsntPGPError(nError)) { hr = pmsg->OpenProperty(PR_BODY_HTML, &IID_IStream, STGM_READWRITE, MAPI_MODIFY, (IUnknown**)&pstrmBody); if (FAILED(hr)) goto NoBodyHTML; else { LARGE_INTEGER li = {0,0}; ULARGE_INTEGER uli = {1,0}; BOOL fPartied; pstrmBody->Seek(li, STREAM_SEEK_SET, NULL); pstrmBody->Write("\0", 1, NULL); pstrmBody->SetSize(uli); pstrmBody->Commit(STGC_DEFAULT); pstrmBody->Release(); RTFSync(pmsg, RTF_SYNC_BODY_CHANGED, &fPartied); } } NoBodyHTML: if (prAttach->cRows && IsntPGPError(nError)) nError = EncryptSignAttachment(hwnd, pmsg, nOutSize, prAttach, prds, pSignOptions); ptableAttach->Release(); return nError; }
STDMETHODIMP CExtImpl::OnRead(IExchExtCallback* peecb) { HWND hwnd; peecb->GetWindow(&hwnd); if (!hwnd) hwnd = GetTopWindow(NULL); switch (_context) { case EECONTEXT_SENDNOTEMESSAGE: { BOOL fAddButtons = TRUE; int nNumButtons; int nIndex; TBBUTTON tbbNew[5]; TBBUTTON tbbCheck; // Check to make sure the buttons aren't already on the toolbar nNumButtons = SendMessage(_hwndSendToolbar, TB_BUTTONCOUNT, 0, 0); for (nIndex=0; nIndex<nNumButtons; nIndex++) { SendMessage(_hwndSendToolbar, TB_GETBUTTON, (WPARAM) nIndex, (LPARAM) &tbbCheck); // If a button exists with the same bitmap ID and command ID // as the Encrypt button, odds are good that the button is // already on the toolbar if ((tbbCheck.iBitmap == (int)_itbmEncrypt) && (tbbCheck.idCommand == (int)_cmdidEncrypt)) { fAddButtons = FALSE; nIndex = nNumButtons; } } if (fAddButtons) { tbbNew[0].iBitmap = 0; tbbNew[0].idCommand = 0; tbbNew[0].fsState = 0; tbbNew[0].fsStyle = TBSTYLE_SEP; tbbNew[0].dwData = 0; tbbNew[0].iString = -1; tbbNew[1].iBitmap = _itbmEncrypt; tbbNew[1].idCommand = _cmdidEncrypt; tbbNew[1].fsState = TBSTATE_ENABLED; tbbNew[1].fsStyle = TBSTYLE_CHECK; tbbNew[1].dwData = 0; tbbNew[1].iString = -1; tbbNew[2].iBitmap = _itbmSign; tbbNew[2].idCommand = _cmdidSign; tbbNew[2].fsState = TBSTATE_ENABLED; tbbNew[2].fsStyle = TBSTYLE_CHECK; tbbNew[2].dwData = 0; tbbNew[2].iString = -1; tbbNew[3].iBitmap = 0; tbbNew[3].idCommand = 0; tbbNew[3].fsState = 0; tbbNew[3].fsStyle = TBSTYLE_SEP; tbbNew[3].dwData = 0; tbbNew[3].iString = -1; tbbNew[4].iBitmap = _itbmPgpKeys; tbbNew[4].idCommand = _cmdidPgpKeys; tbbNew[4].fsState = TBSTATE_ENABLED; tbbNew[4].fsStyle = TBSTYLE_BUTTON; tbbNew[4].dwData = 0; tbbNew[4].iString = -1; SendMessage(_hwndSendToolbar, TB_ADDBUTTONS, 5, (LPARAM) tbbNew); } } break; case EECONTEXT_SENDPOSTMESSAGE: break; case EECONTEXT_READNOTEMESSAGE: { BOOL fAddButtons = TRUE; int nNumButtons; int nIndex; TBBUTTON tbbNew[5]; TBBUTTON tbbCheck; BOOL FYEO; // Check to make sure the buttons aren't already on the toolbar nNumButtons = SendMessage(_hwndReadToolbar, TB_BUTTONCOUNT, 0, 0); for (nIndex=0; nIndex<nNumButtons; nIndex++) { SendMessage(_hwndReadToolbar, TB_GETBUTTON, (WPARAM) nIndex, (LPARAM) &tbbCheck); // If a button exists with the same bitmap ID and command ID // as the Decrypt button, odds are good that the button is // already on the toolbar if ((tbbCheck.iBitmap == (int)_itbmDecrypt) && (tbbCheck.idCommand == (int)_cmdidDecrypt)) { fAddButtons = FALSE; nIndex = nNumButtons; } } if (fAddButtons) { tbbNew[0].iBitmap = 0; tbbNew[0].idCommand = 0; tbbNew[0].fsState = 0; tbbNew[0].fsStyle = TBSTYLE_SEP; tbbNew[0].dwData = 0; tbbNew[0].iString = -1; tbbNew[1].iBitmap = _itbmDecrypt; tbbNew[1].idCommand = _cmdidDecrypt; tbbNew[1].fsState = TBSTATE_ENABLED; tbbNew[1].fsStyle = TBSTYLE_BUTTON; tbbNew[1].dwData = 0; tbbNew[1].iString = -1; tbbNew[2].iBitmap = 0; tbbNew[2].idCommand = 0; tbbNew[2].fsState = 0; tbbNew[2].fsStyle = TBSTYLE_SEP; tbbNew[2].dwData = 0; tbbNew[2].iString = -1; tbbNew[3].iBitmap = _itbmPgpKeys; tbbNew[3].idCommand = _cmdidPgpKeys; tbbNew[3].fsState = TBSTATE_ENABLED; tbbNew[3].fsStyle = TBSTYLE_BUTTON; tbbNew[3].dwData = 0; tbbNew[3].iString = -1; SendMessage(_hwndReadToolbar, TB_ADDBUTTONS, 4, (LPARAM) tbbNew); } IMAPISession* psess; HRESULT hr = peecb->GetSession(&psess, NULL); if (FAILED(hr)) { UIDisplayStringID(hwnd, IDS_E_NOSESSION); return S_FALSE; } if (AutoDecrypt(_memoryMgr)) { IMessage *pmsg = 0; STATSTG StreamStats; DWORD dwInSize; UINT nOutSize; char *pInput; char *pOutput = NULL; BOOL bGotHTML = FALSE; PGPError nError = kPGPError_NoErr; char szFile[256]; char szName[256]; UIGetString(szName, sizeof(szName), IDS_LOGNAME); UIGetString(szFile, sizeof(szFile), IDS_DLL); CWaitCursor wait; // Mark busy hr = peecb->GetObject(NULL, (IMAPIProp**)&pmsg); if (FAILED(hr)) { return S_FALSE; } IStream *pstrmBody = 0; hr = pmsg->OpenProperty(PR_BODY_HTML, &IID_IStream, STGM_READWRITE, MAPI_MODIFY, (IUnknown**)&pstrmBody); if (FAILED(hr)) { hr = pmsg->OpenProperty(PR_BODY, &IID_IStream, STGM_READWRITE, MAPI_MODIFY, (IUnknown**)&pstrmBody); } else bGotHTML = TRUE; if (FAILED(hr)) { pmsg->Release(); psess->Release(); return S_FALSE; } pstrmBody->Stat(&StreamStats, STATFLAG_NONAME); dwInSize = StreamStats.cbSize.LowPart; pInput = (char *) calloc(dwInSize+1, sizeof(char)); if (!pInput) { UIDisplayStringID(hwnd, IDS_E_NOMEMORY); pstrmBody->Release(); pmsg->Release(); psess->Release(); return S_FALSE; } pstrmBody->Read(pInput, dwInSize, &dwInSize); pInput[dwInSize] = 0; if (AutoDecrypt(_memoryMgr)) { nError = DecryptVerifyBuffer(UIGetInstance(), hwnd, _pgpContext, _tlsContext, szName, szFile, pInput, dwInSize, FALSE, (VOID ** )&pOutput, &nOutSize, &FYEO); if (IsntPGPError(nError) && (nOutSize > 0) && (pOutput != NULL)) { LARGE_INTEGER li = {0,0}; ULARGE_INTEGER uli = {nOutSize, 0}; BOOL fPartied; char *szBuffer = NULL; // Alter only the block of encrypted/signed text // if this is not HTML if((FYEO)||(GetSecureViewerPref(_pgpContext))) { TempestViewer((void *)_pgpContext,hwnd, pOutput,nOutSize,FYEO); } else { szBuffer = (char *) calloc(dwInSize+nOutSize+1, sizeof(char)); strcpy(szBuffer, pOutput); if (strlen(szBuffer) > 0) { uli.LowPart = strlen(szBuffer); pstrmBody->Seek(li, STREAM_SEEK_SET, NULL); pstrmBody->Write(szBuffer, strlen(szBuffer), NULL); pstrmBody->SetSize(uli); pstrmBody->Commit(STGC_DEFAULT); pstrmBody->Release(); RTFSync(pmsg, RTF_SYNC_BODY_CHANGED, &fPartied); } free(szBuffer); } PGPFreeData(pOutput); } else pstrmBody->Release(); } else pstrmBody->Release(); free(pInput); pmsg->Release(); } psess->Release(); } break; case EECONTEXT_READPOSTMESSAGE: break; default: // This way, the function defends itself against unknown future // variants, as FindREOnNote is less robust than it might be. return S_FALSE; } return S_FALSE; }
void AddMainToolbarButtons(PluginInfo *plugin) { HDC hDC; int iNumBits; HIMAGELIST hilToolbar; HBITMAP hbmpPGPkeys; int nPGPkeysSTR; int nPGPkeysBMP; TBBUTTON tbb[1]; char szText[255]; HINSTANCE hInst; int nX; int nY; hInst = UIGetInstance(); hilToolbar = (HIMAGELIST) SendMessage(plugin->hToolbar, TB_GETIMAGELIST, 0, 0); hDC = GetDC (NULL); // DC for desktop iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES); ReleaseDC (NULL, hDC); ImageList_GetIconSize(hilToolbar, &nX, &nY); if (nX < 20) plugin->bSmallIcons = TRUE; else plugin->bSmallIcons = FALSE; if (iNumBits <= 8) { if (plugin->bSmallIcons) hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSO4)); else hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSOFF4)); } else { if (plugin->bSmallIcons) hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSO)); else hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSOFF)); } nPGPkeysBMP = ImageList_AddMasked(hilToolbar, hbmpPGPkeys, TRANSPARENT_COLOR); DeleteObject(hbmpPGPkeys); plugin->nPGPKeysImage = nPGPkeysBMP; SendMessage(plugin->hToolbar, TB_SETIMAGELIST, 0, (LPARAM) hilToolbar); hilToolbar = (HIMAGELIST) SendMessage(plugin->hToolbar, TB_GETHOTIMAGELIST, 0, 0); if (iNumBits <= 8) { if (plugin->bSmallIcons) hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYS4)); else hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSLARGE4)); } else { if (plugin->bSmallIcons) hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYS)); else hbmpPGPkeys = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PGPKEYSLARGE)); } ImageList_AddMasked(hilToolbar, hbmpPGPkeys, TRANSPARENT_COLOR); DeleteObject(hbmpPGPkeys); SendMessage(plugin->hToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM) hilToolbar); UIGetString(szText, 254, IDS_TOOLTIP_PGPKEYS); nPGPkeysSTR = SendMessage(plugin->hToolbar, TB_ADDSTRING, 0, (LPARAM) szText); plugin->nPGPKeysString = nPGPkeysSTR; tbb[0].iBitmap = nPGPkeysBMP; tbb[0].idCommand = IDC_PGPKEYS; tbb[0].fsState = TBSTATE_ENABLED; tbb[0].fsStyle = TBSTYLE_BUTTON; tbb[0].dwData = 0; tbb[0].iString = nPGPkeysSTR; SendMessage(plugin->hToolbar, TB_ADDBUTTONS, 1, (LPARAM) &tbb); plugin->nPGPKeysButton = SendMessage(plugin->hToolbar, TB_COMMANDTOINDEX, IDC_PGPKEYS, 0); return; }
LRESULT CALLBACK MainWndProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC lpOldProc; PluginInfo *plugin; lpOldProc = (WNDPROC)GetProp( hDlg, "oldproc" ); plugin = GetPluginInfo(hDlg); if (plugin != NULL) { if (msg == plugin->nPurgeCacheMsg) { PGPclPurgeCachedPassphrase(wParam); return TRUE; } } switch(msg) { case WM_SETTINGCHANGE: case WM_PALETTECHANGED: case WM_FONTCHANGE: case WM_SYSCOLORCHANGE: { HIMAGELIST hilToolbar; int nIndex; LRESULT lResult; lResult = CommonWndProc(hDlg, msg, wParam, lParam); nIndex = SendMessage(plugin->hToolbar, TB_COMMANDTOINDEX, IDC_PGPKEYS, 0); SendMessage(plugin->hToolbar, TB_DELETEBUTTON, nIndex, 0); plugin->nPGPKeysButton = -1; hilToolbar = (HIMAGELIST) SendMessage(plugin->hToolbar, TB_GETIMAGELIST, 0, 0); ImageList_Remove(hilToolbar, plugin->nPGPKeysImage); AddMainToolbarButtons(plugin); return lResult; } case WM_DESTROY: { KillTimer(hDlg, WATCH_TOOLBAR_TIMER); break; } case WM_PARENTNOTIFY: if (LOWORD(wParam) == WM_CREATE) CreateMainWindowGUI(hDlg, plugin); break; case WM_TIMER: if (wParam == WATCH_TOOLBAR_TIMER) { int nState; nState = SendMessage(plugin->hToolbar, TB_GETSTATE, IDC_PGPKEYS, 0); if (nState & TBSTATE_ENABLED) return 0; nState |= TBSTATE_ENABLED; SendMessage(plugin->hToolbar, TB_SETSTATE, IDC_PGPKEYS, MAKELONG(nState, 0)); return 0; } break; case WM_INITMENUPOPUP: { int nOptions; MENUITEMINFO menuInfo; char szOptions[256]; char szMenu[256]; LRESULT lResult; // For some reason, the old window proc disables the // menu items in the PGP popup menu. We'll enable // the items after the old proc disables them if ((HMENU) wParam == plugin->hPGPMenu) { lResult = CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam); EnableMenuItem(plugin->hPGPMenu, IDC_PREFS, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(plugin->hPGPMenu, IDC_PGPKEYS, MF_BYCOMMAND | MF_ENABLED); return lResult; } else if (plugin->bOE5) { UIGetString(szOptions, 254, IDS_MENU_OEOPTIONS); nOptions = GetMenuItemCount((HMENU) wParam); menuInfo.cbSize = sizeof(MENUITEMINFO); menuInfo.fMask = MIIM_TYPE | MIIM_SUBMENU | MIIM_ID; menuInfo.dwTypeData = szMenu; menuInfo.cch = 255; GetMenuItemInfo((HMENU) wParam, nOptions - 1, TRUE, &menuInfo); if (!strcmp(szMenu, szOptions)) { lResult = CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam); strcpy(szMenu, "&PGP"); menuInfo.cbSize = sizeof(MENUITEMINFO); menuInfo.fMask = MIIM_TYPE | MIIM_ID | MIIM_SUBMENU | MIIM_STATE; menuInfo.fType = MFT_STRING; menuInfo.fState = MFS_ENABLED; menuInfo.wID = IDC_PGPMENU; menuInfo.hSubMenu = plugin->hPGPMenu; menuInfo.dwTypeData = szMenu; InsertMenuItem((HMENU) wParam, nOptions, TRUE, &menuInfo); plugin->nPGPPosition = nOptions; return lResult; } else if (!strcmp(szMenu, "&PGP")) { lResult = CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam); DestroyMenu(plugin->hPGPMenu); plugin->hPGPMenu = CreatePopupMenu(); UIGetString(szMenu, 254, IDS_MENU_PREFS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PREFS, szMenu); UIGetString(szMenu, 254, IDS_MENU_PGPKEYS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PGPKEYS, szMenu); menuInfo.cbSize = sizeof(MENUITEMINFO); menuInfo.fMask = MIIM_SUBMENU | MIIM_STATE; menuInfo.fState = MFS_ENABLED; menuInfo.hSubMenu = plugin->hPGPMenu; SetMenuItemInfo((HMENU) wParam, IDC_PGPMENU, FALSE, &menuInfo); menuInfo.fMask = MIIM_STATE; SetMenuItemInfo(plugin->hPGPMenu, IDC_PREFS, FALSE, &menuInfo); SetMenuItemInfo(plugin->hPGPMenu, IDC_PGPKEYS, FALSE, &menuInfo); return lResult; } } break; } } return CommonWndProc(hDlg, msg, wParam, lParam); }
void CreateMainWindowGUI(HWND hDlg, PluginInfo *plugin) { HWND hReBar; HWND hSizableRebar; int nIndex; MENUITEMINFO menuInfo; WNDPROC lpOldProc; char szText[255]; hSizableRebar = FindWindowEx(hDlg, NULL, "SizableRebar", NULL); hReBar = FindWindowEx(hSizableRebar, NULL, "ReBarWindow32", NULL); if (plugin->bOE5) { plugin->hToolbar = FindWindowEx(hReBar, NULL, "ToolbarWindow32", NULL); plugin->hMenuToolbar = FindWindowEx(hReBar, plugin->hToolbar, "ToolbarWindow32", NULL); if (!plugin->hMenuToolbar || !plugin->hToolbar) return; } else { plugin->hMainMenu = GetMenu(hDlg); plugin->hToolbar = FindWindowEx(hReBar, NULL, "ToolbarWindow32", NULL); if (!plugin->hMainMenu || !plugin->hToolbar) return; } if (plugin->bOE5) { if (plugin->hPGPMenu != NULL) DestroyMenu(plugin->hPGPMenu); plugin->hPGPMenu = CreatePopupMenu(); UIGetString(szText, 254, IDS_MENU_PREFS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PREFS, szText); UIGetString(szText, 254, IDS_MENU_PGPKEYS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PGPKEYS, szText); } else { menuInfo.cbSize = sizeof(MENUITEMINFO); menuInfo.fMask = MIIM_SUBMENU; GetMenuItemInfo(plugin->hMainMenu, 4, TRUE, &menuInfo); if (menuInfo.hSubMenu != plugin->hPGPMenu) { if (plugin->hPGPMenu != NULL) DestroyMenu(plugin->hPGPMenu); plugin->hPGPMenu = CreatePopupMenu(); plugin->nPGPPosition = 4; InsertMenu(plugin->hMainMenu, plugin->nPGPPosition, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT) plugin->hPGPMenu, "&PGP"); UIGetString(szText, 254, IDS_MENU_PREFS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PREFS, szText); UIGetString(szText, 254, IDS_MENU_PGPKEYS); AppendMenu(plugin->hPGPMenu, MF_STRING, IDC_PGPKEYS, szText); DrawMenuBar(hDlg); } } SendMessage(plugin->hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0); nIndex = SendMessage(plugin->hToolbar, TB_COMMANDTOINDEX, IDC_PGPKEYS, 0); if (nIndex < 0) { AddMainToolbarButtons(plugin); SetTimer(hDlg, WATCH_TOOLBAR_TIMER, 500, NULL); } // Look for status bar plugin->hStatusBar = FindWindowEx(hDlg, NULL, "msctls_statusbar32", NULL); lpOldProc = (WNDPROC) GetProp(hReBar, "oldproc"); if (lpOldProc == NULL) { // Save away toolbar parent window proc SetProp(hReBar, "oldproc", (HANDLE) GetWindowLong(hReBar, GWL_WNDPROC)); // Save plugin pointer SetProp(hReBar, PLUGIN_INFO_PROP, (HANDLE) plugin); // Subclass toolbar parent window SetWindowLong(hReBar, GWL_WNDPROC, (DWORD) ToolbarParentWndProc); } return; }
PGPError GetRecipients(HWND hwnd, char *szNames, PGPContextRef pgpContext, PGPtlsContextRef tlsContext, RECIPIENTDIALOGSTRUCT *prds) { HINSTANCE hWAB = NULL; LPWABOPEN pWABOpen = NULL; LPADRBOOK pAdrBook = NULL; LPWABOBJECT pWABObject = NULL; AdrBookTable * pTable = NULL; UINT nNumEntries = 0; UINT nIndex; DWORD dwNumRecips = 0; BOOL bGotRecipients = FALSE; BOOL bAddressBook = FALSE; char szTitle[256]; char * szName; char * szEmail; char * szNewRecipient; char ** szOldRecipients; char ** szRecipientArray = NULL; PGPKeySetRef pubKeySet = NULL; PGPError err = kPGPError_NoErr; if (LoadWAB(&hWAB, &pWABOpen, &pAdrBook, &pWABObject)) if (ReadWAB(pAdrBook, pWABObject, &pTable, &nNumEntries)) bAddressBook = TRUE; szName = strtok(szNames, ",;"); while (szName) { szEmail = szName; if (bAddressBook) { for (nIndex=0; nIndex<nNumEntries; nIndex++) { if ((!_stricmp(szName, pTable[nIndex].szName)) && (pTable[nIndex].szEmail != NULL)) { szEmail = pTable[nIndex].szEmail; nIndex = nNumEntries; } } } szNewRecipient = (char *) calloc(sizeof(char), strlen(szEmail)+1); strcpy(szNewRecipient, szEmail); szOldRecipients = szRecipientArray; szRecipientArray = (char **) calloc(sizeof(char *), dwNumRecips+1); if (dwNumRecips > 0) { UINT i; for (i=0; i<dwNumRecips; i++) (szRecipientArray)[i] = szOldRecipients[i]; } (szRecipientArray)[dwNumRecips] = szNewRecipient; dwNumRecips++; szName = strtok(NULL, ",;"); } UIGetString(szTitle, sizeof(szTitle), IDS_RECIPIENTDIALOG); prds->Version = CurrentPGPrecipVersion; prds->hwndParent = hwnd; prds->szTitle = "Recipient Selection"; prds->Context = pgpContext; prds->tlsContext = tlsContext; prds->SelectedKeySetRef = NULL; prds->szRecipientArray = szRecipientArray; prds->dwNumRecipients = dwNumRecips; prds->dwOptions = PGPCL_ASCIIARMOR; prds->dwFlags = 0; prds->dwDisableFlags = PGPCL_DISABLE_ASCIIARMOR | PGPCL_DISABLE_WIPEORIG | PGPCL_DISABLE_SDA; prds->AddedKeys = NULL; bGotRecipients = PGPclRecipientDialog(prds); if (prds->AddedKeys != NULL) { PGPUInt32 numKeys; PGPCountKeys(prds->AddedKeys, &numKeys); if (numKeys > 0) PGPclQueryAddKeys(pgpContext, tlsContext, hwnd, prds->AddedKeys, NULL); PGPFreeKeySet(prds->AddedKeys); prds->AddedKeys = NULL; } if (bGotRecipients != TRUE) { err = kPGPError_UserAbort; goto GetRecipientsError; } FreeWAB(hWAB, pAdrBook, pWABObject, pTable, nNumEntries); return err; GetRecipientsError: FreeRecipients(prds); FreeWAB(hWAB, pAdrBook, pWABObject, pTable, nNumEntries); return err; }