151 lines
6.4 KiB
C++
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__
|