windows-nt/Source/XPSP1/NT/admin/admt/workobj/exchange.hpp
2020-09-26 16:20:57 +08:00

151 lines
6.4 KiB
C++

/*---------------------------------------------------------------------------
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 <winbase.h>
#include <objbase.h>
#include <mapiguid.h>
#include <mapiutil.h>
#include <emsabtag.h>
#include "edk2.hpp"
#include "stargs.hpp"
#include "sidcache.hpp"
#include "Ustring.hpp"
#include "sdstat.hpp"
#include <dapi.h>
#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__