This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/exadmin.h

586 lines
25 KiB
C++

// -----------------------------------------------------------------------------
// ExAdmin.H: Declaration of the classes necessary to create an Exchange
// Administration Extension DLL.
//
// NOTE: When we refer to "admin" we mean the Exchange Administration program.
//
// Copyright 1986 - 1998 Microsoft Corporation. All Rights Reserved.
// -----------------------------------------------------------------------------
#ifndef _EXADMIN_H_
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define _EXADMIN_H_
// -----------------------------------------------------------------------------
#include <mapix.h>
#include "retcode.h"
#include "adminext.h"
// -----------------------------------------------------------------------------
// NOTE: Your resource file MUST define these two control ids with these exact
// numbers. If you don't you will get a compile time error telling you
// that you are redefining a macro. Just go into your resource.h file and
// change those definitions to these values.
// -----------------------------------------------------------------------------
#define IDC_ADMINICON 1000
#define IDC_TITLE 1001
// -----------------------------------------------------------------------------
// The following macros and the SInitPropValue structure give the user the
// ability to easily create a property value array. This is intended to make
// it easier to use the CAdminDialog::HrSetExtProps() function.
//
// See usage example that follows.
// -----------------------------------------------------------------------------
#define MAKE_PROP_VALUE( cnt, ptr) ((LONGLONG) ((((LONGLONG) ((ULONG) (ptr))) << 32) + ((LONGLONG) ((ULONG) (cnt)))))
#define BINARY_PROP_VALUE( bin) MAKE_PROP_VALUE( sizeof( bin), &bin)
#define MULTI_VALUE_PROP( array) MAKE_PROP_VALUE( ARRAY_CNT( array), array)
typedef struct
{
ULONG ulPropTag;
ULONG dwAlignPad;
LONGLONG ll;
} SInitPropValue, *LPSInitPropValue;
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Usage example:
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#ifdef _USAGE_EXAMPLE_
#ifndef _USAGE_EXAMPLE_
// Example of a binary structure that could be used by the property value array.
typedef struct
{
CHAR ch[20];
LPSTR lpsz;
ULONG ul;
BOOL flag;
} ExampleStruct;
// Example data that could go in the property value array.
ExampleStruct BinData = { "Binary Data", "A STRING", 3752789, TRUE};
LONG LongArray[] = { 92314535, 2231223, 111, 424242312};
// The example property value array.
static SInitPropValue ExtensionProps[] =
{
{ PT_STRING8, 0, (ULONG)"Topic Folder"},
{ PT_LONG, 0, 0},
{ PT_BOOLEAN, 0, FALSE},
{ PT_BINARY, 0, BINARY_PROP_VALUE( BinData)},
{ PT_MV_LONG, 0, MULTI_VALUE_PROP( LongArray)},
};
// Somewhere in your OnInitDialog() function make the following call.
hr = HrSetExtProps( ARRAY_CNT( ExtensionProps), ExtensionProps);
#endif
#endif
// -----------------------------------------------------------------------------
// This is called once per standard property sheet. Not at all for our property
// sheets. If you want to disable some or all of the standard property sheets
// Then define this function in your code. Your function will need to return
// FALSE to disable a default property sheet.
// -----------------------------------------------------------------------------
BOOL PASCAL bShowPage( UINT iddAdminPage);
// -----------------------------------------------------------------------------
// This function is called once durring initialization. Return -1 to cause the
// first standard property sheet to be displayed. Or return the index of one of
// our property sheets to have it come up first. The user can override this
// function by simply defining their own function in their code.
// -----------------------------------------------------------------------------
INT PASCAL iStartPage( void);
// -----------------------------------------------------------------------------
// Class to initialize the DLL for both Windows and MFC.
// -----------------------------------------------------------------------------
class CInitDLL : public CWinApp
{
public:
~CInitDLL();
virtual BOOL InitInstance(); // Initialization
virtual int ExitInstance(); // Termination (WEP-like code)
// Nothing special for the constructor.
CInitDLL(LPCSTR pszAppName) : CWinApp(pszAppName) {}
};
// -----------------------------------------------------------------------------
// This dialog class allows easy subclassing of controls.
// -----------------------------------------------------------------------------
class CADialog : public CDialog
{
protected:
CADialog() : CDialog() {} // Constructor.
CADialog( LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL) : CDialog( lpszTemplateName, pParentWnd) {}
CADialog( UINT nIDTemplate, CWnd* pParentWnd = NULL) : CDialog( nIDTemplate, pParentWnd) {}
// To make subclassing controls to CWnd derived objects easier.
HRESULT HrSubclassWindow(
int nID, // Id of a control in this dialog.
CWnd& Wnd); // Reference to MFC CWnd object to connect to Windows control.
};
// -----------------------------------------------------------------------------
// Derive your dialog class from this class to have it become an automatic
// property sheet of the Exchange Administration application.
//
// NOTE: In your derived dialog you MUST NOT release a MAPI interface in the
// destructor, this will cause a deadlock hang. Use the OnDestroy() method
// of the dialog to ULRELEASE() any MAPI Interface objects.
//
// The problem is that the destructor does not get called until the DLL is
// unloading. This is a single threaded opperation in NT. The ULRELEASE
// process needs to run multi-threaded and waits INFINITELY for threads to
// terminate. The threads can't terminate until the DLL exits, and the DLL
// can't exit until the threads terminate resulting in a deadlock.
// -----------------------------------------------------------------------------
class CAdminDialog : public CADialog
{
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// You may find the following information useful for creating your dialog.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
protected:
// Protected constructor insures that you must derive a class from CAdminDialog
// in order to use it. You may NOT instantiate directly from this class.
//
// To override the show page function you must pass in the pfnShowPage parameter.
// Your function will be called once for each default property sheet and will
// receive an id of the sheet. Your function must return TRUE if you want it
// to show.
CAdminDialog(
UINT iddDialog, // The resource ID of your dialog.
UINT idsName, // The resource ID of the string containing the name
// used by admin for the tab of your property sheet.
LPSTR lpszBlobName = NULL);// Name of extension data blob.
~CAdminDialog();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Functions to make displaying of message boxes easier.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// If the caller does not pass in the lpszCaption then use the title of the
// parent window for the default title of our message box.
int MessageBox( LPCSTR lpszText, LPCSTR lpszCaption = NULL, UINT nType = MB_OK);
int MessageBox2( int IDText, int IDCaption = NULL, UINT nType = MB_OK);
CString m_sMsgBoxCaption; // This will contain the title of the parent window.
// Displays a message box with a resource string for invalid entries. After
// the user presses OK the appropriate control gets focus.
void InvalidEntry( int nResourceStrID, CWnd& wndCtrl);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Use this function to create child dialog box templates. It will ensure that
// the correct language and fonts are used. Then use the CDialog::InitModalIndirect()
// function to create the dialog
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public:
const HGLOBAL LoadDialogTemplate( UINT iddDialog);
static int LoadStringA(UINT wID, LPSTR szBuf, int cchBuf);
static int LoadStringW(UINT wID, LPWSTR wzBuf, int cchBuf);
// Free the template loaded with the above function.
void FreeDialogTemplate( HGLOBAL* lphDlgTemplate) { m_pAdminFunctions->pfnFreeDialogResource( (LPBYTE*) lphDlgTemplate);}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Override these virtual functions in your derived class if you want them to do
// something.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
protected:
// Called when a different property sheet has been selected or when either the
// OK or APPLY NOW button is pressed. This saves the data to a memory buffer
// inside of admin. Even if the user just switches to a different property sheet
// this needs to be done so that other property sheets can read any changes that
// may have been made to the data.
// Return TRUE if data has been validated and saved. Default return is TRUE.
virtual BOOL bSaveData();
// Called when either the OK or APPLY NOW button is pressed and after bSaveData().
// Return TRUE if data has been committed. This saves the extension data and returns
// TRUE if it was successful.
virtual BOOL bCommitData();
// Called so that your property sheet can refresh with data that may have been changed
// by another property sheet. You say you don't have more than one property sheet that
// modifies the same data fields. Ahh, but the Exchange SDK provides a sample that
// lets an Administrator view and modify any Exchange SDK packed extension data array.
virtual void Refresh();
// Called to determine if you supply help. Return TRUE if you do, defaults to FALSE.
virtual BOOL bHasHelp();
// Called to start help. Default does nothing.
virtual VOID DoHelp();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Call this to inform admin that the data has changed.
void DataHasChanged() { m_pAdminFunctions->pfnInfoHasChanged( GetSafeHwnd());}
// Get the count of extension data properties.
ULONG GetExtCount() { return( m_cExtProps);}
// Set the extension data properties to an existing property value array. This
// can be used to create a blob for the first time. To do this initialized the
// lpExtProps array with just property types and no real data. Then use the
// CAdminDialog::HrMod...() functions to set the values.
HRESULT HrSetExtProps(
ULONG cExtProps, // Count of extension data properties.
LPSPropValue lpExtProps); // Array of properties to set extension data to.
// Overloaded function to convert our property initialization structure to
// the real MAPI property structure. (This is temporary until MAPI changes
// their _UPV union definition.)
HRESULT HrSetExtProps(
ULONG cExtProps, // Count of extension data properties.
LPSInitPropValue lpExtProps)// Array of properties to set extension data to.
{
return( HrSetExtProps( cExtProps, (LPSPropValue) lpExtProps));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Functions to get extension data.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Use this to get a binary extension data property.
LPSBinary GetExtBinary(
ULONG iProp); // Index of property.
// Use this to get a string extension data property.
LPSTR GetExtString(
ULONG iProp); // Index of property.
// Use this to get a long extension data property.
LONG GetExtLong(
ULONG iProp); // Index of property.
// Use this to get a double word extension data property.
DWORD GetExtDWord(
ULONG iProp) // Index of property.
{
return( (DWORD) GetExtLong( iProp));
}
// Use this to get a boolean extension data property.
BOOL GetExtBool(
ULONG iProp); // Index of property.
// Use this to get a system time extension data property.
FILETIME GetExtSysTime(
ULONG iProp); // Index of property.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Functions to modify extension data.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Use this to modify a binary extension data property.
HRESULT HrModExtBinary(
IN ULONG iProp, // Index of property
IN ULONG cb, // Count of new data bytes.
IN const LPBYTE lpNew); // New data bytes.
// Use this to modify a string extension data property.
HRESULT HrModExtString(
IN ULONG iProp, // Index of property
IN LPCSTR lpszNew); // New data bytes.
// Use this to modify a long extension data property.
HRESULT HrModExtLong(
IN ULONG iProp, // Index of property
IN LONG lNew); // New long data value.
// Use this to modify a double word extension data property.
HRESULT HrModExtDWord(
IN ULONG iProp, // Index of property
IN DWORD dwNew) // New long data value.
{
return( HrModExtLong( iProp, (LONG) dwNew));
}
// Use this to modify a boolean extension data property.
HRESULT HrModExtBool(
IN ULONG iProp, // Index of property
IN BOOL bNew); // New boolean data value.
// Use this to modify a SysTime extension data property.
HRESULT HrModExtSysTime(
IN ULONG iProp, // Index of property
IN FILETIME ftNew); // New boolean data value.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Other miscellaneous functions that wrap administration functions.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Add service to be tracked by Server Monitor.
HRESULT HrAddService(
IN LPSTR lpszServiceName); // SHORT name of the service.
// Remove service to be tracked by Server Monitor.
HRESULT HrRemoveService(
IN LPSTR lpszServiceName); // SHORT name of the service.
// You MUST release the array with FreeNameList.
BOOL GetNameList(
OUT int* lpcNameList, // Ptr to number of WIDE strings in the array.
OUT LPWSTR** lppwszNameList); // Ptr to a ptr of WIDE string array.
BOOL SetNameList(
IN int cNameList, // Number of WIDE strings in the array.
IN LPWSTR* lpwszNameList); // Ptr to a WIDE string array.
// Free the name list that was received in a call to GetNameList.
void CAdminDialog::FreeNameList(
IN int cNameList, // Number of WIDE strings in the array.
IN LPWSTR* lpwszNameList) // Ptr to a WIDE string array.
{
m_pAdminFunctions->pfnFreeNameList( cNameList, lpwszNameList);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Functions to get other miscellaneous data that admin gave us.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Return the MAPI session interface pointer.
IMAPISession* GetMAPISession() { return( m_pMAPISession);}
// Return the MAPI address book interface pointer.
IAddrBook* GetAddrBook() { return( m_pAddrBook);}
// Return the MAPI address book container interface pointer.
IABContainer* GetABContainer() { return( m_pABContainer);}
// Return the name of computer on which the gateway runs, when applicable.
LPWSTR GetComputerName() { return( m_pAdminObjectInfo->szComputerName);}
// Return the distinguished name of the object administered.
LPWSTR GetDN() { return( m_pAdminObjectInfo->szDistinguishedName);}
// Return the distinguished name of the server running the home message database.
LPWSTR GetDNHomeMDB() { return( m_pAdminObjectInfo->szDNHomeMDB);}
// Return the distinguished name of the server running the home message transport agent.
LPWSTR GetDNHomeMTA() { return( m_pAdminObjectInfo->szDNHomeMTA);}
// Return the language id.
static LANGID GetLanguageId() { return( LANGIDFROMLCID(m_lcid));}
static void SetLcid(LCID lcid);
// Return font in use by Admin.
HFONT GetAdminFont() { return( m_pAdminObjectInfo->hfontDialog);}
// Return the object id. Compare this against one or more of the #defined
// constants that can be found in "adminext.h"
UINT GetObjectId() { return( m_pAdminObjectInfo->uObjectID);}
// Return a const ptr to the extension data properties.
const LPSPropValue GetExtProps() { return( m_lpExtProps);}
// Are we in read only mode?
static BOOL bIsReadOnly(){ return( m_bReadOnly);}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Your dialog need not be concerned with these members.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
protected:
// Load extension data into buffer contained in this object. This is called
// by the OnInitDialog() and OnChildActivate() functions of this class so
// you will probably not want to call this in your code.
HRESULT HrLoadExtData();
// Save extension data buffer that is contained in this object. This is called
// by the bCommitData function of this class so you will probably not want
// to call this in your code.
HRESULT HrSaveExtData();
public:
static VOID ADMIN_Initialize( ADMIN_AdministratorConnections*, ADMIN_AdministratorFunction*);
private:
UINT m_iddDialog; // The resource ID of your dialog.
UINT m_idsName; // The resource ID of the string containing the name
// used by admin for the tab of your property sheet.
LPWSTR m_lpwszBlobName;// Name of extension data blob (if there is one).
ULONG m_cExtData; // Count of extension data blob.
LPBYTE m_lpbExtData; // Extension data blob.
ULONG m_cExtProps; // Count of extension data properties.
LPSPropValue m_lpExtProps; // Ptr to extension data properties.
static CPtrList m_DlgList; // List of dialog instances derived from this class.
static IMAPISession* m_pMAPISession; // The MAPI session handle opened by admin.
static IAddrBook* m_pAddrBook; // The MAPI Address book opened by admin.
static IABContainer* m_pABContainer; // The MAPI Address Book Container opened by admin.
static ADMIN_SheetInfo* m_pSheetInfo; // Dynamic information used by admin.
static ADMIN_ObjectInfo* m_pAdminObjectInfo; // Admin server name and other useful DNs.
static ADMIN_AdministratorFunction* m_pAdminFunctions; // Admin functions available to you.
static BOOL m_bReadOnly; // Open property sheets in read only mode.
static LCID m_lcid; // LCID to be used
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Finds the CAdminDialog derived object using a handle to the dialog's window.
static CAdminDialog* FindDlg( HWND hDlg);
// Helper functions to access protected and private data.
static BOOL bInitSheet( ADMIN_ObjectInfo* poi, ULONG fFlags, ADMIN_SheetInfo** ppsi, UINT* pcsi, VOID** ppNotUsed);
static void DeinitSheet( IN VOID* pNotUsed);
// Called directly by the Exchange Administrator program.
friend BOOL PASCAL bInstallExtension(ADMIN_ObjectInfo* poi);
friend BOOL PASCAL bDeinstallExtension(ADMIN_ObjectInfo* poi);
friend BOOL PASCAL bInitSheet( ADMIN_ObjectInfo* poi, ULONG fFlags, ADMIN_SheetInfo** ppsi, UINT* pcsi, VOID** ppNotUsed);
friend BOOL PASCAL bShowPage( UINT iddAdminPage);
friend INT PASCAL iStartPage( void);
friend BOOL PASCAL bSaveData(VOID*, HWND);
friend BOOL PASCAL bCommitData(VOID*, HWND);
friend VOID PASCAL DeinitSheet(VOID*);
friend BOOL PASCAL bHasHelp(VOID*, HWND);
friend VOID PASCAL DoHelp(VOID*, HWND);
// -----------------------------------------------------------------------------
// Check function stuff
// -----------------------------------------------------------------------------
__inline HRESULT CHK_HrExtData(
ULONG iProp, // Index of property.
ULONG ulPropType) // Property type expected.
{
if( iProp >= m_cExtProps)
RETURN( E_INVALIDARG);
// Sanity check that should never fail.
if( !TEST_READ_PTR( m_lpExtProps, sizeof( SPropValue) * m_cExtProps))
RETURN( E_FAIL);
// Make sure we have the property type we are expecting.
if( PROP_TYPE( m_lpExtProps[ iProp].ulPropTag) != ulPropType)
RETURN( E_FAIL);
return( NOERROR);
}
// -----------------------------------------------------------------------------
__inline HRESULT CHK_HrModExtBin(
IN ULONG iProp, // Index of property
IN ULONG cb, // Count of new data bytes.
IN LPBYTE lpNew) // New data bytes.
{
HRESULT hr = CHK_HrExtData( iProp, PT_BINARY);
if( FAILED( hr))
return( hr);
if( cb == 0)
RETURN( E_INVALIDARG);
if( !TEST_READ_PTR( lpNew, cb))
RETURN( E_INVALIDARG);
return( NOERROR);
}
// -----------------------------------------------------------------------------
__inline HRESULT CHK_HrModExtString(
IN ULONG iProp, // Index of property
IN LPCSTR lpszNew) // New data string.
{
HRESULT hr = CHK_HrExtData( iProp, PT_STRING8);
if( FAILED( hr))
return( hr);
if( !TEST_STRING_PTR( lpszNew))
RETURN( E_INVALIDARG);
return( NOERROR);
}
// -----------------------------------------------------------------------------
__inline HRESULT CHK_HrSetExtProps(
ULONG cExtProps, // Count of extension data properties.
LPSPropValue lpExtProps) // Array of properties to set extension data to.
{
if( cExtProps == 0)
RETURN( E_INVALIDARG);
if( !TEST_READ_PTR( lpExtProps, sizeof( SPropValue) * cExtProps))
RETURN( E_INVALIDARG);
if( m_lpwszBlobName == NULL)
RETURN( E_FAIL); // There must be a blob name to use this function.
return( NOERROR);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Class wizard stuff.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public:
//{{AFX_DATA(CAdminDialog)
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
protected:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAdminDialog)
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CAdminDialog)
virtual BOOL OnInitDialog();
afx_msg LONG OnChildActivate( UINT, LONG);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// -----------------------------------------------------------------------------
// Our dialog proc calls the MFC one.
// -----------------------------------------------------------------------------
LRESULT CALLBACK AdminDlgProc(HWND, UINT, WPARAM, LPARAM lParam); // Ours
BOOL CALLBACK AfxDlgProc(HWND, UINT, WPARAM, LPARAM lParam); // MFC
// -----------------------------------------------------------------------------
#ifdef _GLOBAL_OBJECTS_
#pragma message("Declaration of global objects for: " __FILE__)
// Instance of application initialization object.
CInitDLL InitDLL(_T("InitDLL.dll"));
// Intialize static member data.
CPtrList CAdminDialog::m_DlgList(2);
ADMIN_SheetInfo* CAdminDialog::m_pSheetInfo = NULL;
ADMIN_AdministratorFunction* CAdminDialog::m_pAdminFunctions = NULL;
ADMIN_ObjectInfo* CAdminDialog::m_pAdminObjectInfo = NULL;
IMAPISession* CAdminDialog::m_pMAPISession = NULL;
IAddrBook* CAdminDialog::m_pAddrBook = NULL;
IABContainer* CAdminDialog::m_pABContainer = NULL;
BOOL CAdminDialog::m_bReadOnly = FALSE;
LCID CAdminDialog::m_lcid = MAKELCID( MAKELANGID( LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT);
#else // ! _GLOBAL_OBJECTS_
extern CInitDLL InitDLL;
#endif //_GLOBAL_OBJECTS_
// -----------------------------------------------------------------------------
#pragma option pop /*P_O_Pop*/
#endif //_EXADMIN_H_