/*--------------------------------------------------------------------------- File: Exchange.hpp Comments: Mailbox security translation functions. (c) Copyright 1995-1998, Mission Critical Software, Inc., All Rights Reserved Proprietary and confidential to Mission Critical Software, Inc. REVISION LOG ENTRY Revision By: ... Revised on 2/8/98 6:32:13 PM --------------------------------------------------------------------------- */ #ifndef __EXCHANGE_HPP__ #define __EXCHANGE_HPP__ #define INITGUID #define USES_IID_IMAPIContainer #define USES_IID_IABContainer #define USES_IID_IMAPITable #define USES_IID_IDistList #define USES_IID_IMAPIProp #include #include #include #include #include #include "edk2.hpp" #include "stargs.hpp" #include "sidcache.hpp" #include "Ustring.hpp" #include "sdstat.hpp" #include #include "exldap.h" // Maximum numbers of entries to put through MAPI calls: #define MAX_COPY_ENTRIES 1024L #define MAX_DELETE_ENTRIES 1024L // Macro causes many retries on operations that may fail at first and succeed after a retry. #define RETRIES 100 #ifdef _DEBUG #define MAKE_MAPI_CALL(hr, c) \ { \ int iMapiRetriesOnMapiCallFailed = 0; \ do { \ hr = c; \ } while( (hr == MAPI_E_CALL_FAILED) && (++iMapiRetriesOnMapiCallFailed < RETRIES) ); \ if (iMapiRetriesOnMapiCallFailed && SUCCEEDED(hr)) { \ printf("%s succeeded after %d retries.\n", #c, iMapiRetriesOnMapiCallFailed); \ } \ } #else #define MAKE_MAPI_CALL(hr, c) \ { \ int iMapiRetriesOnMapiCallFailed = 0; \ do { \ hr = c; \ } while( (hr == MAPI_E_CALL_FAILED) && (++iMapiRetriesOnMapiCallFailed < RETRIES) ); \ } #endif class TGlobalDirectory { protected: BOOL m_bUseDefaultMapiProfile; // Whether to use MAPI profile listed in Registry. BOOL m_bPromptForMapiProfile; // Whether to prompt for MAPI profile. LPTSTR m_pszMapiProfile; // MAPI profile to use. TSDResolveStats * m_stat; // DAPI DAPI_HANDLE m_dSession; DAPI_PARMS m_dParms; public: TGlobalDirectory::TGlobalDirectory(); TGlobalDirectory::~TGlobalDirectory(); protected: // MAPI BOOL m_bMapiInitialized; // TRUE if initialization was successful. LPMAPISESSION m_pMapiSession; // MAPI session handle. LPADRBOOK m_pAdrBook; // The master AB. LPABCONT m_pGlobalList; LPABCONT m_pContainer; LPMAPITABLE m_pGlobalTable; LPSPropTagArray m_pGlobalPropertyTags; LPSRowSet m_pGlobalRows; LPSRowSet m_pRootRows; LPMAPITABLE m_pContainerTable; WCHAR * m_name; // container name used in error messages void LogMapiError(int iSeverity, LPCTSTR pszEntryPoint, HRESULT hr); void LogDapiError(int iSeverity, LPCTSTR pszUserMessage, DAPI_EVENT * pResult); BOOL m_bLoggedFailedClose; // Already logged a failure to close. LPTSTR GetMapiProfile() const; // The MAPI profile to use; may be default. BOOL DoUseDefaultMapiProfile() const; // Whether to use MAPI profile listed in Registry. BOOL DoPromptForMapiProfile() const; // Whether to prompt for MAPI profile. public: void SetStats(TSDResolveStats * s ) { m_stat = s; } BOOL StartMapiSession(); // Use MAPI profile switch to start a session. void EndMapiSession(); // Close the MAPI session. BOOL MapiIsOpen() { return (m_pMapiSession != 0 ) ; } BOOL OpenGlobalList(); // Open the address book and the Global List. void CloseGlobalList(); // Release the address book and Global List. void PromptForMapiProfile() { m_bPromptForMapiProfile = TRUE; m_bUseDefaultMapiProfile = FALSE;} void UseDefaultMapiProfile() { m_bUseDefaultMapiProfile = TRUE; m_bPromptForMapiProfile = FALSE; } void SetMapiProfile(LPCTSTR profile) { m_pszMapiProfile = new TCHAR [ UStrLen(profile) + 1 ]; UStrCpy(m_pszMapiProfile,profile); m_bPromptForMapiProfile = FALSE; m_bUseDefaultMapiProfile = FALSE;} BOOL Scan(SecurityTranslatorArgs * args,WCHAR const * container); // uses MAPI to update mailboxes BOOL DoDAPITranslation(WCHAR * server,SecurityTranslatorArgs * args); // uses DAPI to update sites, containers, orgs. BOOL DoLdapTranslation(WCHAR * server,WCHAR * creds, WCHAR * password,SecurityTranslatorArgs * args,WCHAR * basepoint,WCHAR * query = NULL ); DWORD GetLDAPPort(WCHAR * server); void GetSiteNameForServer(WCHAR const * server,CLdapEnum * e,WCHAR * siteName); protected: // MAPI work routines BOOL UpdateEntry( LPMAPIPROP pUserEntry, ULONG ulType, SecurityTranslatorArgs * args); BOOL ScanHierarchy( LPABCONT pContainerTable, SecurityTranslatorArgs * args,WCHAR const * container); BOOL ScanContents(LPMAPITABLE pContainerTable,SecurityTranslatorArgs * args); // DAPI work routines BOOL DAPITranslate(WCHAR * dn,SecurityTranslatorArgs * args); BOOL DAPIOpen(WCHAR * server); BOOL DAPIClose(); // not used BOOL OpenContainerByRow(long row); BOOL OpenContainerByName(WCHAR * name, TAccountCache * cache, BOOL nochange); //BOOL ListContainers(CTreeCtrl * tree); //BOOL DoDAPIThing(CTreeCtrl * tree, CString dn); }; BOOL LoadDAPI(); void ReleaseDAPI(); #endif //__EXCHANGE_HPP__