586 lines
25 KiB
C
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_
|