// This file contains dead code we dont use in the WAB but which we dont want // to lose as it may be useful someday ... // #ifdef IMPORT_WAB /*************************************************************************** Name : HrImportWABFile Purpose : Merges an external WAB file with the current on Parameters: hwnd = hwnd lpIAB -> IAddrBook object Returns : HRESULT Comment : ***************************************************************************/ HRESULT HrImportWABFile(HWND hWnd, LPADRBOOK lpIAB) { HRESULT hResult = hrSuccess; OPENFILENAME ofn; LPTSTR lpFilter = FormatAllocFilter(idsWABImportString, TEXT("*.WAB")); TCHAR szFileName[MAX_PATH + 1] = ""; HANDLE hPropertyStore = NULL; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.hInstance = hinstMapiX; ofn.lpstrFilter = lpFilter; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 0; ofn.lpstrFile = szFileName; ofn.nMaxFile = sizeof(szFileName); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = TEXT("Select WAB File to Import"); ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = "wab"; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName(&ofn)) { ULONG ulEIDCount = 0; LPDWORD lpdwEntryIDs = NULL; ULONG i; SPropertyRestriction PropRes = {0}; HCURSOR hOldCur = SetCursor(LoadCursor(NULL, IDC_WAIT)); TCHAR szBuf[MAX_UI_STR]; hResult = OpenPropertyStore( szFileName, AB_OPEN_EXISTING, hWnd, &hPropertyStore); if(HR_FAILED(hResult) || (!hPropertyStore)) { ShowMessageBoxParam(hWnd, IDE_VCARD_IMPORT_FILE_ERROR, MB_ICONEXCLAMATION, szFileName); goto out; } PropRes.ulPropTag = PR_DISPLAY_NAME; PropRes.relop = RELOP_EQ; PropRes.lpProp = NULL; hResult = FindRecords( hPropertyStore, AB_MATCH_PROP_ONLY, TRUE, &PropRes, &ulEIDCount, &lpdwEntryIDs); if(HR_FAILED(hResult)) { LocalFreeAndNull(&lpdwEntryIDs); goto out; } if (ulEIDCount > 0) { for(i=0;iszEmailAddress && lstrlen(lpItem->szEmailAddress)) { LPTSTR lpszMailTo = NULL; LPTSTR lpszEmail = NULL; ULONG cValues; LoadString(hinstMapiX, idsSendMailTo, szBuf, sizeof(szBuf)); // Open the entry and read the email address. // NOTE: We can't just take the address out of the listbox // because it may be truncated! if (HR_FAILED(hr = HrGetPropArray(lpIAB, (LPSPropTagArray)&ptaEmailAddress, lpItem->cbEntryID, lpItem->lpEntryID, &cValues, &lpspv))) { goto out; } lpszEmail = lpspv[0].Value.LPSZ; if (FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY, szBuf, 0, // stringid 0, // dwLanguageId (LPTSTR)&lpszMailTo, // output buffer 0, //MAX_UI_STR (va_list *)&lpszEmail)) { #ifndef WIN16 ShellExecute(hWndParent, "open", lpszMailTo, NULL, NULL, SW_SHOWNORMAL); LocalFreeAndNull(&lpszMailTo); #else ShellExecute(hWndParent, NULL, cszMailClient, lpszMailTo, NULL, SW_SHOWNORMAL); FormatMessageFreeMem(lpszMailTo); #endif hr = S_OK; goto out; } } else { // the item has no email ShowMessageBox(GetParent(hWndLV), idsSendMailToNoEmail, MB_ICONEXCLAMATION | MB_OK); } } } } else { if (iItemIndex <= 0) { // nothing selected ShowMessageBox(GetParent(hWndLV), IDS_ADDRBK_MESSAGE_NO_ITEM, MB_ICONEXCLAMATION); } else { //multiple selected ShowMessageBox(GetParent(hWndLV), IDS_ADDRBK_MESSAGE_ACTION, MB_ICONEXCLAMATION); } } out: FreeBufferAndNull(&lpspv); return hr; } #endif #ifdef CERT_PROPS IDD_DIALOG_CERT_GENERAL DIALOG DISCARDABLE 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg" #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN ICON IDI_ICON_CERT,IDC_CERT_GENERAL_ICON,7,7,20,20 LTEXT "John Smith ", IDC_CERT_GENERAL_LABEL_CERTFORDATA,56,12,149,8 LTEXT "Serial Number:",IDC_CERT_GENERAL_LABEL_SERIALNUM,7,45, 47,8 LTEXT "12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 ", IDC_CERT_GENERAL_LABEL_SERIALNUMDATA,56,45,149,26 LTEXT "Valid From:",IDC_CERT_GENERAL_LABEL_VALIDFROM,7,30,36,8 LTEXT "September 19, 1996 to September 18, 1997", IDC_CERT_GENERAL_LABEL_VALIDFROMDATA,56,30,139,8 GROUPBOX "Issued By:",IDC_CERT_GENERAL_FRAME_ISSUED,7,71,198,32 LTEXT "Verisign, Inc.",IDC_CERT_GENERAL_LABEL_ISSUER,38,86,158, 8 GROUPBOX "Status:",IDC_CERT_GENERAL_FRAME_STATUS,7,107,198,74 ICON IDI_ICON_CHECK,IDC_CERT_GENERAL_ICON_CHECK,13,116,20,20 ICON IDI_ICON_UNCHECK,IDC_CERT_GENERAL_ICON_UNCHECK,13,116,20, 20 LTEXT "This ID is valid.",IDC_CERT_GENERAL_STATIC_STATUS,38, 120,150,10 LTEXT "Revoked:",IDC_CERT_GENERAL_LABEL_REVOKED,40,135,32,8 LTEXT "No.",IDC_CERT_GENERAL_LABEL_REVOKEDDATA,81,135,12,8 LTEXT "Expired:",IDC_CERT_GENERAL_LABEL_EXPIRED,40,149,26,8 LTEXT "No.",IDC_CERT_GENERAL_LABEL_EXPIREDDATA,81,149,12,8 LTEXT "&Trusted:",IDC_CERT_GENERAL_LABEL_TRUST,39,163,27,8 COMBOBOX IDC_CERT_GENERAL_COMBO_TRUST,109,161,89,43, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Yes.",IDC_CERT_GENERAL_LABEL_TRUSTEDDATA,81,163,18,8 END IDD_DIALOG_CERT_TRUST DIALOGEX 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg", 0, 0, 0x1 #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN LTEXT "View the Chain of Trust for this digital ID here. ", IDC_CERT_TRUST_LABEL_EXPLAIN,36,12,169,8 GROUPBOX "&Chain of Trust:",IDC_CERT_TRUST_FRAME_CHAIN,7,30,198, 151 #ifndef WIN16 CONTROL "Tree1",IDC_CERT_TRUST_TREE_CHAIN,"SysTreeView32", TVS_HASLINES | TVS_DISABLEDRAGDROP | WS_TABSTOP,14,46, 184,127,WS_EX_CLIENTEDGE #else CONTROL "Tree1",IDC_CERT_TRUST_TREE_CHAIN,"IE_SysTreeView", TVS_HASLINES | TVS_DISABLEDRAGDROP | WS_TABSTOP,14,46, 184,127 #endif // !WIN16 ICON IDI_ICON_CERT,IDC_CERT_GENERAL_ICON,7,7,18,20 END IDD_DIALOG_CERT_ADVANCED DIALOGEX 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg", 0, 0, 0x1 #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN LTEXT "View additional properties for this digital ID here.", IDC_CERT_ADVANCED_LABEL_EXPLAIN,36,12,169,11 LTEXT "&Field:",IDC_CERT_ADVANCED_LABEL_FIELD,7,39,28,8 #ifndef WIN16 CONTROL "List1",IDC_CERT_ADVANCED_LIST_FIELD,"SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,49,69,121,WS_EX_CLIENTEDGE #else CONTROL "List1",IDC_CERT_ADVANCED_LIST_FIELD,"IE_SysListView", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,49,69,121 #endif // !WIN16 LTEXT "Details:",IDC_CERT_ADVANCED_LABEL_DETAILS,77,39,28,8 #ifndef WIN16 EDITTEXT IDC_CERT_ADVANCED_EDIT_DETAILS,78,49,127,121, ES_MULTILINE | ES_READONLY | WS_VSCROLL,WS_EX_CLIENTEDGE #else EDITTEXT IDC_CERT_ADVANCED_EDIT_DETAILS,78,49,127,121, ES_MULTILINE | ES_READONLY | WS_VSCROLL #endif // !WIN16 ICON IDI_ICON_CERT,IDC_CERT_GENERAL_ICON,7,7,20,20 END #endif //OLD_STUFF //#define IDC_CERT_GENERAL_LABEL_TRUSTEDDATA 2225 /* #define IDC_CERT_GENERAL_FRAME_STATUS 2208 #define IDC_CERT_GENERAL_ICON 2209 #define IDC_CERT_GENERAL_FRAME_ISSUED 2210 #define IDC_CERT_GENERAL_LABEL_CERTFOR 2211 #define IDC_CERT_GENERAL_LABEL_SERIALNUM 2212 #define IDC_CERT_GENERAL_LABEL_VALIDFROM 2213 #define IDC_CERT_GENERAL_LABEL_CERTFORDATA 2214 #define IDC_CERT_GENERAL_LABEL_SERIALNUMDATA 2215 #define IDC_CERT_GENERAL_LABEL_VALIDFROMDATA 2216 #define IDC_CERT_GENERAL_BUTTON_OPEN 2217 #define IDC_CERT_GENERAL_LABEL_ISSUER 2218 #define IDC_CERT_GENERAL_STATIC_STATUS 2219 #define IDC_CERT_GENERAL_LABEL_EXPIRED 2220 #define IDC_CERT_GENERAL_LABEL_REVOKED 2221 #define IDC_CERT_GENERAL_LABEL_EXPIREDDATA 2222 #define IDC_CERT_GENERAL_ICON_CHECK 2223 #define IDC_CERT_GENERAL_LABEL_REVOKEDDATA 2227 #define IDC_CERT_GENERAL_LABEL_TRUST 2228 #define IDC_CERT_GENERAL_COMBO_TRUST 2229 #define IDC_CERT_GENERAL_ICON_UNCHECK 2230 #define IDC_CERT_TRUST_FRAME_CHAIN 2231 #define IDC_CERT_TRUST_TREE_CHAIN 2232 #define IDC_CERT_TRUST_LABEL_EXPLAIN 2233 #define IDC_CERT_ADVANCED_LABEL_EXPLAIN 2234 #define IDC_CERT_ADVANCED_LIST_FIELD 2235 #define IDC_CERT_ADVANCED_EDIT_DETAILS 2236 #define IDC_CERT_ADVANCED_LABEL_FIELD 2237 #define IDC_CERT_ADVANCED_LABEL_DETAILS 2238 */ //#define IDD_DIALOG_CERT_GENERAL 120 //#define IDD_DIALOG_CERT_TRUST 121 //#define IDD_DIALOG_CERT_ADVANCED 122 #endif // CERT_PROPS // LDAP_PROPS #ifdef OLD_STUFF IDD_DIALOG_LDAP_ADD DIALOGEX 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg", 0, 0, 0x1 #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN LTEXT "Add, remove, and modify Internet directory services here. You will be able to search these directory services and check names against them.", IDC_LDAP_ADD_STATIC_CAPTION,7,7,198,24 #ifndef WIN16 CONTROL "",IDC_LDAP_ADD_STATIC_ETCHED2,"Static",SS_ETCHEDHORZ,7, 36,198,1 #endif // !WIN16 GROUPBOX "Directory services:",IDC_LDAP_ADD_STATIC_LABELLIST1,7, 43,198,138 PUSHBUTTON "&Add",IDC_LDAP_ADD_BUTTON_ADD,16,61,48,14 PUSHBUTTON "Remo&ve",IDC_LDAP_ADD_BUTTON_DELETE,16,80,48,14 PUSHBUTTON "P&roperties",IDC_LDAP_ADD_BUTTON_PROPERTIES,16,99,48,14 #ifndef WIN16 CONTROL "List1",IDC_LDAP_ADD_LIST_ALL,"SysListView32",LVS_LIST | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_TABSTOP,72,60,125,108, WS_EX_CLIENTEDGE #else CONTROL "List1",IDC_LDAP_ADD_LIST_ALL,"IE_SysListView",LVS_LIST | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_TABSTOP,72,60,125,108 #endif // !WIN16 END IDD_DIALOG_LDAP_PROPERTIES DIALOG DISCARDABLE 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg" #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN LTEXT "&Friendly Name:",IDC_LDAP_PROPS_STATIC_NAME_FRIENDLY,7, 29,60,8 EDITTEXT IDC_LDAP_PROPS_EDIT_NAME_FRIENDLY,80,27,125,14, ES_AUTOHSCROLL LTEXT "&Directory Server:",IDC_LDAP_PROPS_STATIC_NAME,7,46,65, 8 EDITTEXT IDC_LDAP_PROPS_EDIT_NAME,80,43,125,14,ES_AUTOHSCROLL GROUPBOX "&Authentication Type:",IDC_LDAP_PROPS_FRAME,7,64,198, 100,WS_GROUP CONTROL "A&nonymous",IDC_LDAP_PROPS_RADIO_ANON,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,17,77,125,10 CONTROL "&Secure Password (requires server support)", IDC_LDAP_PROPS_RADIO_SICILY,"Button",BS_AUTORADIOBUTTON, 17,88,181,10 CONTROL "Pass&word",IDC_LDAP_PROPS_RADIO_USERPASS,"Button", BS_AUTORADIOBUTTON,17,99,125,10 LTEXT "&User Name:",IDC_LDAP_PROPS_STATIC_USERNAME,17,116,40,8 EDITTEXT IDC_LDAP_PROPS_EDIT_USERNAME,80,112,118,14, ES_AUTOHSCROLL LTEXT "&Password:",IDC_LDAP_PROPS_STATIC_PASSWORD,17,131,40,8 EDITTEXT IDC_LDAP_PROPS_EDIT_PASSWORD,80,128,118,14,ES_PASSWORD | ES_AUTOHSCROLL LTEXT "&Confirm Password:",IDC_LDAP_PROPS_STATIC_PASSWORD2,17, 146,62,8 EDITTEXT IDC_LDAP_PROPS_EDIT_CONFIRMPASSWORD,80,144,118,14, ES_PASSWORD | ES_AUTOHSCROLL CONTROL "Chec&k names against this server when sending mail.", IDC_LDAP_PROPS_CHECK_NAMES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,171,181,10 LTEXT "Add or modify information about an LDAP directory service.", IDC_LDAP_PROPS_STATIC_CAPTION,7,7,198,10 #ifndef WIN16 CONTROL "",IDC_LDAP_PROPS_STATIC_ETCHED2,"Static",SS_ETCHEDHORZ, 8,21,197,1 #endif // !WIN16 END IDD_DIALOG_LDAP_PROPERTIES_ADVANCED DIALOG DISCARDABLE 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg" #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN GROUPBOX "Search Parameters:",IDC_LDAP_PROPS_FRAME2,7,7,198,71 LTEXT "&Search time-out (in seconds):", IDC_LDAP_PROPS_STATIC_SEARCH,16,28,132,8 EDITTEXT IDC_LDAP_PROPS_EDIT_SEARCH,162,26,35,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "&Maximum number of entries to return:", IDC_LDAP_PROPS_STATIC_NUMRESULTS,15,53,137,9 EDITTEXT IDC_LDAP_PROPS_EDIT_NUMRESULTS,162,50,35,14, ES_AUTOHSCROLL | ES_NUMBER GROUPBOX "Search &Base for this directory service", IDC_LDAP_PROPS_FRAME_ROOT,7,88,198,43 EDITTEXT IDC_LDAP_PROPS_EDIT_ROOT,15,106,182,14,ES_AUTOHSCROLL END #define IDC_LDAP_SEARCH_BUTTON_REMOVE 6470 #define IDC_LDAP_SEARCH_LIST_SELECTED 6471 #define IDC_LDAP_SEARCH_BUTTON_UP 6472 #define IDC_LDAP_SEARCH_BUTTON_DOWN 6473 #define IDC_LDAP_SEARCH_STATIC_COUNTRY 6474 #define IDC_LDAP_SEARCH_COMBO_COUNTRY 6475 #define IDC_LDAP_SEARCH_STATIC_ETCHED2 6476 #define IDC_LDAP_SEARCH_STATIC_LABELLIST2 6477 #define IDC_LDAP_SEARCH_FRAME 6478 #define IDC_LDAP_SEARCH_STATIC_CAPTION 6479 #define IDC_LDAP_SEARCH_STATIC_LABELLIST1 6480 #define IDC_LDAP_SEARCH_LIST_DS 6481 #define IDC_LDAP_SEARCH_BUTTON_SELECT 6482 #define IDC_LDAP_ADD_BUTTON_ADD 5579 #define IDC_LDAP_ADD_BUTTON_DELETE 5580 #define IDC_LDAP_ADD_STATIC_CAPTION 5581 #define IDC_LDAP_ADD_BUTTON_PROPERTIES 5582 #define IDC_LDAP_ADD_STATIC_LABELLIST1 5583 #define IDC_LDAP_ADD_STATIC_ETCHED2 5584 #define IDC_LDAP_ADD_LIST_ALL 5585 #define IDC_LDAP_PROPS_STATIC_PASSWORD 5586 #define IDC_LDAP_PROPS_EDIT_CONNECTION 5587 #define IDC_LDAP_PROPS_EDIT_SEARCH 5588 #define IDC_LDAP_PROPS_EDIT_NAME 5589 #define IDC_LDAP_PROPS_EDIT_NUMRESULTS 5590 #define IDC_LDAP_PROPS_FRAME 5591 #define IDC_LDAP_PROPS_FRAME2 5592 #define IDC_LDAP_PROPS_STATIC_CONNECTION 5593 #define IDC_LDAP_PROPS_STATIC_SEARCH 5594 #define IDC_LDAP_PROPS_STATIC_NUMRESULTS 5595 #define IDC_LDAP_PROPS_EDIT_USERNAME 5596 #define IDC_LDAP_PROPS_EDIT_PASSWORD 5597 #define IDC_LDAP_PROPS_STATIC_NAME 5598 #define IDC_LDAP_PROPS_RADIO_ANON 5599 #define IDC_LDAP_PROPS_RADIO_SICILY 5600 #define IDC_LDAP_PROPS_RADIO_USERPASS 5601 #define IDC_LDAP_PROPS_STATIC_USERNAME 5602 #define IDC_LDAP_PROPS_FRAME_NUMRESULTS 5603 #define IDC_LDAP_PROPS_STATIC_PASSWORD2 5604 #define IDC_LDAP_PROPS_EDIT_CONFIRMPASSWORD 5605 #define IDC_LDAP_PROPS_CHECK_NAMES 5606 #define IDC_LDAP_PROPS_EDIT_ROOT 5608 #define IDD_DIALOG_LDAP_PROPERTIES_ADVANCED 5609 #define IDC_LDAP_PROPS_STATIC_NAME_FRIENDLY 5610 #define IDC_LDAP_PROPS_EDIT_NAME_FRIENDLY 5611 #define IDC_LDAP_PROPS_FRAME_ROOT 5612 #define IDC_LDAP_PROPS_RADIO_DEFAULTBASE 5613 #define IDC_LDAP_PROPS_RADIO_OTHERBASE 5614 #define IDD_DIALOG_LDAP_PROPERTIES 5540 #define IDD_DIALOG_LDAP_SEARCH 5541 #define IDD_DIALOG_LDAP_ADD 5542 #define IDC_LDAP_PROPS_STATIC_CAPTION 65 #define IDC_LDAP_PROPS_STATIC_ETCHED2 66 IDD_DIALOG_LDAP_SEARCH DIALOGEX 0, 0, 212, 188 STYLE DS_MODALFRAME | WS_POPUP #ifndef WIN16 FONT 8, "MS Shell Dlg", 0, 0, 0x1 #else FONT 8, "MS Sans Serif" #endif // !WIN16 BEGIN LTEXT "If you have chosen to check names against one or more directory services, the directory services will be accessed in the order shown in the list below. Use the up and down buttons to change this order.", IDC_LDAP_SEARCH_STATIC_CAPTION,16,21,181,35 GROUPBOX "&Change check names order:",IDC_LDAP_SEARCH_FRAME,7,6, 198,162 #ifndef WIN16 CONTROL "List1",IDC_LDAP_SEARCH_LIST_SELECTED,"SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_TABSTOP,16,69,124,77, WS_EX_CLIENTEDGE #else CONTROL "List1",IDC_LDAP_SEARCH_LIST_SELECTED,"IE_SysListView", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_TABSTOP,16,69,124,77 #endif // !WIN16 PUSHBUTTON "&Up",IDC_LDAP_SEARCH_BUTTON_UP,148,115,49,14 PUSHBUTTON "&Down",IDC_LDAP_SEARCH_BUTTON_DOWN,148,132,49,14 END #endif // OLD_STUFF // LDAP_PROPERTIES #ifdef OLD_LDAP_UI extern HINSTANCE ghCommCtrlDLLInst; extern LPPROPERTYSHEET gpfnPropertySheet; enum _Propsheets { propMain=0, propOptions, propMAX }; enum _ReturnValues { DS_CANCEL=0, DS_OK, DS_ERROR }; // Whenever we add a new server, we put it in a linked list so we'll be able to // regress if the user hits cancel after adding a couple of entries typedef struct _NewServer { TCHAR szName[MAX_UI_STR]; struct _NewServer * lpNext; } NEW_SERVER, *LPNEW_SERVER; // Params passed to the property sheets typedef struct _DSUILV { HWND hWndMainLV; HWND hWndResolveOrderLV; int nRetVal; LPNEW_SERVER lpNewServerList; // if servers added and we hit cancel, we use this list to remove newly added servers LPNEW_SERVER lpOldServerList; // if servers modified and we hit ok, we use this list to remove old servers } DSUILV, * LPDSUILV; #define hlvM (lpdsuiLV->hWndMainLV) #define hlvR (lpdsuiLV->hWndResolveOrderLV) /* * Prototypes */ HRESULT HrInitLDAPListView(HWND hWndLV); void LDAPListAddItem(HWND hWndLV, LPTSTR lpszItemText); BOOL ReadLDAPServers(HWND hWndLV, LPTSTR szValueName); void DeleteLDAPServers(HWND hDlg); void ProcessOKMessage(HWND hDlg, LPDSUILV lpdsuiLV, int nPropSheet); void MoveLDAPItemUpDown(HWND hDlg, BOOL bMoveUp); BOOL SetDSUI(HWND hDlg,int nPropSheet, LPDSUILV lpdsuiLV); BOOL FillDSUI(HWND hDlg,int nPropSheet, LPDSUILV lpdsuiLV); int CreateDSPropSheets(HWND hwndOwner, LPDSUILV lpdsuiLV); BOOL APIENTRY_16 fnDSMainProc(HWND hDlg,UINT message,UINT wParam,LPARAM lParam); BOOL APIENTRY_16 fnDSOptionsProc(HWND hDlg,UINT message,UINT wParam,LPARAM lParam); void SetUpDownButtons(HWND hDlg, HWND hWndLV); BOOL SynchronizeLVContentsForward(HWND hDlg, LPDSUILV lpdsuiLV); BOOL SynchronizeLVContentsBackward(HWND hDlg, LPDSUILV lpdsuiLV); void ShowDSProps(HWND hDlg, BOOL bAddNew, LPDSUILV lpdsuiLV); BOOL ReadLDAPServerKey(HWND hWndLV, LPTSTR szValueName); void WriteLDAPServerKey(HWND hWndLV, LPTSTR szValueName); // Help IDs static DWORD rgDsMainHelpIDs[] = { IDC_LDAP_ADD_STATIC_LABELLIST1, IDH_WABLDAP_DIR_SER_LIST, IDC_LDAP_ADD_LIST_ALL, IDH_WABLDAP_DIR_SER_LIST, IDC_LDAP_ADD_BUTTON_ADD, IDH_WABLDAP_GEN_ADD, IDC_LDAP_ADD_BUTTON_DELETE, IDH_WABLDAP_GEN_REMOVE, IDC_LDAP_ADD_BUTTON_PROPERTIES, IDH_WABLDAP_GEN_PROPERTIES, 0,0 }; static DWORD rgDsOptHelpIDs[] = { IDC_LDAP_SEARCH_STATIC_LABELLIST2, IDH_WABLDAP_OPT_DIRSERV_CHECK_AGAINST, IDC_LDAP_SEARCH_LIST_SELECTED, IDH_WABLDAP_OPT_DIRSERV_CHECK_AGAINST, IDC_LDAP_SEARCH_BUTTON_UP, IDH_WABLDAP_OPT_UP, IDC_LDAP_SEARCH_BUTTON_DOWN, IDH_WABLDAP_OPT_DOWN, 0,0 }; //$$/////////////////////////////////////////////////////////////////////////////// // // HrShowDirectoryServiceModificationDlg - Shows the main dialog with the list // of directory services and with a prop sheet for changing check order // // hWndParent - Parent for this dialog ///////////////////////////////////////////////////////////////////////////////// HRESULT HrShowDirectoryServiceModificationDlg(HWND hWndParent) { ACCTLISTINFO ali; HRESULT hr = hrSuccess; #ifdef OLD_LDAP_UI DSUILV dsuiLV = {0}; #endif // OLD_LDAP_UI IImnAccountManager * lpAccountManager; #ifdef OLD_LDAP_UI if (NULL == ghCommCtrlDLLInst) { hr = ResultFromScode(MAPI_E_UNCONFIGURED); goto out; } #endif // OLD_LDAP_UI // Make sure there is an account manager if (hr = InitAccountManager(&lpAccountManager)) { ShowMessageBox(hWndParent, idsLDAPUnconfigured, MB_ICONEXCLAMATION | MB_OK); goto out; } ali.cbSize = sizeof(ACCTLISTINFO); ali.AcctTypeInit = (ACCTTYPE)-1; ali.dwAcctFlags = ACCT_FLAG_DIR_SERV; ali.dwFlags = 0; hr = lpAccountManager->lpVtbl->AccountListDialog(lpAccountManager, hWndParent, &ali); #ifdef OLD_LDAP_UI dsuiLV.nRetVal = DS_ERROR; dsuiLV.lpNewServerList = NULL; dsuiLV.lpOldServerList = NULL; // show dialog if(-1 == CreateDSPropSheets(hWndParent,&dsuiLV)) { DebugPrintError(("Directory Service dialog failed\n")); hr = E_FAIL; goto out; } // Free any allocated memory while(dsuiLV.lpNewServerList) { LPNEW_SERVER lpTemp = dsuiLV.lpNewServerList; dsuiLV.lpNewServerList = lpTemp->lpNext; if(dsuiLV.nRetVal == DS_CANCEL) SetLDAPServerParams(lpTemp->szName, NULL); LocalFree(lpTemp); } // Free any allocated memory while(dsuiLV.lpOldServerList) { LPNEW_SERVER lpTemp = dsuiLV.lpOldServerList; dsuiLV.lpOldServerList = lpTemp->lpNext; if(dsuiLV.nRetVal == DS_OK) SetLDAPServerParams(lpTemp->szName, NULL); LocalFree(lpTemp); } switch(dsuiLV.nRetVal) { case DS_CANCEL: hr = MAPI_E_USER_CANCEL; break; case DS_OK: hr = S_OK; break; case DS_ERROR: hr = E_FAIL; break; } #endif // OLD_LDAP_UI out: return hr; } #ifdef OLD_LDAP_UI #define m_lpDSUILV ((LPDSUILV) pps->lParam) #define m_hWndMainLV (m_lpDSUILV->hWndMainLV) #define m_hWndResolveOrderLV (m_lpDSUILV->hWndResolveOrderLV) #define m_nRetVal (m_lpDSUILV->nRetVal) /*//$$*********************************************************************** * FUNCTION: fnDSMainProc * * PURPOSE: Window proc for property sheet ... * ****************************************************************************/ BOOL APIENTRY_16 fnDSMainProc(HWND hDlg,UINT message,UINT wParam,LPARAM lParam) { PROPSHEETPAGE * pps; BOOL bRet = FALSE; ULONG ulcPropCount = 0; pps = (PROPSHEETPAGE *) GetWindowLong(hDlg, DWL_USER); switch(message) { case WM_INITDIALOG: // Save the lparam for later use SetWindowLong(hDlg,DWL_USER,lParam); pps = (PROPSHEETPAGE *) lParam; // Setup the UI SetDSUI(hDlg,propMain,m_lpDSUILV); // Fill in the UI FillDSUI(hDlg,propMain,m_lpDSUILV); return TRUE; case WM_HELP: #ifndef WIN16 WinHelp( ((LPHELPINFO)lParam)->hItemHandle, g_szWABHelpFileName, HELP_WM_HELP, (DWORD)(LPSTR) rgDsMainHelpIDs ); #else WinHelp( hDlg, g_szWABHelpFileName, HELP_CONTENTS, 0L ); #endif // !WIN16 break; #ifndef WIN16 case WM_CONTEXTMENU: WinHelp((HWND) wParam, g_szWABHelpFileName, HELP_CONTEXTMENU, (DWORD)(LPVOID) rgDsMainHelpIDs ); break; #endif // !WIN16 case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam,lParam)) { case IDCANCEL: // This is a windows bug that prevents ESC canceling prop sheets // which have MultiLine Edit boxes KB: Q130765 SendMessage(GetParent(hDlg),message,wParam,lParam); break; case IDC_LDAP_ADD_BUTTON_DELETE: DeleteLDAPServers(hDlg); break; case IDC_LDAP_ADD_BUTTON_ADD: ShowDSProps(hDlg, TRUE, m_lpDSUILV); break; case IDC_LDAP_ADD_BUTTON_PROPERTIES: ShowDSProps(hDlg, FALSE, m_lpDSUILV); break; } break; case WM_NOTIFY: switch(((NMHDR FAR *)lParam)->code) { case PSN_SETACTIVE: //initialize SynchronizeLVContentsBackward(hDlg, m_lpDSUILV); break; case PSN_APPLY: //ok ProcessOKMessage(hDlg,m_lpDSUILV,propMain); m_nRetVal = DS_OK; break; case PSN_KILLACTIVE: //Losing activation to another page break; case PSN_RESET: //cancel m_nRetVal = DS_CANCEL; break; } switch((int) wParam) { case IDC_LDAP_ADD_LIST_ALL: switch(((NM_LISTVIEW *)lParam)->hdr.code) { case LVN_KEYDOWN: switch(((LV_KEYDOWN FAR *) lParam)->wVKey) { case VK_DELETE: SendMessage (hDlg, WM_COMMAND, (WPARAM) IDC_LDAP_ADD_BUTTON_DELETE, 0); return 0; break; } break; case NM_DBLCLK: SendMessage (hDlg, WM_COMMAND, (WPARAM) IDC_LDAP_ADD_BUTTON_PROPERTIES, 0); return 0; break; } break; } return TRUE; } return bRet; } /*//$$*********************************************************************** * FUNCTION: fnDSOptionsProc * * PURPOSE: Window proc for property sheet ... * ****************************************************************************/ BOOL APIENTRY_16 fnDSOptionsProc(HWND hDlg,UINT message,UINT wParam,LPARAM lParam) { PROPSHEETPAGE * pps; BOOL bRet = FALSE; int CtlID = 0; //used to determine which required field in the UI has not been set pps = (PROPSHEETPAGE *) GetWindowLong(hDlg, DWL_USER); switch(message) { case WM_INITDIALOG: SetWindowLong(hDlg,DWL_USER,lParam); pps = (PROPSHEETPAGE *) lParam; SetDSUI(hDlg,propOptions,m_lpDSUILV); FillDSUI(hDlg,propOptions,m_lpDSUILV); return TRUE; case WM_HELP: #ifndef WIN16 WinHelp( ((LPHELPINFO)lParam)->hItemHandle, g_szWABHelpFileName, HELP_WM_HELP, (DWORD)(LPSTR) rgDsOptHelpIDs ); #else WinHelp( hDlg, g_szWABHelpFileName, HELP_CONTENTS, 0L ); #endif // !WIN16 break; #ifndef WIN16 case WM_CONTEXTMENU: WinHelp((HWND) wParam, g_szWABHelpFileName, HELP_CONTEXTMENU, (DWORD)(LPVOID) rgDsOptHelpIDs ); break; #endif // !WIN16 case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam,lParam)) { case IDCANCEL: // This is a windows bug that prevents ESC canceling prop sheets // which have MultiLine Edit boxes KB: Q130765 SendMessage(GetParent(hDlg),message,wParam,lParam); break; case IDC_LDAP_SEARCH_BUTTON_UP: MoveLDAPItemUpDown(hDlg, TRUE); break; case IDC_LDAP_SEARCH_BUTTON_DOWN: MoveLDAPItemUpDown(hDlg, FALSE); break; } break; case WM_NOTIFY: switch(((NMHDR FAR *)lParam)->code) { case PSN_SETACTIVE: //initialize SynchronizeLVContentsForward(hDlg, m_lpDSUILV); break; case PSN_APPLY: //ok ProcessOKMessage(hDlg,m_lpDSUILV,propOptions); break; case PSN_KILLACTIVE: //Losing activation to another page break; case PSN_RESET: //cancel // lpLSP->nRetVal = DL_CANCEL; break; } return TRUE; } return bRet; } /*//$$*************************************************************************** * FUNCTION: CreateDSPropSheets(HWND) * * PURPOSE: Creates the DL property sheet * ****************************************************************************/ int CreateDSPropSheets( HWND hwndOwner, LPDSUILV lpdsuiLV ) { PROPSHEETPAGE psp[propMAX]; PROPSHEETHEADER psh; TCHAR szBuf[propMAX][MAX_UI_STR]; TCHAR szBuf2[MAX_UI_STR]; psp[propMain].dwSize = sizeof(PROPSHEETPAGE); psp[propMain].dwFlags = PSP_USETITLE; psp[propMain].hInstance = hinstMapiX; psp[propMain].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_LDAP_ADD); psp[propMain].pszIcon = NULL; psp[propMain].pfnDlgProc = (DLGPROC) fnDSMainProc; LoadString(hinstMapiX, idsGeneral, szBuf[propMain], sizeof(szBuf[propMain])); psp[propMain].pszTitle = szBuf[propMain]; psp[propMain].lParam = (LPARAM) lpdsuiLV; psp[propOptions].dwSize = sizeof(PROPSHEETPAGE); psp[propOptions].dwFlags = PSP_USETITLE; psp[propOptions].hInstance = hinstMapiX; psp[propOptions].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_LDAP_SEARCH); psp[propOptions].pszIcon = NULL; psp[propOptions].pfnDlgProc = (DLGPROC) fnDSOptionsProc; LoadString(hinstMapiX, idsOptions, szBuf[propOptions], sizeof(szBuf[propMain])); psp[propOptions].pszTitle = szBuf[propOptions]; psp[propOptions].lParam = (LPARAM) lpdsuiLV; psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW; psh.hwndParent = hwndOwner; psh.hInstance = hinstMapiX; psh.pszIcon = NULL; LoadString(hinstMapiX, idsDirectoryServices, szBuf2, sizeof(szBuf2)); psh.pszCaption = szBuf2; psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.nStartPage = propMain; psh.ppsp = (LPCPROPSHEETPAGE) &psp; return (gpfnPropertySheet(&psh)); } //$$/////////////////////////////////////////////////////////////////////////////// // // SetDSUI - Sets the prop sheet UI // // hDlg - Parent HWND // nPropSheet - Identifies the prop sheet being set // lpdsuiLV - Dialog param info // ///////////////////////////////////////////////////////////////////////////////// BOOL SetDSUI(HWND hDlg,int nPropSheet,LPDSUILV lpdsuiLV) { ULONG i =0; // Set the font of all the children to the default GUI font EnumChildWindows( hDlg, SetChildDefaultGUIFont, (LPARAM) 0); switch(nPropSheet) { case propMain: lpdsuiLV->hWndMainLV = GetDlgItem(hDlg, IDC_LDAP_ADD_LIST_ALL); // Initialize the list view that displays the list of LDAP servers HrInitLDAPListView(lpdsuiLV->hWndMainLV); break; case propOptions: lpdsuiLV->hWndResolveOrderLV = GetDlgItem(hDlg, IDC_LDAP_SEARCH_LIST_SELECTED); // Initialize the list view that displays the list of LDAP servers HrInitLDAPListView(lpdsuiLV->hWndResolveOrderLV); break; } return TRUE; } //$$/////////////////////////////////////////////////////////////////////////////// // // FillDSUI - Fills in the UI fields with the given data // // hDlg - HWND of parent // nPropSheet - identifies prop sheet being modified // lpdsuiLV - lParam from dialog // ///////////////////////////////////////////////////////////////////////////////// BOOL FillDSUI(HWND hDlg,int nPropSheet,LPDSUILV lpdsuiLV) { HWND hWndLV = NULL; switch(nPropSheet) { case propMain: hWndLV = GetDlgItem(hDlg, IDC_LDAP_ADD_LIST_ALL); // Read all the registered LDAP servers from the registry into // this list view ReadLDAPServerKey(hWndLV, szAllLDAPServersValueName); if(ListView_GetItemCount(hWndLV) <= 0) { EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_DELETE),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_PROPERTIES),FALSE); EnableWindow(hWndLV,FALSE); } else { EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_DELETE),TRUE); EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_PROPERTIES),TRUE); EnableWindow(hWndLV,TRUE); } SetFocus(GetNextDlgTabItem(hDlg, GetDlgItem(hDlg, IDC_LDAP_ADD_STATIC_CAPTION), FALSE)); break; case propOptions: break; } return TRUE; } #endif #ifdef OLD_LDAP_UI //$$/////////////////////////////////////////////////////////////////////////////// // // DeleteLDAPServers - Deletes LDAP server entries form the Directory Services list // // hDlg - HWND of dialog // ///////////////////////////////////////////////////////////////////////////////// void DeleteLDAPServers(HWND hDlg) { HWND hWndLV = GetDlgItem(hDlg,IDC_LDAP_ADD_LIST_ALL); TCHAR szBuf[MAX_UI_STR]; SendMessage(hWndLV, WM_SETREDRAW, (WPARAM) FALSE, 0); if(ListView_GetSelectedCount(hWndLV) > 0) { int iItemIndex = 0; if(IDYES == ShowMessageBox(hDlg, idsQuestionServerDeletion, MB_ICONEXCLAMATION | MB_YESNO)) { while(ListView_GetSelectedCount(hWndLV) > 0) { iItemIndex = ListView_GetNextItem(hWndLV, -1, LVNI_SELECTED); szBuf[0]='\0'; ListView_GetItemText(hWndLV,iItemIndex,0,szBuf,sizeof(szBuf)); // Delete the registry key corerspnding to this entry if(lstrlen(szBuf)) SetLDAPServerParams(szBuf,NULL); // Delete the item from the list view ListView_DeleteItem(hWndLV, iItemIndex); } EnableWindow(GetDlgItem(GetParent(hDlg), IDCANCEL), FALSE); } if(ListView_GetItemCount(hWndLV) <= 0) { // no entries left EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_DELETE),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_PROPERTIES),FALSE); EnableWindow(hWndLV,FALSE); SendMessage(GetParent(hDlg), DM_SETDEFID, IDOK, 0); SetFocus(GetDlgItem(GetParent(hDlg),IDOK)); } else { // some entries left - select the one closest to the last deleted ... if(ListView_GetSelectedCount(hWndLV) <= 0) { if(iItemIndex >= ListView_GetItemCount(hWndLV)) iItemIndex--; LVSelectItem(hWndLV, iItemIndex); } } } else ShowMessageBox(hDlg, idsSelectServersToDelete, MB_ICONEXCLAMATION | MB_OK); SendMessage(hWndLV, WM_SETREDRAW, (WPARAM) TRUE, 0); return; } //$$/////////////////////////////////////////////////////////////////////////////// // // ProcessOKMessage - Processes the OK button being clicked // ///////////////////////////////////////////////////////////////////////////////// void ProcessOKMessage(HWND hDlg, LPDSUILV lpdsuiLV, int nPropSheet) { TCHAR szBuf[MAX_UI_STR]; switch(nPropSheet) { case propMain: SynchronizeLVContentsBackward(hDlg, lpdsuiLV); WriteLDAPServerKey(hlvM, szAllLDAPServersValueName); break; case propOptions: break; } return; } //$$//////////////////////////////////////////////////////////////////// // // MoveLDAPitemUpDown - moves a selected item up or down in the list // //////////////////////////////////////////////////////////////////////// void MoveLDAPItemUpDown(HWND hDlg, BOOL bMoveUp) { HWND hWndLV = GetDlgItem(hDlg, IDC_LDAP_SEARCH_LIST_SELECTED); int iItemIndex = ListView_GetSelectedCount(hWndLV); int iListCount = ListView_GetItemCount(hWndLV); SendMessage(hWndLV, WM_SETREDRAW, (WPARAM) FALSE, 0); if( iItemIndex != 1) { ShowMessageBox(hDlg,idsSelectOneMoveUpDown,MB_ICONEXCLAMATION | MB_OK); } else { TCHAR szBufItem[MAX_UI_STR]; TCHAR szBufOtherItem[MAX_UI_STR]; int iMoveToIndex = 0; iItemIndex = ListView_GetNextItem(hWndLV, -1, LVNI_SELECTED); // Can't move beyond the first or last item if( ((iItemIndex == 0) && bMoveUp) || ((iItemIndex == (iListCount-1)) && !bMoveUp) ) goto out; iMoveToIndex = (bMoveUp) ? (iItemIndex - 1):(iItemIndex+1); // Basically since these list view items have no parameters of interest // other than the text, we can swap the text (looks cleaner) // Get the selected item text ListView_GetItemText(hWndLV, iItemIndex, 0, szBufItem, sizeof(szBufItem)); ListView_GetItemText(hWndLV, iMoveToIndex, 0, szBufOtherItem, sizeof(szBufOtherItem)); ListView_SetItemText(hWndLV, iMoveToIndex, 0, szBufItem); ListView_SetItemText(hWndLV, iItemIndex, 0, szBufOtherItem); LVSelectItem(hWndLV, iMoveToIndex); SetUpDownButtons(hDlg, hWndLV); } out: SendMessage(hWndLV, WM_SETREDRAW, (WPARAM) TRUE, 0); return; } //$$//////////////////////////////////////////////////////////////////////////////// // // SetUpDownButtons - Enables/Disables up and down buttons // //////////////////////////////////////////////////////////////////////////////////////// void SetUpDownButtons(HWND hDlg, HWND hWndLV) { int iItemCount = ListView_GetItemCount(hWndLV); int iSelectedItem = ListView_GetNextItem(hWndLV, -1, LVNI_SELECTED); HWND hWndUp = GetDlgItem(hDlg, IDC_LDAP_SEARCH_BUTTON_UP); HWND hWndDown = GetDlgItem(hDlg, IDC_LDAP_SEARCH_BUTTON_DOWN); DebugPrintTrace(("--SetUpDownButtons--\n")); if(iItemCount <= 0) { EnableWindow(hWndUp, FALSE); EnableWindow(hWndDown, FALSE); SetFocus(GetDlgItem(GetParent(hDlg),IDOK)); } else { EnableWindow(hWndUp, TRUE); EnableWindow(hWndDown, TRUE); } return; } //$$//////////////////////////////////////////////////////////////////////////////// // // SynchronizeLVContentsForward - this funciton attempts to synhronize the // List view contents between the various ListViews when going from main pane // to Options pane // //////////////////////////////////////////////////////////////////////////////////// BOOL SynchronizeLVContentsForward(HWND hDlg, LPDSUILV lpdsuiLV) { BOOL bRet = FALSE; int iItemIndex=0; // Basically we just want to enter all the entries with check names against them in // this list view SendMessage(hlvR, WM_SETREDRAW, (WPARAM) FALSE, 0); ListView_DeleteAllItems(hlvR); // // if there are no items in the original, wipe out and leave // if(ListView_GetItemCount(hlvM) <= 0) { EnableWindow(hlvR, FALSE); EnableWindow(GetDlgItem(hDlg, IDC_LDAP_SEARCH_BUTTON_UP), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_LDAP_SEARCH_BUTTON_DOWN), FALSE); bRet = TRUE; goto out; } else { // Look at all the items in the original one by one and if they have // the check names flag, enter them into hlvR int i,nIndex,nTotal; TCHAR szBuf[MAX_PATH]; EnableWindow(hlvR, TRUE); for(i = 0; i < ListView_GetItemCount(hlvM); i++) { ListView_GetItemText(hlvM, i, 0, szBuf, sizeof(szBuf)); if(lstrlen(szBuf)) { LDAPSERVERPARAMS ldsp = {0}; GetLDAPServerParams(szBuf, &(ldsp)); if(ldsp.fResolve) { // This is selected for resolving so we should add it to // the selected items list LDAPListAddItem(hlvR, szBuf); } FreeLDAPServerParams(ldsp); } } } LVSelectItem(hlvR, 0); SetUpDownButtons(hDlg, hlvR); bRet = TRUE; out: SendMessage(hlvR, WM_SETREDRAW, (WPARAM) TRUE, 0); return bRet; } //$$//////////////////////////////////////////////////////////////////////////////// // // ShowDSProps(HWND hDlg, BOOL bAddNew); // // Displays properties of a Directory Service or creates and adds a new one // //////////////////////////////////////////////////////////////////////////////////// void ShowDSProps(HWND hDlg, BOOL bAddNew, LPDSUILV lpdsuiLV) { TCHAR szBuf[MAX_UI_STR]; TCHAR szOldName[MAX_UI_STR]; int iItemIndex; HWND hWndLV = GetDlgItem(hDlg,IDC_LDAP_ADD_LIST_ALL); if(bAddNew) { szBuf[0]='\0'; } else { int iItemCount = ListView_GetSelectedCount(hWndLV); if (iItemCount > 1) { ShowMessageBox(hDlg, IDS_ADDRBK_MESSAGE_ACTION, MB_ICONINFORMATION | MB_OK); goto out; } else if(iItemCount == 0) { ShowMessageBox(hDlg, IDS_ADDRBK_MESSAGE_NO_ITEM, MB_ICONINFORMATION | MB_OK); goto out; } // by now we should only have 1 selection iItemIndex = ListView_GetNextItem(hWndLV, -1, LVNI_SELECTED); if(iItemIndex == -1) goto out; ListView_GetItemText(hWndLV, iItemIndex, 0, szBuf, sizeof(szBuf)); if(!lstrlen(szBuf)) goto out; } // Save the old name just in case we need it ... (eg. user modifies the name in the props) lstrcpy(szOldName,szBuf); if(!HR_FAILED(HrShowDSProps(hDlg,szBuf,bAddNew))) { if(bAddNew) { // Add this new string to the main list box if(lstrlen(szBuf)) LDAPListAddItem(hWndLV, szBuf); // At this point of time, the new entry has been saved in the // registry. If the user now hits cancel, we want to remove // the newly entered entry from the registry so that it doesnt // show up later. To do this, we store a list of all newly added // names. { LPNEW_SERVER lpTemp = LocalAlloc(LMEM_ZEROINIT, sizeof(NEW_SERVER)); if(lpTemp) { lpTemp->lpNext = lpdsuiLV->lpNewServerList; lstrcpy(lpTemp->szName, szBuf); lpdsuiLV->lpNewServerList = lpTemp; } } } else { if(lstrcmpi(szOldName, szBuf)) { // update the old name in the list ... ListView_SetItemText(hWndLV, iItemIndex, 0, szBuf); // At this point of time, the old entry name has been modified and we // have two keys in the registry - the old one and the new one // If the user hits cancel we want to remove the new entries // If the user hits ok, we want to remove the old entries { LPNEW_SERVER lpTemp = LocalAlloc(LMEM_ZEROINIT, sizeof(NEW_SERVER)); if(lpTemp) { lpTemp->lpNext = lpdsuiLV->lpOldServerList; lstrcpy(lpTemp->szName, szOldName); lpdsuiLV->lpOldServerList = lpTemp; } } // // Again, we also want the new name of the entry so that if the user // hits cancel, we can revert back to the old name. // { LPNEW_SERVER lpTemp = LocalAlloc(LMEM_ZEROINIT, sizeof(NEW_SERVER)); if(lpTemp) { lpTemp->lpNext = lpdsuiLV->lpNewServerList; lstrcpy(lpTemp->szName, szBuf); lpdsuiLV->lpNewServerList = lpTemp; } } } } } if(ListView_GetItemCount(hWndLV) > 0) { EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_DELETE),TRUE); EnableWindow(GetDlgItem(hDlg,IDC_LDAP_ADD_BUTTON_PROPERTIES),TRUE); EnableWindow(hWndLV,TRUE); SendMessage(GetParent(hDlg), DM_SETDEFID, IDOK, 0); } out: return; } #endif #ifdef OLD_LDAP_UI //$$//////////////////////////////////////////////////////////////////////////////// // // SynchronizeLVContentsBackward(LPDSUILV lpdsuiLV) - this funciton attempts to synhronize the // List view contents between the various ListViews when going from Options pane // to main pane - basically what we want to do is to preserve the order of the // resolveNames list views ... when modifications have been made in the resolvenames // list view, we change the order of the main list view to reflect that change // //////////////////////////////////////////////////////////////////////////////////// BOOL SynchronizeLVContentsBackward(HWND hDlg, LPDSUILV lpdsuiLV) { BOOL bRet = FALSE; int i=0,iItemIndex=0; TCHAR szBuf[MAX_PATH]; if(!hlvR) { // Didnt go to the options pane // Leave things as they are bRet = TRUE; goto out; } // // Easy way to do this ... // Delete all the entries in hlvM that occur in hlvR and then add hlvR items one by one // SendMessage(hlvM, WM_SETREDRAW, (WPARAM) FALSE, 0); for(i = 0; i < ListView_GetItemCount(hlvR); i++) { ListView_GetItemText(hlvR, i, 0, szBuf, sizeof(szBuf)); if(lstrlen(szBuf)) { LV_FINDINFO lvfi = {0}; int iItemIndex; lvfi.flags = LVFI_STRING; lvfi.psz = szBuf; iItemIndex = ListView_FindItem(hlvM, -1, &lvfi); if(iItemIndex != -1) { ListView_DeleteItem(hlvM, iItemIndex); } } } for(i = 0; i < ListView_GetItemCount(hlvR); i++) { ListView_GetItemText(hlvR, i, 0, szBuf, sizeof(szBuf)); if(lstrlen(szBuf)) { LDAPListAddItem(hlvM, szBuf); } } LVSelectItem(hlvM, 0); bRet = TRUE; out: SendMessage(hlvM, WM_SETREDRAW, (WPARAM) TRUE, 0); return(bRet); } #endif // OLD_LDAP_UI //$$/////////////////////////////////////////////////////////////////////////////// // // LDAPListAddItem - adds an item to the LDAP list view controls // // hWndLV - HWND of List View // lpszItemText - Name of item to add to list view // ///////////////////////////////////////////////////////////////////////////////// void LDAPListAddItem(HWND hWndLV, LPTSTR lpszItemText) { LV_ITEM lvi = {0}; lvi.mask = LVIF_TEXT | LVIF_IMAGE; lvi.pszText = lpszItemText; lvi.iImage = imageDirectoryServer; lvi.iItem = ListView_GetItemCount(hWndLV); lvi.iSubItem = 0; ListView_InsertItem(hWndLV, &lvi); LVSelectItem(hWndLV, lvi.iItem); return; } /************************************************************************* //$$ // HrInitLDAPListView - Initializes the two list views on this dialog // so they look nice // // hWndLV - handle of list view // **************************************************************************/ HRESULT HrInitLDAPListView(HWND hWndLV) { HRESULT hr = hrSuccess; LV_COLUMN lvC; // list view column structure HIMAGELIST hSmall=NULL; DWORD dwLVStyle; ULONG nCols=0; ULONG index=0; if (!hWndLV) { hr = MAPI_E_INVALID_PARAMETER; goto out; } ListView_SetExtendedListViewStyle(hWndLV, LVS_EX_FULLROWSELECT); dwLVStyle = GetWindowLong(hWndLV,GWL_STYLE); if(dwLVStyle & LVS_EDITLABELS) SetWindowLong(hWndLV,GWL_STYLE,(dwLVStyle & ~LVS_EDITLABELS)); hSmall = gpfnImageList_LoadImage( hinstMapiX, MAKEINTRESOURCE(IDB_BITMAP_SMALL), S_BITMAP_WIDTH, 0, RGB_TRANSPARENT, IMAGE_BITMAP, 0); ListView_SetImageList (hWndLV, hSmall, LVSIL_SMALL); lvC.mask = LVCF_FMT | LVCF_WIDTH; lvC.fmt = LVCFMT_LEFT; // left-align column lvC.cx = 250; // - change this hardcoding lvC.pszText = NULL; lvC.iSubItem = 0; if (ListView_InsertColumn (hWndLV, 0, &lvC) == -1) { DebugPrintError(("ListView_InsertColumn Failed\n")); hr = E_FAIL; goto out; } out: return hr; } #endif // OLD_LDAP_UI #ifdef URL_CHAR_ESCAPING // URLs are filled with escape characters, we need to replace these // with regular characters ... // static const TCHAR szEsc1[]="%20"; static const TCHAR szEsc2[]="%3C"; static const TCHAR szEsc3[]="%3E"; static const TCHAR szEsc4[]="%23"; static const TCHAR szEsc5[]="%25"; static const TCHAR szEsc6[]="%7B"; static const TCHAR szEsc7[]="%7D"; static const TCHAR szEsc8[]="%7C"; static const TCHAR szEsc9[]="%74"; static const TCHAR szEsc10[]="%5E"; static const TCHAR szEsc11[]="%7E"; static const TCHAR szEsc12[]="%5B"; static const TCHAR szEsc13[]="%5D"; static const TCHAR szEsc14[]="%60"; #define MAX_ESC_CHAR 14 const TCHAR * szEsc[] = { szEsc1, szEsc2, szEsc3, szEsc4, szEsc5, szEsc6, szEsc7, szEsc8, szEsc9, szEsc10, szEsc11, szEsc12, szEsc13, szEsc14 }; const char cEscChar[] = { ' ', '<', '>', '#', '%', '{', '}', '|', '\\', '^', '~', '[', ']', '`' }; /* - - ReplaceURLIllegalChars - * Replaces illegal chars in a URL with escaped strings as per some RFC * Makes a copy of the input string and then copies it back onto the input string * Assumes that input string was big enough to handle all replacements */ void ReplaceURLIllegalChars(LPTSTR lpURL) { LPTSTR lpTemp = NULL,lp=NULL, lp1=NULL; int i = 0; if(!lpURL) return; if(!(lpTemp = LocalAlloc(LMEM_ZEROINIT, 2*lstrlen(lpURL)+1))) return; lstrcpy(lpTemp, lpURL); lp = lpURL; lp1 = lpTemp; while(lp && *lp) { for(i=0;i initialized account manager object. // hKeyServers = handle of old WAB/servers key // lpszServer = name of server to migrate // // RETURNS: none // //******************************************************************* void MigrateOldLDAPServer(IImnAccountManager * lpAccountManager, HKEY hKeyServers, LPTSTR lpszServer) { LDAPSERVERPARAMS spParams = {0}; DWORD dwErr, dwType, dwValue, dwSize; HKEY hKey = NULL; TCHAR szTemp[1]; LPBYTE lpbPassword = NULL; // Set defaults for each value spParams.dwSearchSizeLimit = LDAP_SEARCH_SIZE_LIMIT; spParams.dwSearchTimeLimit = LDAP_SEARCH_TIME_LIMIT; spParams.dwAuthMethod = LDAP_AUTH_METHOD_ANONYMOUS; spParams.lpszUserName = NULL; spParams.lpszPassword = NULL; spParams.lpszURL = NULL; spParams.lpszBase = NULL; spParams.lpszName = NULL; spParams.lpszLogoPath = NULL; spParams.fResolve = FALSE; spParams.dwID = 0xFFFFFFFF; // default to end spParams.dwPort = LDAP_DEFAULT_PORT; spParams.dwUseBindDN = 0; spParams.fSimpleSearch = FALSE; // Open the key for this LDAP server if (dwErr = RegOpenKeyEx(hKeyServers, lpszServer, 0, KEY_READ, &hKey)) { DebugTrace("Migrate couldn't open server key %s -> %u\n", lpszServer, dwErr); return; } // Read server ID dwErr = RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPServerID, &dwValue); if ((! dwErr) && dwValue) { spParams.dwID = dwValue; } else { spParams.dwID = GetLDAPNextServerID(0); } // Read server search size limit dwErr = RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPSearchSizeLimit, &dwValue); if ((! dwErr) && dwValue) { spParams.dwSearchSizeLimit = dwValue; } // Read server search time limit if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPSearchTimeLimit, &dwValue)) { spParams.dwSearchTimeLimit = dwValue; } // Read the authentication type if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPAuthMethod, &dwValue)) { spParams.dwAuthMethod = dwValue; } // Read username and password if auth type is LDAP_AUTH_METHOD_SIMPLE if (LDAP_AUTH_METHOD_SIMPLE == spParams.dwAuthMethod) { // Read the user name // BUGBUG: Should make a function out of this section for improved code size and readability! dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPAuthUserName, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszUserName = (LPTSTR)LocalAlloc(LPTR, dwSize + 1)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPAuthUserName, NULL, &dwType, spParams.lpszUserName, &dwSize); } } // BUGBUG: END // Read the password dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPAuthPassword, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (lpbPassword = (LPBYTE)LocalAlloc(LPTR, dwSize + 1)) { // Try again with sufficient buffer if (! (dwErr = RegQueryValueEx(hKey, (LPTSTR)szLDAPAuthPassword, NULL, &dwType, lpbPassword, &dwSize))) { // Decrypt the password EncryptDecryptText(lpbPassword, dwSize); lpbPassword[dwSize] = '\0'; spParams.lpszPassword = (LPTSTR)lpbPassword; } } } // If user name is missing, use anonymous authentication. if (NULL == spParams.lpszUserName) { spParams.dwAuthMethod = LDAP_AUTH_METHOD_ANONYMOUS; } } // Read Resolve flag if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPResolveFlag, &dwValue)) { spParams.fResolve = (BOOL)dwValue; } // Read the Search Base dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPSearchBase, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszBase = (LPTSTR)LocalAlloc(LPTR, dwSize + 1)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPSearchBase, NULL, &dwType, spParams.lpszBase, &dwSize); } } // Read the Server Name dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPServerName, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszName = (LPTSTR)LocalAlloc(LPTR, dwSize + 1)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPServerName, NULL, &dwType, spParams.lpszName, &dwSize); } } else { // use the given friendly name as the server name (this is for compatibility with when // we didnt have friendly names ... if (spParams.lpszName = (LPTSTR)LocalAlloc(LPTR, lstrlen(lpszServer) + 1)) { lstrcpy(spParams.lpszName, lpszServer); } } // Read the Server Info URL dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPServerInfoURL, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszURL = (LPTSTR)LocalAlloc(LPTR, dwSize)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPServerInfoURL, NULL, &dwType, spParams.lpszURL, &dwSize); } } // Read the Advanced Search Attributes dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPAdvancedSearchAttr, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszAdvancedSearchAttr = (LPTSTR)LocalAlloc(LPTR, dwSize)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPAdvancedSearchAttr, NULL, &dwType, spParams.lpszAdvancedSearchAttr, &dwSize); } } // Read the Server logo path dwSize = 1; // Expect ERROR_MORE_DATA if (RegQueryValueEx(hKey, (LPTSTR)szLDAPServerLogoPath, NULL, &dwType, szTemp, &dwSize) == ERROR_MORE_DATA) { // Allocate space for the string if (spParams.lpszLogoPath = (LPTSTR)LocalAlloc(LPTR, dwSize)) { // Try again with sufficient buffer RegQueryValueEx(hKey, (LPTSTR)szLDAPServerLogoPath, NULL, &dwType, spParams.lpszLogoPath, &dwSize); } } // Read the LDAP port if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPPort, &dwValue)) { spParams.dwPort = dwValue; } // Read the use Bind DN setting if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPUseBindDN, &dwValue)) { spParams.dwUseBindDN = dwValue; } // Read the Simple Search setting if (! RegQueryValueExDWORD(hKey, (LPTSTR)szLDAPSimpleSearch, &dwValue)) { spParams.fSimpleSearch = (dwValue ? TRUE : FALSE); } RegCloseKey(hKey); // Write it to the account manager SetLDAPServerParams( lpszServer, &spParams); // Delete the key // BUGBUG: Won't work if key has sub-keys! (It shouldn't) // IE4 - dont delete this setting as it is in HKLM // RegDeleteKey(hKeyServers, lpszServer); } //******************************************************************* // // FUNCTION: MigrateOldLDAPAccounts // // PURPOSE: Read in old WAB 3.0 LDAP account information, write // it to the account manager and delete it from the // registry. // // PARAMETERS: lpAccountManager -> initialized account manager object. // bMigrateOldWAB -> if TRUE migrates old wab settings from // a v1 installation. if FALSE, migrates new // accounts from HKLM setup during setup // RETURNS: none // //******************************************************************* void MigrateOldLDAPAccounts(IImnAccountManager * lpAccountManager, BOOL bMigrateOldWAB) { BOOL bRet = FALSE; HKEY hKeyWAB = NULL; HKEY hKeyServers = NULL; DWORD dwErr; DWORD dwType; DWORD dwSize; TCHAR szBuffer[512]; ULONG cbBuffer; DWORD dwValue = 0; ULONG ulSize; TCHAR szTemp[1]; LPBYTE lpbPassword; DWORD cMigrated = 0; LPTSTR szLDAPServers = NULL; HRESULT hResult = hrSuccess; DWORD dwIndex = 0; // How many rows to migrate? if (! (dwErr = RegOpenKeyEx((bMigrateOldWAB ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE), szWABKey, 0, KEY_ALL_ACCESS, &hKeyWAB))) { if (! RegOpenKeyEx(hKeyWAB, szLDAPServerPropsKey, 0, KEY_ALL_ACCESS, &hKeyServers)) { // There is a Servers key // First, read in any servers which are "ordered" ulSize = 1; // Expect ERROR_MORE_DATA if (dwErr = RegQueryValueEx(hKeyWAB, (LPTSTR)szAllLDAPServersValueName, NULL, &dwType, szTemp, &ulSize)) { if (dwErr == ERROR_MORE_DATA) { if (szLDAPServers = LocalAlloc(LPTR, ulSize)) { szLDAPServers[0] = '\0'; // init to empty string // Try again with sufficient buffer if (! RegQueryValueEx(hKeyWAB, szAllLDAPServersValueName, NULL, &dwType, szLDAPServers, &ulSize)) { DebugTrace("Found LDAP server registry key\n"); #ifdef OLD_STUFF switch (dwType) { case REG_BINARY: // Some thing (probably setup) has given us binary data. case REG_MULTI_SZ: break; default: // Ignore it DebugTrace("Bad value of %s in registry\n", szAllLDAPServersValueName); Assert(FALSE); break; } #endif // OLD_STUFF } while (szLDAPServers && *szLDAPServers) { MigrateOldLDAPServer(lpAccountManager, hKeyServers, szLDAPServers); cMigrated++; // move to next server in double null terminated string. szLDAPServers += (lstrlen(szLDAPServers) + 1); } LocalFreeAndNull(&szLDAPServers); // Get rid of the ordered servers key // BUG - Dont delete v1 info // RegDeleteValue(hKeyWAB, szAllLDAPServersValueName); } } dwErr = 0; } dwIndex = 0; // Then read in any extra servers while (dwErr == 0) { cbBuffer = sizeof(szBuffer); if (dwErr = RegEnumKeyEx(hKeyServers, dwIndex, szBuffer, // put server name here &cbBuffer, NULL, NULL, 0, NULL)) { break; // done } // Got a name, migrate it MigrateOldLDAPServer(lpAccountManager, hKeyServers, szBuffer); cMigrated++; dwIndex++; } if (cMigrated) { DebugTrace("Migrated %u LDAP server names from registry\n", cMigrated); } RegCloseKey(hKeyServers); } RegCloseKey(hKeyWAB); } } const LPTSTR szLDAPServersValueName = "LDAP Servers"; const LPTSTR szLDAPServerName = "Server Name"; const LPTSTR szLDAPServerInfoURL = "Server Information URL"; const LPTSTR szLDAPSearchBase = "Search Base"; const LPTSTR szLDAPServerPropsKey = "Server Properties"; const LPTSTR szLDAPSearchSizeLimit = "Search Size Limit"; const LPTSTR szLDAPSearchTimeLimit = "Search Time Limit"; const LPTSTR szLDAPServerLogoPath = "Logo"; const LPTSTR szLDAPClientSearchTimeout = "Client Search Timeout"; const LPTSTR szLDAPDefaultAuthMethod = "Default Authentication Method"; const LPTSTR szLDAPAuthMethod = "Authentication Method"; const LPTSTR szLDAPAuthUserName = "User Name"; const LPTSTR szLDAPAuthPassword = "Password"; const LPTSTR szLDAPResolveFlag = "Resolve"; const LPTSTR szLDAPServerID = "ServerID"; const LPTSTR szLDAPNextAvailableServerID = "Server ID"; const LPTSTR szLDAPPort = "Port"; const LPTSTR szLDAPUseBindDN = "Bind DN"; const LPTSTR szLDAPSimpleSearch = "Simple Search"; const LPTSTR szLDAPAdvancedSearchAttr = "Advanced Search Attributes"; extern const LPTSTR szLDAPServersValueName; extern const LPTSTR szLDAPServerPropsKey; extern const LPTSTR szLDAPSearchSizeLimit; extern const LPTSTR szLDAPSearchTimeLimit; extern const LPTSTR szLDAPClientSearchTimeout; extern const LPTSTR szLDAPDefaultAuthMethod; extern const LPTSTR szLDAPAuthMethod; extern const LPTSTR szLDAPAuthUserName; extern const LPTSTR szLDAPAuthPassword; extern const LPTSTR szLDAPResolveFlag; extern const LPTSTR szLDAPServerName; extern const LPTSTR szLDAPServerInfoURL; extern const LPTSTR szLDAPServerLogoPath; extern const LPTSTR szLDAPSearchBase; extern const LPTSTR szLDAPNextAvailableServerID; extern const LPTSTR szLDAPServerID; extern const LPTSTR szLDAPPort; extern const LPTSTR szLDAPUseBindDN; extern const LPTSTR szLDAPSimpleSearch; extern const LPTSTR szLDAPAdvancedSearchAttr; #endif #ifdef mutil_c #ifdef OLD_STUFF /*************************************************************************** Name : ReleaseAndNull Purpose : Releases an object and NULLs the pointer Parameters: lppv = pointer to pointer to object to release Returns : void Comment : Remember to pass in the pointer to the pointer. The compiler is not smart enough to tell if you are doing this right or not, but you will know at runtime! BUGBUG: Make this fastcall! ***************************************************************************/ void __fastcall ReleaseAndNull(LPVOID * lppv) { LPUNKNOWN * lppunk = (LPUNKNOWN *)lppv; if (lppunk) { if (*lppunk) { HRESULT hResult; if (hResult = (*lppunk)->lpVtbl->Release(*lppunk)) { DebugTrace("Release(%x) -> %s\n", *lppunk, SzDecodeScode(GetScode(hResult))); } *lppunk = NULL; } } } /*************************************************************************** Name : MergeProblemArrays Purpose : Merge a problem array into another Parameters: lpPaDest -> destination problem array lpPaSource -> source problem array cDestMax = total number of problem slots in lpPaDest. This includes those in use (lpPaDest->cProblem) and those not yet in use. Returns : none Comment : ***************************************************************************/ void MergeProblemArrays(LPSPropProblemArray lpPaDest, LPSPropProblemArray lpPaSource, ULONG cDestMax) { ULONG i, j; ULONG cDest; ULONG cDestRemaining; cDest = lpPaDest->cProblem; cDestRemaining = cDestMax - cDest; // Loop through the source problems, copying the non-duplicates into dest for (i = 0; i < lpPaSource->cProblem; i++) { // Search the Dest problem array for the same property for (j = 0; j < cDest; j++) { // should just compare PROP_IDs here, since we may be overwriting // some of the proptypes with PT_NULL elsewhere. if (PROP_ID(lpPaSource->aProblem[i].ulPropTag) == PROP_ID(lpPaDest->aProblem[j].ulPropTag)) { break; // Found a match, don't copy this one. Move along. } } if (j == lpPaDest->cProblem) { Assert(cDestRemaining); if (cDestRemaining) { // No matches, copy this problem from Source to Dest lpPaDest->aProblem[lpPaDest->cProblem++] = lpPaSource->aProblem[i]; cDestRemaining--; } else { DebugTrace("MergeProblemArrays ran out of problem slots!\n"); } } } } /*************************************************************************** Name : MapObjectNamedProps Purpose : Map the named properties WAB cares about into the object. Parameters: lpmp -> IMAPIProp object lppPropTags -> returned array of property tags. Note: Must be MAPIFreeBuffer'd by caller. Returns : none Comment : What a pain in the butt! We could conceivably improve performance here by caching the returned table and comparing the object's PR_MAPPING_SIGNATURE against the cache. ***************************************************************************/ HRESULT MapObjectNamedProps(LPMAPIPROP lpmp, LPSPropTagArray * lppPropTags) { static GUID guidWABProps = { /* efa29030-364e-11cf-a49b-00aa0047faa4 */ 0xefa29030, 0x364e, 0x11cf, {0xa4, 0x9b, 0x00, 0xaa, 0x00, 0x47, 0xfa, 0xa4} }; ULONG i; LPMAPINAMEID lppmnid[eMaxNameIDs] = {NULL}; MAPINAMEID rgmnid[eMaxNameIDs] = {0}; HRESULT hResult = hrSuccess; // Loop through each property, setting up the NAME ID structures for (i = 0; i < eMaxNameIDs; i++) { rgmnid[i].lpguid = &guidWABProps; rgmnid[i].ulKind = MNID_STRING; // Unicode String rgmnid[i].Kind.lpwstrName = rgPropNames[i]; lppmnid[i] = &rgmnid[i]; } if (hResult = lpmp->lpVtbl->GetIDsFromNames(lpmp, eMaxNameIDs, // how many? lppmnid, MAPI_CREATE, // create them if they don't already exist lppPropTags)) { if (HR_FAILED(hResult)) { DebugTrace("GetIDsFromNames -> %s\n", SzDecodeScode(GetScode(hResult))); goto exit; } else { DebugTrace("GetIDsFromNames -> %s\n", SzDecodeScode(GetScode(hResult))); } } Assert((*lppPropTags)->cValues == eMaxNameIDs); DebugTrace("PropTag\t\tType\tProp Name\n"); // Loop through the property tags, filling in their property types. for (i = 0; i < eMaxNameIDs; i++) { (*lppPropTags)->aulPropTag[i] = CHANGE_PROP_TYPE((*lppPropTags)->aulPropTag[i], PROP_TYPE(rgulNamedPropTags[i])); #ifdef DEBUG { TCHAR szBuffer[257]; WideCharToMultiByte(CP_ACP, 0, rgPropNames[i], -1, szBuffer, 257, NULL, NULL); DebugTrace("%08x\t%s\t%s\n", (*lppPropTags)->aulPropTag[i], PropTypeString(PROP_TYPE((*lppPropTags)->aulPropTag[i])), szBuffer); } #endif } exit: return(hResult); } /*************************************************************************** Name : PreparePropTagArray Purpose : Prepare a prop tag array by replacing placeholder props tags with their named property tags. Parameters: ptaStatic = static property tag array (input) pptaReturn -> returned prop tag array (output) pptaNamedProps -> returned array of named property tags Three possibilities here: + NULL pointer: no input PTA or output named props PTA is returned. This is less efficient since it must call MAPI to get the named props array. + good pointer to NULL pointer: no input PTA, but will return a good PTA of named props which can be used in later calls on this object for faster operation. + good pointer to good pointer. Use the input PTA instead of calling MAPI to map props. Returned contents must be freed with MAPIFreeBuffer. lpObject = object that the properties apply to. Required if no input *pptaNamedProps is supplied, otherwise, NULL. Returns : HRESULT Comment : ***************************************************************************/ HRESULT PreparePropTagArray(LPSPropTagArray ptaStatic, LPSPropTagArray * pptaReturn, LPSPropTagArray * pptaNamedProps, LPMAPIPROP lpObject) { HRESULT hResult = hrSuccess; ULONG cbpta; LPSPropTagArray ptaTemp = NULL; LPSPropTagArray ptaNamedProps; ULONG i; if (pptaNamedProps) { // input Named Props PTA ptaNamedProps = *pptaNamedProps; } else { ptaNamedProps = NULL; } if (! ptaNamedProps) { if (! lpObject) { DebugTrace("PreoparePropTagArray both lpObject and ptaNamedProps are NULL\n"); hResult = ResultFromScode(E_INVALIDARG); goto exit; } // Map the property names into the object if (hResult = MapObjectNamedProps(lpObject, &ptaTemp)) { DebugTrace("PreoparePropTagArray both lpObject and ptaNamedProps are NULL\n"); goto exit; } } if (pptaReturn) { // Allocate a return pta cbpta = sizeof(SPropTagArray) + ptaStatic->cValues * sizeof(ULONG); if ((*pptaReturn = WABAlloc(cbpta)) == NULL) { DebugTrace("PreparePropTagArray WABAlloc(%u) failed\n", cbpta); hResult = ResultFromScode(E_OUTOFMEMORY); goto exit; } (*pptaReturn)->cValues = ptaStatic->cValues; // Walk through the ptaStatic looking for named property placeholders. for (i = 0; i < ptaStatic->cValues; i++) { if (IS_PLACEHOLDER(ptaStatic->aulPropTag[i])) { // Found a placeholder. Turn it into a true property tag Assert(PLACEHOLDER_INDEX(ptaStatic->aulPropTag[i]) < ptaNamedProps->cValues); (*pptaReturn)->aulPropTag[i] = ptaNamedProps->aulPropTag[PLACEHOLDER_INDEX(ptaStatic->aulPropTag[i])]; } else { (*pptaReturn)->aulPropTag[i] = ptaStatic->aulPropTag[i]; } } } exit: if (hResult || ! pptaNamedProps) { FreeBufferAndNull(&ptaTemp); } else { // Client is responsible for freeing this. *pptaNamedProps = ptaNamedProps; } return(hResult); } /*************************************************************************** Name : OpenCreateProperty Purpose : Open an interface on a property or create if non-existent. Parameters: lpmp -> IMAPIProp object to open prop on ulPropTag = property tag to open lpciid -> interface identifier ulInterfaceOptions = interface specific flags ulFlags = MAPI_MODIFY? lppunk -> return the object here Returns : HRESULT Comment : Caller is responsible for Release'ing the returned object. ***************************************************************************/ HRESULT OpenCreateProperty(LPMAPIPROP lpmp, ULONG ulPropTag, LPCIID lpciid, ULONG ulInterfaceOptions, ULONG ulFlags, LPUNKNOWN * lppunk) { HRESULT hResult; if (hResult = lpmp->lpVtbl->OpenProperty( lpmp, ulPropTag, lpciid, ulInterfaceOptions, ulFlags, (LPUNKNOWN *)lppunk)) { DebugTrace("OpenCreateProperty:OpenProperty(%s)-> %s\n", PropTagName(ulPropTag), SzDecodeScode(GetScode(hResult))); // property doesn't exist... try to create it if (hResult = lpmp->lpVtbl->OpenProperty( lpmp, ulPropTag, lpciid, ulInterfaceOptions, MAPI_CREATE | ulFlags, (LPUNKNOWN *)lppunk)) { DebugTrace("OpenCreateProperty:OpenProperty(%s, MAPI_CREATE)-> %s\n", PropTagName(ulPropTag), SzDecodeScode(GetScode(hResult))); } } return(hResult); } #endif // OLD_STUFF #endif // mutil_c #ifdef rk_c #ifdef OLD_STUFF //#ifdef OLDSTUFF_DBCS #define chVoiced 0xde //Japanese specific #define chVoiceless 0xdf //Japanese specific #define chDbcsVoiced 0x814a //Japanese specific #define chDbcsVoiceless 0x814b //Japanese specific #define LangJPN 0x0411 /* ========================================================= * ulcbStrCount() * * Count the byte from szSource and ulChrLen * * usChrLen : Char Count not bytes count */ ULONG ulcbStrCount (LPTSTR szSource , ULONG ulChrLen, LANGID langID) { ULONG ulb = 0; ULONG ulch = ulChrLen; LPTSTR sz = szSource; while(ulch && *sz) { if (IsDBCSLeadByte(*sz)) { if (langID != LangJPN || ((*(UNALIGNED WORD*)sz != (WORD)chDbcsVoiced) && (*(UNALIGNED WORD*)sz != (WORD)chDbcsVoiceless))) ulch--; sz += 2; ulb += 2; } else { if (langID != LangJPN || ((*sz != chVoiced) && (*sz != chVoiceless))) ulch--; sz++; ulb++; } } return ulb; } /* ======================================================== ulchStrCount Count the Charctor from szSource and ulBLen ulBLen is bytes counts */ ULONG ulchStrCount (LPTSTR szSource, ULONG ulBLen, LANGID langID) { ULONG ulb = ulBLen; ULONG ulch = 0; LPTSTR sz = szSource; while(ulb && *sz) { if (IsDBCSLeadByte(*sz)) { if (langID != LangJPN || ((*(UNALIGNED WORD*)sz != (WORD)chDbcsVoiced) && (*(UNALIGNED WORD*)sz != (WORD)chDbcsVoiceless))) ulch++; sz += 2; ulb -= 2; } else { if (langID != LangJPN || ((*sz != chVoiced) && (*sz != chVoiceless))) ulch++; sz++; ulb--; } } return ulch; } /* ========================================================= * ulcbEndCount() * * Count the byte from szSource and ulChrLen * * usChrLen : Char Count not bytes count */ ULONG ulcbEndCount(LPSTR szTarget, ULONG cbTarget, ULONG cchPattern, LANGID langID) { LPBYTE szStart; ULONG cbEndTarget = 0; if (cbTarget < cchPattern) return 0; // This is to get the reasonable starting pointer of the string, // so we can imporve the performance in the SzGPrev(). while(cbTarget > (cchPattern * 2)) { if (IsDBCSLeadByte(*szTarget)) { cbTarget -= 2; szTarget += 2; } else { cbTarget --; szTarget ++; } } szStart = szTarget; szTarget= szTarget + cbTarget; while (cchPattern > 0) { const LPBYTE szTargetOrg = szTarget; szTarget = SzGPrev(szStart, szTarget); if(szTarget + 2 == szTargetOrg) // same as if (IsDBCSLeadByte(szTarget)) { if (langID != LangJPN || ((*(UNALIGNED WORD*)szTarget != (WORD)chDbcsVoiced) && (*(UNALIGNED WORD*)szTarget != (WORD)chDbcsVoiceless))) cchPattern --; cbEndTarget++; } else if (*szTarget != chVoiced && *szTarget != chVoiceless) { cchPattern --; } cbEndTarget++; } return cbEndTarget; } //#endif // DBCS #endif //OLD_STUFF #ifdef OLD_STUFF #if defined(WIN16) #pragma warning(disable:4505) /* unreferenced local fuction removed */ #elif defined(WIN32) #pragma warning(disable:4514) /* unreferenced inline function removed */ #endif // OLD_STUFF #endif #endif //rk_c #ifdef _runt_h #ifdef OLD_STUFF // CRC-32 implementation (yet another) ULONG UlCrc(UINT cb, LPBYTE pb); #endif #endif #ifdef _runt_c #ifdef OLD_STUFF STDAPI_(LPTSTR) SzFindCh(LPCTSTR sz, USHORT ch) { AssertSz(!IsBadStringPtr(sz, INFINITE), "SzFindCh: sz fails address check"); #ifdef OLDSTUFF_DBCS return SzGFindCh(sz, ch); #else for (;;) { if (FIsNextCh(sz, ch)) return (LPTSTR) sz; else if (!*sz) return NULL; else sz = TCharNext(sz); } #endif } #endif // OLD_STUFF #ifdef OLD_STUFF STDAPI_(LPTSTR) SzFindLastCh(LPCTSTR sz, USHORT ch) { LPTSTR szLast = NULL; LPTSTR szNext = (LPTSTR) sz; AssertSz(!IsBadStringPtr(sz, INFINITE), "SzFindLastCh: sz fails address check"); #ifdef OLDSTUFF_DBCS szNext = sz + CbGSzLen(sz) - 2; return SzGFindBackCh(sz, szNext, ch); #else do { if (szNext = SzFindCh(szNext, ch)) { szLast = szNext; szNext = TCharNext(szNext); } } while (szNext); return szLast; #endif } #endif //OLD_STUFF #ifdef OLD_STUFF STDAPI_(LPTSTR) SzFindSz(LPCTSTR sz, LPCTSTR szKey) { AssertSz(!IsBadStringPtr(sz, 0xFFFF), "SzFindSz: sz fails address check"); AssertSz(!IsBadStringPtr(szKey, 0xFFFF), "SzFindSz: szKey fails address check"); #ifdef OLDSTUFF_DBCS return (LPTSTR)LpszRKFindSubpsz ((LPSTR)sz, CchGSzLen(sz), (LPSTR)szKey, CchGSzLen(szKey), 0); #else return (LPTSTR)LpszRKFindSubpsz ((LPSTR)sz, lstrlen(sz), (LPSTR)szKey, lstrlen(szKey), 0); #endif } #endif // OLD_STUFF #endif _runt_c #ifdef structs_h #ifdef OLD_STUFF /************************ IABProvider ***********************************/ typedef struct _tagIABProvider_Shutdown_Params { LPVOID This; ULONG FAR * lpulFlags; } IABProvider_Shutdown_Params, FAR * LPIABProvider_Shutdown_Params; typedef struct _tagIABProvider_Logon_Params { LPVOID This; LPMAPISUP lpMAPISup; ULONG ulUIParam; LPTSTR lpszProfileName; ULONG ulFlags; ULONG FAR * lpulpcbSecurity; LPBYTE FAR * lppbSecurity; LPMAPIERROR FAR * lppMapiError; LPABLOGON FAR * lppABLogon; } IABProvider_Logon_Params, FAR * LPIABProvider_Logon_Params; /************************* IABLogon *************************************/ typedef struct _tagIABLogon_GetLastError_Params { LPVOID This; HRESULT hResult; ULONG ulFlags; LPMAPIERROR FAR * lppMAPIError; } IABLogon_GetLastError_Params, FAR * LPIABLogon_GetLastError_Params; typedef struct _tagIABLogon_Logoff_Params { LPVOID This; ULONG ulFlags; } IABLogon_Logoff_Params, FAR * LPIABLogon_Logoff_Params; typedef struct _tagIABLogon_OpenEntry_Params { LPVOID This; ULONG cbEntryID; LPENTRYID lpEntryID; LPIID lpInterface; ULONG ulFlags; ULONG FAR * lpulObjType; LPUNKNOWN FAR * lppUnk; } IABLogon_OpenEntry_Params, FAR * LPIABLogon_OpenEntry_Params; typedef struct _tagIABLogon_CompareEntryIDs_Params { LPVOID This; ULONG cbEntryID1; LPENTRYID lpEntryID1; ULONG cbEntryID2; LPENTRYID lpEntryID2; ULONG ulFlags; ULONG FAR * lpulResult; } IABLogon_CompareEntryIDs_Params, FAR * LPIABLogon_CompareEntryIDs_Params; typedef struct _tagIABLogon_Advise_Params { LPVOID This; ULONG cbEntryID; LPENTRYID lpEntryID; ULONG ulEventMask; LPMAPIADVISESINK lpAdviseSink; ULONG FAR * lpulConnection; } IABLogon_Advise_Params, FAR * LPIABLogon_Advise_Params; typedef struct _tagIABLogon_Unadvise_Params { LPVOID This; ULONG ulConnection; } IABLogon_Unadvise_Params, FAR * LPIABLogon_Unadvise_Params; typedef struct _tagIABLogon_OpenStatusEntry_Params { LPVOID This; LPIID lpInterface; ULONG ulFlags; ULONG FAR * lpulObjType; LPMAPISTATUS FAR * lppEntry; } IABLogon_OpenStatusEntry_Params, FAR * LPIABLogon_OpenStatusEntry_Params; typedef struct _tagIABLogon_OpenTemplateID_Params { LPVOID This; ULONG cbTemplateID; LPENTRYID lpTemplateID; ULONG ulTemplateFlags; LPMAPIPROP lpMAPIPropData; LPIID lpInterface; LPMAPIPROP FAR * lppMAPIPropNew; LPMAPIPROP lpMAPIPropSibling; } IABLogon_OpenTemplateID_Params, FAR * LPIABLogon_OpenTemplateID_Params; typedef struct _tagIABLogon_GetOneOffTable_Params { LPVOID This; ULONG ulFlags; LPMAPITABLE FAR * lppTable; } IABLogon_GetOneOffTable_Params, FAR * LPIABLogon_GetOneOffTable_Params; typedef struct _tagIABLogon_PrepareRecips_Params { LPVOID This; ULONG ulFlags; LPSPropTagArray lpPropTagArray; LPADRLIST lpRecipList; } IABLogon_PrepareRecips_Params, FAR * LPIABLogon_PrepareRecips_Params; /*********************** IXPProvider ************************************/ typedef struct _tagIXPProvider_Shutdown_Params { LPVOID This; ULONG FAR * lpulFlags; } IXPProvider_Shutdown_Params, FAR * LPIXPProvider_Shutdown_Params; typedef struct _tagIXPProvider_TransportLogon_Params { LPVOID This; LPMAPISUP lpMAPISup; ULONG ulUIParam; LPTSTR lpszProfileName; ULONG FAR * lpulFlags; LPMAPIERROR FAR * lppMapiError; LPXPLOGON FAR * lppXPLogon; } IXPProvider_TransportLogon_Params, FAR * LPIXPProvider_TransportLogon_Params; /************************ IXPLogon **************************************/ typedef struct _tagIXPLogon_AddressTypes_Params { LPVOID This; ULONG FAR * lpulFlags; ULONG FAR * lpcAdrType; LPTSTR FAR * FAR * lpppAdrTypeArray; ULONG FAR * lpcMAPIUID; LPMAPIUID FAR * FAR * lpppUIDArray; } IXPLogon_AddressTypes_Params, FAR * LPIXPLogon_AddressTypes_Params; typedef struct _tagIXPLogon_RegisterOptions_Params { LPVOID This; ULONG FAR * lpulFlags; ULONG FAR * lpcOptions; LPOPTIONDATA FAR * lppOptions; } IXPLogon_RegisterOptions_Params, FAR * LPIXPLogon_RegisterOptions_Params; typedef struct _tagIXPLogon_TransportNotify_Params { LPVOID This; ULONG FAR * lpulFlags; LPVOID FAR * lppvData; } IXPLogon_TransportNotify_Params, FAR * LPIXPLogon_TransportNotify_Params; typedef struct _tagIXPLogon_Idle_Params { LPVOID This; ULONG ulFlags; } IXPLogon_Idle_Params, FAR * LPIXPLogon_Idle_Params; typedef struct _tagIXPLogon_TransportLogoff_Params { LPVOID This; ULONG ulFlags; } IXPLogon_TransportLogoff_Params, FAR * LPIXPLogon_TransportLogoff_Params; typedef struct _tagIXPLogon_SubmitMessage_Params { LPVOID This; ULONG ulFlags; LPMESSAGE lpMessage; ULONG FAR * lpulMsgRef; ULONG FAR * lpulReturnParm; } IXPLogon_SubmitMessage_Params, FAR * LPIXPLogon_SubmitMessage_Params; typedef struct _tagIXPLogon_EndMessage_Params { LPVOID This; ULONG ulMsgRef; ULONG FAR * lpulFlags; } IXPLogon_EndMessage_Params, FAR * LPIXPLogon_EndMessage_Params; typedef struct _tagIXPLogon_Poll_Params { LPVOID This; ULONG FAR * lpulIncoming; } IXPLogon_Poll_Params, FAR * LPIXPLogon_Poll_Params; typedef struct _tagIXPLogon_StartMessage_Params { LPVOID This; ULONG ulFlags; LPMESSAGE lpMessage; ULONG FAR * lpulMsgRef; } IXPLogon_StartMessage_Params, FAR * LPIXPLogon_StartMessage_Params; typedef struct _tagIXPLogon_OpenStatusEntry_Params { LPVOID This; LPIID lpInterface; ULONG ulFlags; ULONG FAR * lpulObjType; LPMAPISTATUS FAR * lppEntry; } IXPLogon_OpenStatusEntry_Params, FAR * LPIXPLogon_OpenStatusEntry_Params; typedef struct _tagIXPLogon_ValidateState_Params { LPVOID This; ULONG ulUIParam; ULONG ulFlags; } IXPLogon_ValidateState_Params, FAR * LPIXPLogon_ValidateState_Params; typedef struct _tagIXPLogon_FlushQueues_Params { LPVOID This; ULONG ulUIParam; ULONG cbTargetTransport; LPENTRYID lpTargetTransport; ULONG ulFlags; } IXPLogon_FlushQueues_Params, FAR * LPIXPLogon_FlushQueues_Params; /*********************** IMSProvider ************************************/ typedef struct _tagIMSProvider_Shutdown_Params { LPVOID This; ULONG FAR * lpulFlags; } IMSProvider_Shutdown_Params, FAR * LPIMSProvider_Shutdown_Params; typedef struct _tagIMSProvider_Logon_Params { LPVOID This; LPMAPISUP lpMAPISup; ULONG ulUIParam; LPTSTR lpszProfileName; ULONG cbEntryID; LPENTRYID lpEntryID; ULONG ulFlags; LPIID lpInterface; ULONG FAR * lpcbSpoolSecurity; LPBYTE FAR * lppbSpoolSecurity; LPMAPIERROR FAR * lppMapiError; LPMSLOGON FAR * lppMSLogon; LPMDB FAR * lppMDB; } IMSProvider_Logon_Params, FAR * LPIMSProvider_Logon_Params; typedef struct _tagIMSProvider_SpoolerLogon_Params { LPVOID This; LPMAPISUP lpMAPISup; ULONG ulUIParam; LPTSTR lpszProfileName; ULONG cbEntryID; LPENTRYID lpEntryID; ULONG ulFlags; LPIID lpInterface; ULONG cbSpoolSecurity; LPBYTE lpbSpoolSecurity; LPMAPIERROR FAR * lppMapiError; LPMSLOGON FAR * lppMSLogon; LPMDB FAR * lppMDB; } IMSProvider_SpoolerLogon_Params, FAR * LPIMSProvider_SpoolerLogon_Params; typedef struct _tagIMSProvider_CompareStoreIDs_Params { LPVOID This; ULONG cbEntryID1; LPENTRYID lpEntryID1; ULONG cbEntryID2; LPENTRYID lpEntryID2; ULONG ulFlags; ULONG FAR * lpulResult; } IMSProvider_CompareStoreIDs_Params, FAR * LPIMSProvider_CompareStoreIDs_Params; /*************************** IMSLogon **********************************/ typedef struct _tagIMSLogon_GetLastError_Params { LPVOID This; HRESULT hResult; ULONG ulFlags; LPMAPIERROR FAR * lppMAPIError; } IMSLogon_GetLastError_Params, FAR * LPIMSLogon_GetLastError_Params; typedef struct _tagIMSLogon_Logoff_Params { LPVOID This; ULONG FAR * lpulFlags; } IMSLogon_Logoff_Params, FAR * LPIMSLogon_Logoff_Params; typedef struct _tagIMSLogon_OpenEntry_Params { LPVOID This; ULONG cbEntryID; LPENTRYID lpEntryID; LPIID lpInterface; ULONG ulFlags; ULONG FAR * lpulObjType; LPUNKNOWN FAR * lppUnk; } IMSLogon_OpenEntry_Params, FAR * LPIMSLogon_OpenEntry_Params; typedef struct _tagIMSLogon_CompareEntryIDs_Params { LPVOID This; ULONG cbEntryID1; LPENTRYID lpEntryID1; ULONG cbEntryID2; LPENTRYID lpEntryID2; ULONG ulFlags; ULONG FAR * lpulResult; } IMSLogon_CompareEntryIDs_Params, FAR * LPIMSLogon_CompareEntryIDs_Params; typedef struct _tagIMSLogon_Advise_Params { LPVOID This; ULONG cbEntryID; LPENTRYID lpEntryID; ULONG ulEventMask; LPMAPIADVISESINK lpAdviseSink; ULONG FAR * lpulConnection; } IMSLogon_Advise_Params, FAR * LPIMSLogon_Advise_Params; typedef struct _tagIMSLogon_Unadvise_Params { LPVOID This; ULONG ulConnection; } IMSLogon_Unadvise_Params, FAR * LPIMSLogon_Unadvise_Params; typedef struct _tagIMSLogon_OpenStatusEntry_Params { LPVOID This; LPIID lpInterface; ULONG ulFlags; ULONG FAR * lpulObjType; LPVOID FAR * lppEntry; } IMSLogon_OpenStatusEntry_Params, FAR * LPIMSLogon_OpenStatusEntry_Params; /*************************** IMAPIControl ******************************/ typedef struct _tagIMAPIControl_GetLastError_Params { LPVOID This; HRESULT hResult; ULONG ulFlags; LPMAPIERROR FAR * lppMAPIError; } IMAPIControl_GetLastError_Params, FAR * LPIMAPIControl_GetLastError_Params; typedef struct _tagIMAPIControl_Activate_Params { LPVOID This; ULONG ulFlags; ULONG ulUIParam; } IMAPIControl_Activate_Params, FAR * LPIMAPIControl_Activate_Params; typedef struct _tagIMAPIControl_GetState_Params { LPVOID This; ULONG ulFlags; ULONG FAR * lpulState; } IMAPIControl_GetState_Params, FAR * LPIMAPIControl_GetState_Params; #endif #endif //structs_h #ifdef wabval_h #ifdef OLD_STUFF /* IMsgStore */ #define Validate_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ ValidateParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) #define UlValidate_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ UlValidateParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) #define CheckParameters_IMsgStore_Advise( a1, a2, a3, a4, a5, a6 ) \ CheckParameters6( IMsgStore_Advise, a1, a2, a3, a4, a5, a6 ) #define Validate_IMsgStore_Unadvise( a1, a2 ) \ ValidateParameters2( IMsgStore_Unadvise, a1, a2 ) #define UlValidate_IMsgStore_Unadvise( a1, a2 ) \ UlValidateParameters2( IMsgStore_Unadvise, a1, a2 ) #define CheckParameters_IMsgStore_Unadvise( a1, a2 ) \ CheckParameters2( IMsgStore_Unadvise, a1, a2 ) #define Validate_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IMsgStore_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IMsgStore_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IMsgStore_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IMsgStore_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) #define UlValidate_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) #define CheckParameters_IMsgStore_SetReceiveFolder( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMsgStore_SetReceiveFolder, a1, a2, a3, a4, a5 ) #define Validate_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ ValidateParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) #define UlValidate_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ UlValidateParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) #define CheckParameters_IMsgStore_GetReceiveFolder( a1, a2, a3, a4, a5, a6 ) \ CheckParameters6( IMsgStore_GetReceiveFolder, a1, a2, a3, a4, a5, a6 ) #define Validate_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ ValidateParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) #define UlValidate_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ UlValidateParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) #define CheckParameters_IMsgStore_GetReceiveFolderTable( a1, a2, a3 ) \ CheckParameters3( IMsgStore_GetReceiveFolderTable, a1, a2, a3 ) #define Validate_IMsgStore_StoreLogoff( a1, a2 ) \ ValidateParameters2( IMsgStore_StoreLogoff, a1, a2 ) #define UlValidate_IMsgStore_StoreLogoff( a1, a2 ) \ UlValidateParameters2( IMsgStore_StoreLogoff, a1, a2 ) #define CheckParameters_IMsgStore_StoreLogoff( a1, a2 ) \ CheckParameters2( IMsgStore_StoreLogoff, a1, a2 ) #define Validate_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ ValidateParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) #define UlValidate_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ UlValidateParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) #define CheckParameters_IMsgStore_AbortSubmit( a1, a2, a3, a4 ) \ CheckParameters4( IMsgStore_AbortSubmit, a1, a2, a3, a4 ) #define Validate_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ ValidateParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) #define UlValidate_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ UlValidateParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) #define CheckParameters_IMsgStore_GetOutgoingQueue( a1, a2, a3 ) \ CheckParameters3( IMsgStore_GetOutgoingQueue, a1, a2, a3 ) #define Validate_IMsgStore_SetLockState( a1, a2, a3 ) \ ValidateParameters3( IMsgStore_SetLockState, a1, a2, a3 ) #define UlValidate_IMsgStore_SetLockState( a1, a2, a3 ) \ UlValidateParameters3( IMsgStore_SetLockState, a1, a2, a3 ) #define CheckParameters_IMsgStore_SetLockState( a1, a2, a3 ) \ CheckParameters3( IMsgStore_SetLockState, a1, a2, a3 ) #define Validate_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ ValidateParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) #define UlValidate_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ UlValidateParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) #define CheckParameters_IMsgStore_FinishedMsg( a1, a2, a3, a4 ) \ CheckParameters4( IMsgStore_FinishedMsg, a1, a2, a3, a4 ) #define Validate_IMsgStore_NotifyNewMail( a1, a2 ) \ ValidateParameters2( IMsgStore_NotifyNewMail, a1, a2 ) #define UlValidate_IMsgStore_NotifyNewMail( a1, a2 ) \ UlValidateParameters2( IMsgStore_NotifyNewMail, a1, a2 ) #define CheckParameters_IMsgStore_NotifyNewMail( a1, a2 ) \ CheckParameters2( IMsgStore_NotifyNewMail, a1, a2 ) /* IMessage */ #define Validate_IMessage_GetAttachmentTable( a1, a2, a3 ) \ ValidateParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) #define UlValidate_IMessage_GetAttachmentTable( a1, a2, a3 ) \ UlValidateParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) #define CheckParameters_IMessage_GetAttachmentTable( a1, a2, a3 ) \ CheckParameters3( IMessage_GetAttachmentTable, a1, a2, a3 ) #define Validate_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) #define UlValidate_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) #define CheckParameters_IMessage_OpenAttach( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMessage_OpenAttach, a1, a2, a3, a4, a5 ) #define Validate_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) #define UlValidate_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) #define CheckParameters_IMessage_CreateAttach( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMessage_CreateAttach, a1, a2, a3, a4, a5 ) #define Validate_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) #define UlValidate_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) #define CheckParameters_IMessage_DeleteAttach( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMessage_DeleteAttach, a1, a2, a3, a4, a5 ) #define Validate_IMessage_GetRecipientTable( a1, a2, a3 ) \ ValidateParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) #define UlValidate_IMessage_GetRecipientTable( a1, a2, a3 ) \ UlValidateParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) #define CheckParameters_IMessage_GetRecipientTable( a1, a2, a3 ) \ CheckParameters3( IMessage_GetRecipientTable, a1, a2, a3 ) #define Validate_IMessage_ModifyRecipients( a1, a2, a3 ) \ ValidateParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) #define UlValidate_IMessage_ModifyRecipients( a1, a2, a3 ) \ UlValidateParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) #define CheckParameters_IMessage_ModifyRecipients( a1, a2, a3 ) \ CheckParameters3( IMessage_ModifyRecipients, a1, a2, a3 ) #define Validate_IMessage_SubmitMessage( a1, a2 ) \ ValidateParameters2( IMessage_SubmitMessage, a1, a2 ) #define UlValidate_IMessage_SubmitMessage( a1, a2 ) \ UlValidateParameters2( IMessage_SubmitMessage, a1, a2 ) #define CheckParameters_IMessage_SubmitMessage( a1, a2 ) \ CheckParameters2( IMessage_SubmitMessage, a1, a2 ) #define Validate_IMessage_SetReadFlag( a1, a2 ) \ ValidateParameters2( IMessage_SetReadFlag, a1, a2 ) #define UlValidate_IMessage_SetReadFlag( a1, a2 ) \ UlValidateParameters2( IMessage_SetReadFlag, a1, a2 ) #define CheckParameters_IMessage_SetReadFlag( a1, a2 ) \ CheckParameters2( IMessage_SetReadFlag, a1, a2 ) /* IABProvider */ #define Validate_IABProvider_Shutdown( a1, a2 ) \ ValidateParameters2( IABProvider_Shutdown, a1, a2 ) #define UlValidate_IABProvider_Shutdown( a1, a2 ) \ UlValidateParameters2( IABProvider_Shutdown, a1, a2 ) #define CheckParameters_IABProvider_Shutdown( a1, a2 ) \ CheckParameters2( IABProvider_Shutdown, a1, a2 ) #define Validate_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ ValidateParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) #define UlValidate_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ UlValidateParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) #define CheckParameters_IABProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) \ CheckParameters9( IABProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9 ) /* IABLogon */ #define Validate_IABLogon_GetLastError( a1, a2, a3, a4 ) \ ValidateParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) #define UlValidate_IABLogon_GetLastError( a1, a2, a3, a4 ) \ UlValidateParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) #define CheckParameters_IABLogon_GetLastError( a1, a2, a3, a4 ) \ CheckParameters4( IABLogon_GetLastError, a1, a2, a3, a4 ) #define Validate_IABLogon_Logoff( a1, a2 ) \ ValidateParameters2( IABLogon_Logoff, a1, a2 ) #define UlValidate_IABLogon_Logoff( a1, a2 ) \ UlValidateParameters2( IABLogon_Logoff, a1, a2 ) #define CheckParameters_IABLogon_Logoff( a1, a2 ) \ CheckParameters2( IABLogon_Logoff, a1, a2 ) #define Validate_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IABLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IABLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IABLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IABLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ ValidateParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define UlValidate_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ UlValidateParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define CheckParameters_IABLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ CheckParameters6( IABLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define Validate_IABLogon_Unadvise( a1, a2 ) \ ValidateParameters2( IABLogon_Unadvise, a1, a2 ) #define UlValidate_IABLogon_Unadvise( a1, a2 ) \ UlValidateParameters2( IABLogon_Unadvise, a1, a2 ) #define CheckParameters_IABLogon_Unadvise( a1, a2 ) \ CheckParameters2( IABLogon_Unadvise, a1, a2 ) #define Validate_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define UlValidate_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define CheckParameters_IABLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ CheckParameters5( IABLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define Validate_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ ValidateParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) #define UlValidate_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ UlValidateParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) #define CheckParameters_IABLogon_OpenTemplateID( a1, a2, a3, a4, a5, a6, a7, a8 ) \ CheckParameters8( IABLogon_OpenTemplateID, a1, a2, a3, a4, a5, a6, a7, a8 ) #define Validate_IABLogon_GetOneOffTable( a1, a2, a3 ) \ ValidateParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) #define UlValidate_IABLogon_GetOneOffTable( a1, a2, a3 ) \ UlValidateParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) #define CheckParameters_IABLogon_GetOneOffTable( a1, a2, a3 ) \ CheckParameters3( IABLogon_GetOneOffTable, a1, a2, a3 ) #define Validate_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ ValidateParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) #define UlValidate_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ UlValidateParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) #define CheckParameters_IABLogon_PrepareRecips( a1, a2, a3, a4 ) \ CheckParameters4( IABLogon_PrepareRecips, a1, a2, a3, a4 ) /* IXPProvider */ #define Validate_IXPProvider_Shutdown( a1, a2 ) \ ValidateParameters2( IXPProvider_Shutdown, a1, a2 ) #define UlValidate_IXPProvider_Shutdown( a1, a2 ) \ UlValidateParameters2( IXPProvider_Shutdown, a1, a2 ) #define CheckParameters_IXPProvider_Shutdown( a1, a2 ) \ CheckParameters2( IXPProvider_Shutdown, a1, a2 ) #define Validate_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IXPProvider_TransportLogon( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IXPProvider_TransportLogon, a1, a2, a3, a4, a5, a6, a7 ) /* IXPLogon */ #define Validate_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ ValidateParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) #define UlValidate_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ UlValidateParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) #define CheckParameters_IXPLogon_AddressTypes( a1, a2, a3, a4, a5, a6 ) \ CheckParameters6( IXPLogon_AddressTypes, a1, a2, a3, a4, a5, a6 ) #define Validate_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ ValidateParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) #define UlValidate_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ UlValidateParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) #define CheckParameters_IXPLogon_RegisterOptions( a1, a2, a3, a4 ) \ CheckParameters4( IXPLogon_RegisterOptions, a1, a2, a3, a4 ) #define Validate_IXPLogon_TransportNotify( a1, a2, a3 ) \ ValidateParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) #define UlValidate_IXPLogon_TransportNotify( a1, a2, a3 ) \ UlValidateParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) #define CheckParameters_IXPLogon_TransportNotify( a1, a2, a3 ) \ CheckParameters3( IXPLogon_TransportNotify, a1, a2, a3 ) #define Validate_IXPLogon_Idle( a1, a2 ) \ ValidateParameters2( IXPLogon_Idle, a1, a2 ) #define UlValidate_IXPLogon_Idle( a1, a2 ) \ UlValidateParameters2( IXPLogon_Idle, a1, a2 ) #define CheckParameters_IXPLogon_Idle( a1, a2 ) \ CheckParameters2( IXPLogon_Idle, a1, a2 ) #define Validate_IXPLogon_TransportLogoff( a1, a2 ) \ ValidateParameters2( IXPLogon_TransportLogoff, a1, a2 ) #define UlValidate_IXPLogon_TransportLogoff( a1, a2 ) \ UlValidateParameters2( IXPLogon_TransportLogoff, a1, a2 ) #define CheckParameters_IXPLogon_TransportLogoff( a1, a2 ) \ CheckParameters2( IXPLogon_TransportLogoff, a1, a2 ) #define Validate_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) #define UlValidate_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) #define CheckParameters_IXPLogon_SubmitMessage( a1, a2, a3, a4, a5 ) \ CheckParameters5( IXPLogon_SubmitMessage, a1, a2, a3, a4, a5 ) #define Validate_IXPLogon_EndMessage( a1, a2, a3 ) \ ValidateParameters3( IXPLogon_EndMessage, a1, a2, a3 ) #define UlValidate_IXPLogon_EndMessage( a1, a2, a3 ) \ UlValidateParameters3( IXPLogon_EndMessage, a1, a2, a3 ) #define CheckParameters_IXPLogon_EndMessage( a1, a2, a3 ) \ CheckParameters3( IXPLogon_EndMessage, a1, a2, a3 ) #define Validate_IXPLogon_Poll( a1, a2 ) \ ValidateParameters2( IXPLogon_Poll, a1, a2 ) #define UlValidate_IXPLogon_Poll( a1, a2 ) \ UlValidateParameters2( IXPLogon_Poll, a1, a2 ) #define CheckParameters_IXPLogon_Poll( a1, a2 ) \ CheckParameters2( IXPLogon_Poll, a1, a2 ) #define Validate_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ ValidateParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) #define UlValidate_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ UlValidateParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) #define CheckParameters_IXPLogon_StartMessage( a1, a2, a3, a4 ) \ CheckParameters4( IXPLogon_StartMessage, a1, a2, a3, a4 ) #define Validate_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define UlValidate_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define CheckParameters_IXPLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ CheckParameters5( IXPLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define Validate_IXPLogon_ValidateState( a1, a2, a3 ) \ ValidateParameters3( IXPLogon_ValidateState, a1, a2, a3 ) #define UlValidate_IXPLogon_ValidateState( a1, a2, a3 ) \ UlValidateParameters3( IXPLogon_ValidateState, a1, a2, a3 ) #define CheckParameters_IXPLogon_ValidateState( a1, a2, a3 ) \ CheckParameters3( IXPLogon_ValidateState, a1, a2, a3 ) #define Validate_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) #define UlValidate_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) #define CheckParameters_IXPLogon_FlushQueues( a1, a2, a3, a4, a5 ) \ CheckParameters5( IXPLogon_FlushQueues, a1, a2, a3, a4, a5 ) /* IMSProvider */ #define Validate_IMSProvider_Shutdown( a1, a2 ) \ ValidateParameters2( IMSProvider_Shutdown, a1, a2 ) #define UlValidate_IMSProvider_Shutdown( a1, a2 ) \ UlValidateParameters2( IMSProvider_Shutdown, a1, a2 ) #define CheckParameters_IMSProvider_Shutdown( a1, a2 ) \ CheckParameters2( IMSProvider_Shutdown, a1, a2 ) #define Validate_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ ValidateParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define UlValidate_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ UlValidateParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define CheckParameters_IMSProvider_Logon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ CheckParameters13( IMSProvider_Logon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define Validate_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ ValidateParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define UlValidate_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ UlValidateParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define CheckParameters_IMSProvider_SpoolerLogon( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) \ CheckParameters13( IMSProvider_SpoolerLogon, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 ) #define Validate_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IMSProvider_CompareStoreIDs( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IMSProvider_CompareStoreIDs, a1, a2, a3, a4, a5, a6, a7 ) /* IMSLogon */ #define Validate_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ ValidateParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) #define UlValidate_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ UlValidateParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) #define CheckParameters_IMSLogon_GetLastError( a1, a2, a3, a4 ) \ CheckParameters4( IMSLogon_GetLastError, a1, a2, a3, a4 ) #define Validate_IMSLogon_Logoff( a1, a2 ) \ ValidateParameters2( IMSLogon_Logoff, a1, a2 ) #define UlValidate_IMSLogon_Logoff( a1, a2 ) \ UlValidateParameters2( IMSLogon_Logoff, a1, a2 ) #define CheckParameters_IMSLogon_Logoff( a1, a2 ) \ CheckParameters2( IMSLogon_Logoff, a1, a2 ) #define Validate_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IMSLogon_OpenEntry( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IMSLogon_OpenEntry, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ ValidateParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define UlValidate_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ UlValidateParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define CheckParameters_IMSLogon_CompareEntryIDs( a1, a2, a3, a4, a5, a6, a7 ) \ CheckParameters7( IMSLogon_CompareEntryIDs, a1, a2, a3, a4, a5, a6, a7 ) #define Validate_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ ValidateParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define UlValidate_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ UlValidateParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define CheckParameters_IMSLogon_Advise( a1, a2, a3, a4, a5, a6 ) \ CheckParameters6( IMSLogon_Advise, a1, a2, a3, a4, a5, a6 ) #define Validate_IMSLogon_Unadvise( a1, a2 ) \ ValidateParameters2( IMSLogon_Unadvise, a1, a2 ) #define UlValidate_IMSLogon_Unadvise( a1, a2 ) \ UlValidateParameters2( IMSLogon_Unadvise, a1, a2 ) #define CheckParameters_IMSLogon_Unadvise( a1, a2 ) \ CheckParameters2( IMSLogon_Unadvise, a1, a2 ) #define Validate_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define UlValidate_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) #define CheckParameters_IMSLogon_OpenStatusEntry( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMSLogon_OpenStatusEntry, a1, a2, a3, a4, a5 ) /* IMAPIControl */ #define Validate_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ ValidateParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) #define UlValidate_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ UlValidateParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) #define CheckParameters_IMAPIControl_GetLastError( a1, a2, a3, a4 ) \ CheckParameters4( IMAPIControl_GetLastError, a1, a2, a3, a4 ) #define Validate_IMAPIControl_Activate( a1, a2, a3 ) \ ValidateParameters3( IMAPIControl_Activate, a1, a2, a3 ) #define UlValidate_IMAPIControl_Activate( a1, a2, a3 ) \ UlValidateParameters3( IMAPIControl_Activate, a1, a2, a3 ) #define CheckParameters_IMAPIControl_Activate( a1, a2, a3 ) \ CheckParameters3( IMAPIControl_Activate, a1, a2, a3 ) #define Validate_IMAPIControl_GetState( a1, a2, a3 ) \ ValidateParameters3( IMAPIControl_GetState, a1, a2, a3 ) #define UlValidate_IMAPIControl_GetState( a1, a2, a3 ) \ UlValidateParameters3( IMAPIControl_GetState, a1, a2, a3 ) #define CheckParameters_IMAPIControl_GetState( a1, a2, a3 ) \ CheckParameters3( IMAPIControl_GetState, a1, a2, a3 ) /* IMAPIStatus */ #define Validate_IMAPIStatus_ValidateState( a1, a2, a3 ) \ ValidateParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) #define UlValidate_IMAPIStatus_ValidateState( a1, a2, a3 ) \ UlValidateParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) #define CheckParameters_IMAPIStatus_ValidateState( a1, a2, a3 ) \ CheckParameters3( IMAPIStatus_ValidateState, a1, a2, a3 ) #define Validate_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ ValidateParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) #define UlValidate_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ UlValidateParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) #define CheckParameters_IMAPIStatus_SettingsDialog( a1, a2, a3 ) \ CheckParameters3( IMAPIStatus_SettingsDialog, a1, a2, a3 ) #define Validate_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ ValidateParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) #define UlValidate_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ UlValidateParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) #define CheckParameters_IMAPIStatus_ChangePassword( a1, a2, a3, a4 ) \ CheckParameters4( IMAPIStatus_ChangePassword, a1, a2, a3, a4 ) #define Validate_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ ValidateParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) #define UlValidate_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ UlValidateParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) #define CheckParameters_IMAPIStatus_FlushQueues( a1, a2, a3, a4, a5 ) \ CheckParameters5( IMAPIStatus_FlushQueues, a1, a2, a3, a4, a5 ) #endif #endif //wabval #ifdef WAB_PROFILES #ifdef OLD_STUFF /* - HrCreateNewProfileItem - * Creates a new Profile Item and adds the default shared profile to this item * */ HRESULT HrCreateNewProfileItem(LPWABPROFILEITEM * lppItem, LPTSTR lpszProfileID) { HRESULT hr = E_FAIL; SCODE sc; LPWABPROFILEITEM lpProfile = LocalAlloc(LMEM_ZEROINIT, sizeof(WABPROFILEITEM)); if(!lppItem) goto out; if(!lpProfile) { hr = MAPI_E_NOT_ENOUGH_MEMORY; goto out; } lpProfile->lpszProfileID = LocalAlloc(LMEM_ZEROINIT, lstrlen(lpszProfileID)+1); if(!lpProfile->lpszProfileID) { hr = MAPI_E_NOT_ENOUGH_MEMORY; goto out; } lstrcpy(lpProfile->lpszProfileID, lpszProfileID); //lpProfile->dwProfileID = dwEntryID; sc = MAPIAllocateBuffer(sizeof(SPropValue), &(lpProfile->lpspvFolders)); if(sc) { hr = MAPI_E_NOT_ENOUGH_MEMORY; goto out; } lpProfile->lpspvFolders[0].ulPropTag = PR_WAB_FOLDER_ENTRIES; lpProfile->lpspvFolders[0].Value.MVbin.cValues = 0; lpProfile->lpspvFolders[0].Value.MVbin.lpbin = NULL; // The folder item corresponding to the Shared folder is a // virtual item with NULL entryid .. so add this virtual item to // the primary profile // AddPropToMVPBin(lpProfile->lpspvFolders, 0, (LPVOID) NULL, 0, TRUE); *lppItem = lpProfile; hr = S_OK; out: if(HR_FAILED(hr) && lpProfile) LocalFree(lpProfile); return hr; } /* - HrLoadPrimaryWABProfile - - * Creates a primary profile which points to all existing folders in the * store - this profile is used when no profile ID is supplied so that the * UI can see everything * */ HRESULT HrLoadPrimaryWABProfile(LPIAB lpIAB) { SCODE sc; HRESULT hr = E_FAIL; SPropertyRestriction PropRes = {0}; SPropValue sp = {0}; ULONG ulCount = 0; LPSBinary rgsbEntryIDs = NULL; ULONG i = 0; LPWABPROFILEITEM lpProfile = NULL; // Now we will search the WAB for all objects of PR_OBJECT_TYPE = MAPI_ABCONT // sp.ulPropTag = PR_OBJECT_TYPE; sp.Value.l = MAPI_ABCONT; PropRes.ulPropTag = PR_OBJECT_TYPE; PropRes.relop = RELOP_EQ; PropRes.lpProp = &sp; hr = FindRecords( lpIAB->lpPropertyStore->hPropertyStore, NULL, 0, TRUE, &PropRes, &ulCount, &rgsbEntryIDs); if (HR_FAILED(hr)) goto out; // we'll always create a default item, whether it has anything in it or not .. hr = HrCreateNewProfileItem(&lpProfile, szEmpty); if(HR_FAILED(hr) || !lpProfile) goto out; //if(ulCount && rgsbEntryIDs) { for(i=0;ilpspvFolders, 0, (LPVOID) lpb, cb, TRUE); #ifdef DEBUG ////////////// { LPTSTR lp = NULL; SBinary sb; sb.cb = cb;sb.lpb = (LPBYTE)lpb; HrGetProfileFolderName(lpIAB, &sb, &lp); if(lp) { DebugTrace("Found Folder: %s\n",lp); LocalFree(lp); } } ////////////// #endif MAPIFreeBuffer(lpb); } } lpProfile->lpNext = lpIAB->lpProfilesList; lpIAB->lpProfilesList = lpProfile; } hr = S_OK; out: if(ulCount && rgsbEntryIDs) { FreeEntryIDs(lpIAB->lpPropertyStore->hPropertyStore, ulCount, rgsbEntryIDs); } return hr; } static const char szProfileKey[] = "Software\\Microsoft\\WAB\\WAB4\\Profiles"; /* - HrLoadSecondaryWABProfiles - - * Creates secondary profiles which are based on profiles actually saved in the registry * */ HRESULT HrLoadSecondaryWABProfiles(LPIAB lpIAB) { SCODE sc; HRESULT hr = E_FAIL; ULONG ulCount = 0, i = 0; LPWABPROFILEITEM lpProfile = NULL; HKEY hKey = NULL; if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER, szProfileKey, 0, KEY_READ, &hKey)) { hr = S_OK; // ignore this error goto out; } { TCHAR szValName[MAX_PATH]; DWORD dwValIndex = 0, dwValSize = sizeof(szValName), dwType = 0; *szValName = '\0'; while(ERROR_SUCCESS == RegEnumValue(hKey, dwValIndex, szValName, &dwValSize, 0, &dwType, NULL, NULL)) { // The value names under this entry are the profiles IDs and the // Value data is the raw folder data we care about // if(dwType == REG_BINARY && lstrlen(szValName)) { //Read in the Value if(ERROR_SUCCESS == RegQueryValueEx(hKey, szValName, 0, &dwType, NULL, &dwValSize)) { LPTSTR lpsz = LocalAlloc(LMEM_ZEROINIT, dwValSize); if(lpsz) { if(ERROR_SUCCESS == RegQueryValueEx(hKey, szValName, 0, &dwType, (LPBYTE) lpsz, &dwValSize)) { LPSPropValue lpProp = NULL; ULONG ulCount = 0; hr = HrGetPropArrayFromBuffer(lpsz, dwValSize, 1, 0, &lpProp); if(!HR_FAILED(hr) && lpProp && lpProp->ulPropTag == PR_WAB_FOLDER_ENTRIES) { hr = HrCreateNewProfileItem(&lpProfile, szValName); if(HR_FAILED(hr) || !lpProfile) goto out; for(i=0;iValue.MVbin.cValues;i++) { if(lpProp->Value.MVbin.lpbin[i].lpb && lpProp->Value.MVbin.lpbin[i].cb) { LPSPropValue lpPropArray = NULL; ULONG ulcValues = 0; // Verify that this folder actually physically exists - it might have been deleted if(!HR_FAILED(ReadRecord( lpIAB->lpPropertyStore->hPropertyStore, &(lpProp->Value.MVbin.lpbin[i]), 0, &ulcValues, &lpPropArray))) { // Add the entryids to this prop - ignore errors // Dont add the default shared folder as thats alreadybeen added ULONG cb = lpProp->Value.MVbin.lpbin[i].cb; LPENTRYID lpb = (LPENTRYID) lpProp->Value.MVbin.lpbin[i].lpb; if(WAB_CONTAINER != IsWABEntryID(cb,lpb,NULL,NULL,NULL,NULL,NULL)) { CreateWABEntryID( WAB_CONTAINER,lpProp->Value.MVbin.lpbin[i].lpb, NULL, NULL, lpProp->Value.MVbin.lpbin[i].cb, 0, NULL, &cb, &lpb); } // Add the entryids to this prop - ignore errors AddPropToMVPBin(lpProfile->lpspvFolders, 0, (LPVOID) lpb, cb, TRUE); if(lpProp->Value.MVbin.lpbin[i].lpb != (LPBYTE)lpb ) MAPIFreeBuffer(lpb); } LocalFreePropArray(NULL, ulcValues, &lpPropArray); } } lpProfile->lpNext = lpIAB->lpProfilesList; lpIAB->lpProfilesList = lpProfile; } LocalFreePropArray(NULL, 1, &lpProp); } LocalFree(lpsz); } } } dwValIndex++; *szValName = '\0'; dwValSize = sizeof(szValName); } } hr = S_OK; out: if(hKey) RegCloseKey(hKey); return hr; } /* - SetCurrentProfile - scans list and updates pointer - * */ void SetCurrentProfile(LPIAB lpIAB, LPTSTR lpszProfileID) { LPWABPROFILEITEM lpTemp = lpIAB->lpProfilesList; while(lpTemp) { if(!lstrcmpi(lpTemp->lpszProfileID, lpszProfileID)) { lpIAB->lpCurrentProfile = lpTemp; lpIAB->lpszProfileID = lpTemp->lpszProfileID; break; } lpTemp = lpTemp->lpNext; } } /* - HrSaveProfileItem - - * Persists a profile item to the registry * Format for the data is: * under HKCU\Software\Microsoft\WAB\Profiles create a new binary value * corresponding to the profile ID and set the binary value data to * a flat buffer corresponding to the PR_WAB_FOLDER_ENTRIES property */ HRESULT HrSaveProfileItem(LPWABPROFILEITEM lpNew) { ULONG cbBuf = 0; LPTSTR lpBuf = NULL; HRESULT hr = E_FAIL; HKEY hKey = NULL; if(lpNew->lpszProfileID && !(lpNew->lpszProfileID)) // This item is never cached - only created dynamically return S_OK; hr = HrGetBufferFromPropArray( 1, lpNew->lpspvFolders, &cbBuf, &lpBuf); if(HR_FAILED(hr)) goto out; if(cbBuf && lpBuf) { TCHAR szValName[MAX_PATH]; lstrcpy(szValName, lpNew->lpszProfileID); //wsprintf(szValName, "%d", lpNew->dwProfileID); if(ERROR_SUCCESS == RegCreateKeyEx( HKEY_CURRENT_USER, szProfileKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL)) { RegSetValueEx( hKey, szValName, 0, REG_BINARY, (LPBYTE) lpBuf, cbBuf ); } LocalFree(lpBuf); } out: if(hKey) RegCloseKey(hKey); return hr; } /* - HrCreateNewWABProfile - - * Creates a new profile based on the supplied profile ID * The profile has the default folder-id for the shared folder * set on it. * Also tags the new profile to the current folder list */ HRESULT HrCreateNewWABProfile(LPIAB lpIAB, LPTSTR lpszProfileID ) { HRESULT hr = E_FAIL; LPWABPROFILEITEM lpNew = NULL; hr = HrCreateNewProfileItem(&lpNew, lpszProfileID); if(HR_FAILED(hr) || !lpNew) goto out; // Persist this new item to the registry HrSaveProfileItem(lpNew); // Add it to the main list lpNew->lpNext = lpIAB->lpProfilesList; lpIAB->lpProfilesList = lpNew; hr = S_OK; out: if(HR_FAILED(hr) && lpNew) { MAPIFreeBuffer(lpNew->lpspvFolders); LocalFree(lpNew); } return hr; } /* - FreeWABProfilesList - - * Clears up existing Profile info from the IAB object */ void FreeWABProfilesList(LPIAB lpIAB) { LPWABPROFILEITEM lpTemp = lpIAB->lpProfilesList; while(lpTemp) { lpIAB->lpProfilesList = lpTemp->lpNext; MAPIFreeBuffer(lpTemp->lpspvFolders); if(lpTemp->lpszProfileID) LocalFree(lpTemp->lpszProfileID); LocalFree(lpTemp); lpTemp = lpIAB->lpProfilesList; } lpIAB->lpProfilesList = NULL; lpIAB->lpCurrentProfile = NULL; lpIAB->lpszProfileID = NULL; } #endif //OLD_STUFF #endif