home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1998 May
/
Pcwk5b98.iso
/
Borland
/
Cplus45
/
BC45
/
MSINC.PAK
/
MAPIVAL.H
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-29
|
16KB
|
526 lines
/*
* M A P I V A L . H
*
* Macros used to validate parameters on standard MAPI object methods.
* Used in conjunction with routines found in MAPIU.DLL.
*
* Copyright 1993-1995 Microsoft Corporation. All Rights Reserved.
*/
#ifndef _INC_VALIDATE
#define _INC_VALIDATE
#ifdef __cplusplus
extern "C" {
#endif
#ifndef MAPIUTIL_H
#include <mapiutil.h>
#endif
#include <stddef.h>
#define MAKE_ENUM(Method, Interface) Interface##_##Method
typedef enum _tagMethods
{
/* IUnknown */
MAKE_ENUM(QueryInterface, IUnknown) = 0,
MAKE_ENUM(AddRef, IUnknown), /* For completness */
MAKE_ENUM(Release, IUnknown), /* For completness */
/* IMAPIProps */
MAKE_ENUM(GetLastError, IMAPIProp),
MAKE_ENUM(SaveChanges, IMAPIProp),
MAKE_ENUM(GetProps, IMAPIProp),
MAKE_ENUM(GetPropList, IMAPIProp),
MAKE_ENUM(OpenProperty, IMAPIProp),
MAKE_ENUM(SetProps, IMAPIProp),
MAKE_ENUM(DeleteProps, IMAPIProp),
MAKE_ENUM(CopyTo, IMAPIProp),
MAKE_ENUM(CopyProps, IMAPIProp),
MAKE_ENUM(GetNamesFromIDs, IMAPIProp),
MAKE_ENUM(GetIDsFromNames, IMAPIProp),
/* IMAPITable */
MAKE_ENUM(GetLastError, IMAPITable),
MAKE_ENUM(Advise, IMAPITable),
MAKE_ENUM(Unadvise, IMAPITable),
MAKE_ENUM(GetStatus, IMAPITable),
MAKE_ENUM(SetColumns, IMAPITable),
MAKE_ENUM(QueryColumns, IMAPITable),
MAKE_ENUM(GetRowCount, IMAPITable),
MAKE_ENUM(SeekRow, IMAPITable),
MAKE_ENUM(SeekRowApprox, IMAPITable),
MAKE_ENUM(QueryPosition, IMAPITable),
MAKE_ENUM(FindRow, IMAPITable),
MAKE_ENUM(Restrict, IMAPITable),
MAKE_ENUM(CreateBookmark, IMAPITable),
MAKE_ENUM(FreeBookmark, IMAPITable),
MAKE_ENUM(SortTable, IMAPITable),
MAKE_ENUM(QuerySortOrder, IMAPITable),
MAKE_ENUM(QueryRows, IMAPITable),
MAKE_ENUM(Abort, IMAPITable),
MAKE_ENUM(ExpandRow, IMAPITable),
MAKE_ENUM(CollapseRow, IMAPITable),
MAKE_ENUM(WaitForCompletion, IMAPITable),
MAKE_ENUM(GetCollapseState, IMAPITable),
MAKE_ENUM(SetCollapseState, IMAPITable),
/* IMAPIContainer */
MAKE_ENUM(GetContentsTable, IMAPIContainer),
MAKE_ENUM(GetHierarchyTable, IMAPIContainer),
MAKE_ENUM(OpenEntry, IMAPIContainer),
MAKE_ENUM(SetSearchCriteria, IMAPIContainer),
MAKE_ENUM(GetSearchCriteria, IMAPIContainer),
/* IABContainer */
MAKE_ENUM(CreateEntry, IABContainer),
MAKE_ENUM(CopyEntries, IABContainer),
MAKE_ENUM(DeleteEntries, IABContainer),
MAKE_ENUM(ResolveNames, IABContainer),
/* IDistList */
MAKE_ENUM(CreateEntry, IDistList),
MAKE_ENUM(CopyEntries, IDistList),
MAKE_ENUM(DeleteEntries, IDistList),
MAKE_ENUM(ResolveNames, IDistList),
/* IMAPIFolder */
MAKE_ENUM(CreateMessage, IMAPIFolder),
MAKE_ENUM(CopyMessages, IMAPIFolder),
MAKE_ENUM(DeleteMessages, IMAPIFolder),
MAKE_ENUM(CreateFolder, IMAPIFolder),
MAKE_ENUM(CopyFolder, IMAPIFolder),
MAKE_ENUM(DeleteFolder, IMAPIFolder),
MAKE_ENUM(SetReadFlags, IMAPIFolder),
MAKE_ENUM(GetMessageStatus, IMAPIFolder),
MAKE_ENUM(SetMessageStatus, IMAPIFolder),
MAKE_ENUM(SaveContentsSort, IMAPIFolder),
MAKE_ENUM(EmptyFolder, IMAPIFolder),
/* IMsgStore */
MAKE_ENUM(Advise, IMsgStore),
MAKE_ENUM(Unadvise, IMsgStore),
MAKE_ENUM(CompareEntryIDs, IMsgStore),
MAKE_ENUM(OpenEntry, IMsgStore),
MAKE_ENUM(SetReceiveFolder, IMsgStore),
MAKE_ENUM(GetReceiveFolder, IMsgStore),
MAKE_ENUM(GetReceiveFolderTable, IMsgStore),
MAKE_ENUM(StoreLogoff, IMsgStore),
MAKE_ENUM(AbortSubmit, IMsgStore),
MAKE_ENUM(GetOutgoingQueue, IMsgStore),
MAKE_ENUM(SetLockState, IMsgStore),
MAKE_ENUM(FinishedMsg, IMsgStore),
MAKE_ENUM(NotifyNewMail, IMsgStore),
/* IMessage */
MAKE_ENUM(GetAttachmentTable, IMessage),
MAKE_ENUM(OpenAttach, IMessage),
MAKE_ENUM(CreateAttach, IMessage),
MAKE_ENUM(DeleteAttach, IMessage),
MAKE_ENUM(GetRecipientTable, IMessage),
MAKE_ENUM(ModifyRecipients, IMessage),
MAKE_ENUM(SubmitMessage, IMessage),
MAKE_ENUM(SetReadFlag, IMessage),
/* IABProvider */
MAKE_ENUM(Shutdown, IABProvider),
MAKE_ENUM(Logon, IABProvider),
/* IABLogon */
MAKE_ENUM(GetLastError, IABLogon),
MAKE_ENUM(Logoff, IABLogon),
MAKE_ENUM(OpenEntry, IABLogon),
MAKE_ENUM(CompareEntryIDs, IABLogon),
MAKE_ENUM(Advise, IABLogon),
MAKE_ENUM(Unadvise, IABLogon),
MAKE_ENUM(OpenStatusEntry, IABLogon),
MAKE_ENUM(OpenTemplateID, IABLogon),
MAKE_ENUM(GetOneOffTable, IABLogon),
MAKE_ENUM(PrepareRecips, IABLogon),
/* IXPProvider */
MAKE_ENUM(Shutdown, IXPProvider),
MAKE_ENUM(TransportLogon, IXPProvider),
/* IXPLogon */
MAKE_ENUM(AddressTypes, IXPLogon),
MAKE_ENUM(RegisterOptions, IXPLogon),
MAKE_ENUM(TransportNotify, IXPLogon),
MAKE_ENUM(Idle, IXPLogon),
MAKE_ENUM(TransportLogoff, IXPLogon),
MAKE_ENUM(SubmitMessage, IXPLogon),
MAKE_ENUM(EndMessage, IXPLogon),
MAKE_ENUM(Poll, IXPLogon),
MAKE_ENUM(StartMessage, IXPLogon),
MAKE_ENUM(OpenStatusEntry, IXPLogon),
MAKE_ENUM(ValidateState, IXPLogon),
MAKE_ENUM(FlushQueues, IXPLogon),
/* IMSProvider */
MAKE_ENUM(Shutdown, IMSProvider),
MAKE_ENUM(Logon, IMSProvider),
MAKE_ENUM(SpoolerLogon, IMSProvider),
MAKE_ENUM(CompareStoreIDs, IMSProvider),
/* IMSLogon */
MAKE_ENUM(GetLastError, IMSLogon),
MAKE_ENUM(Logoff, IMSLogon),
MAKE_ENUM(OpenEntry, IMSLogon),
MAKE_ENUM(CompareEntryIDs, IMSLogon),
MAKE_ENUM(Advise, IMSLogon),
MAKE_ENUM(Unadvise, IMSLogon),
MAKE_ENUM(OpenStatusEntry, IMSLogon),
/* IMAPIControl */
MAKE_ENUM(GetLastError, IMAPIControl),
MAKE_ENUM(Activate, IMAPIControl),
MAKE_ENUM(GetState, IMAPIControl),
/* IMAPIStatus */
MAKE_ENUM(ValidateState, IMAPIStatus),
MAKE_ENUM(SettingsDialog, IMAPIStatus),
MAKE_ENUM(ChangePassword, IMAPIStatus),
MAKE_ENUM(FlushQueues, IMAPIStatus),
/* IStream */
MAKE_ENUM(Read, IStream),
MAKE_ENUM(Write, IStream),
MAKE_ENUM(Seek, IStream),
MAKE_ENUM(SetSize, IStream),
MAKE_ENUM(CopyTo, IStream),
MAKE_ENUM(Commit, IStream),
MAKE_ENUM(Revert, IStream),
MAKE_ENUM(LockRegion, IStream),
MAKE_ENUM(UnlockRegion, IStream),
MAKE_ENUM(Stat, IStream),
MAKE_ENUM(Clone, IStream),
/* IMAPIAdviseSink */
MAKE_ENUM(OnNotify, IMAPIAdviseSink),
} METHODS;
/* Macro wrappers to hide the Validate function return handling */
#ifdef __cplusplus
/* C++ methods can't take the address of the This pointer, so we must
use the first parameter instead */
#define ValidateParameters(eMethod, First) \
{ HRESULT hr; \
hr = __CPPValidateParameters(eMethod, (LPVOID) &First); \
if (HR_FAILED(hr)) return (hr); }
#define UlValidateParameters(eMethod, First) \
{ HRESULT hr; \
hr = __CPPValidateParameters(eMethod, &First); \
if (HR_FAILED(hr)) return (ULONG) (hr); }
/* Methods called by MAPI should have correct parameters
- just assert in Debug to check */
#define CheckParameters(eMethod, First) \
AssertSz(HR_SUCCEEDED(__CPPValidateParameters(eMethod, &First)), "Parameter validation failed for method called by MAPI!")
#else /* __cplusplus */
/* For methods that will be called by clients
- validate always */
#define ValidateParameters(eMethod, ppThis) \
{ HRESULT hr; \
hr = __ValidateParameters(eMethod, ppThis); \
if (HR_FAILED(hr)) return (hr); }
#define UlValidateParameters(eMethod, ppThis) \
{ HRESULT hr; \
hr = __ValidateParameters(eMethod, ppThis); \
if (HR_FAILED(hr)) return (ULONG) (hr); }
/* Methods called by MAPI should have correct parameters
- just assert in Debug to check */
#define CheckParameters(eMethod, ppThis) \
AssertSz(HR_SUCCEEDED(__ValidateParameters(eMethod, ppThis)), "Parameter validation failed for method called by MAPI!")
#endif /* __cplusplus */
/* Prototypes for functions used to validate complex parameters.
*/
#define FBadPropVal( lpPropVal) (FAILED(ScCountProps( 1, lpPropVal, NULL)))
#define FBadRgPropVal( lpPropVal, cValues) \
(FAILED(ScCountProps( cValues, lpPropVal, NULL)))
#define FBadAdrList( lpAdrList) \
( AssertSz( ( offsetof( ADRLIST, cEntries) \
== offsetof( SRowSet, cRows)) \
&& ( offsetof( ADRLIST, aEntries) \
== offsetof( SRowSet, aRow)) \
&& ( offsetof( ADRENTRY, cValues) \
== offsetof( SRow, cValues)) \
&& ( offsetof( ADRENTRY, rgPropVals) \
== offsetof( SRow, lpProps)) \
, "ADRLIST doesn't match SRowSet") \
|| FBadRowSet( (LPSRowSet) lpAdrList))
STDAPI_(BOOL)
FBadRglpszW( LPWSTR FAR *lppszW,
ULONG cStrings);
STDAPI_(BOOL)
FBadRowSet( LPSRowSet lpRowSet);
STDAPI_(BOOL)
FBadRglpNameID( LPMAPINAMEID FAR * lppNameId,
ULONG cNames);
STDAPI_(BOOL)
FBadEntryList( LPENTRYLIST lpEntryList);
/* BAD_STANDARD_OBJ
*
* This macro insures that the object is a writable object of the correct size
* and that this method belongs to the object.
*
* NOTES ON USE!
* This depends upon using the standard method of declaring the object
* interface.
*
* prefix is the method prefix you chose when declaring the object interface.
* method is the standard method name of the calling method.
* lpVtbl is the name of the lpVtbl element of your object.
*/
#define BAD_STANDARD_OBJ( lpObj, prefix, method, lpVtbl) \
( IsBadWritePtr( (lpObj), sizeof(*lpObj)) \
|| IsBadReadPtr( (void *) &(lpObj->lpVtbl->method), sizeof(LPVOID)) \
|| ((LPVOID) (lpObj->lpVtbl->method) != (LPVOID) (prefix##method)))
#define FBadUnknown( lpObj ) \
( IsBadReadPtr( (lpObj), sizeof(LPVOID) ) \
|| IsBadReadPtr( (lpObj)->lpVtbl, 3 * sizeof(LPUNKNOWN) ) \
|| IsBadCodePtr( (FARPROC)(lpObj)->lpVtbl->QueryInterface ))
/*
* IUnknown
*/
/*
* QueryInterface
*/
#define FBadQueryInterface( lpObj, riid, ppvObj) \
( IsBadReadPtr( riid, sizeof(IID)) \
|| IsBadWritePtr( ppvObj, sizeof(LPVOID)))
/*
* AddRef
* No parameter validation required.
*/
#define FBadAddRef( lpObj) FALSE
/*
* Release
* No parameter validation required.
*/
#define FBadRelease( lpObj) FALSE
/*
* GetLastError
*/
#define FBadGetLastError( lpObj, hResult, ulFlags, lppMAPIError )\
(IsBadWritePtr( lppMAPIError, sizeof(LPMAPIERROR)))
/*
* IMAPIProp
*/
/*
* SaveChanges
* No parameter validation required.
*/
#define FBadSaveChanges( lpObj, ulFlags) FALSE
/*
* GetProps
*/
#define FBadGetProps( lpObj, lpPTagA, lpcValues, lppPropArray) \
( ( lpPTagA \
&& ( IsBadReadPtr( lpPTagA, sizeof(ULONG)) \
|| IsBadReadPtr( lpPTagA, (UINT)( (lpPTagA->cValues + 1) \
* sizeof(ULONG))))) \
|| IsBadWritePtr( lpcValues, sizeof(ULONG)) \
|| IsBadWritePtr( lppPropArray, sizeof(LPSPropValue)))
/*
* GetPropList
*/
#define FBadGetPropList( lpObj, lppPTagA) \
(IsBadWritePtr( lppPTagA, sizeof(LPSPropTagArray FAR *)))
/*
* OpenProperty
*/
#define FBadOpenProperty( lpObj, ulPropTag, lpiid, ulInterfaceOptions, ulFlags \
, lppUnk) \
( IsBadReadPtr( lpiid, sizeof(IID)) \
|| IsBadWritePtr( lppUnk, sizeof (LPUNKNOWN FAR *)))
/*
* SetProps
*/
#define FBadSetProps( lpObj, cValues, lpPropArray, lppProblems) \
( FBadRgPropVal( lpPropArray, (UINT) cValues) \
|| ( lppProblems \
&& IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray))))
/*
* DeleteProps
*/
#define FBadDeleteProps( lpObj, lpPTagA, lppProblems) \
( ( !lpPTagA \
|| ( IsBadReadPtr( lpPTagA, sizeof(ULONG)) \
|| IsBadReadPtr( lpPTagA, (UINT)( (lpPTagA->cValues + 1) \
* sizeof(ULONG))))) \
|| ( lppProblems \
&& IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray))))
/*
* CopyTo
*/
#define FBadCopyTo( lpIPDAT, ciidExclude, rgiidExclude, lpExcludeProps \
, ulUIParam, lpProgress, lpInterface, lpDestObj \
, ulFlags, lppProblems) \
( ( ciidExclude \
&& ( IsBadReadPtr( rgiidExclude, (UINT)(ciidExclude * sizeof(IID))))) \
|| ( lpExcludeProps \
&& ( IsBadReadPtr( lpExcludeProps, sizeof(ULONG)) \
|| IsBadReadPtr( lpExcludeProps \
, (UINT)( (lpExcludeProps->cValues + 1) \
* sizeof(ULONG))))) \
|| (lpProgress && FBadUnknown( lpProgress )) \
|| (lpInterface && IsBadReadPtr( lpInterface, sizeof(IID))) \
|| IsBadReadPtr( lpDestObj, sizeof(LPVOID)) \
|| ( lppProblems \
&& IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray))))
/*
* CopyProps
*/
#define FBadCopyProps( lpIPDAT, lpPropTagArray \
, ulUIParam, lpProgress, lpInterface, lpDestObj \
, ulFlags, lppProblems) \
( ( lpPropTagArray \
&& ( IsBadReadPtr( lpPropTagArray, sizeof(ULONG)) \
|| IsBadReadPtr( lpPropTagArray \
, (UINT)( (lpPropTagArray->cValues + 1) \
* sizeof(ULONG))))) \
|| (lpProgress && FBadUnknown( lpProgress )) \
|| (lpInterface && IsBadReadPtr( lpInterface, sizeof(IID))) \
|| IsBadReadPtr( lpDestObj, sizeof(LPVOID)) \
|| ( lppProblems \
&& IsBadWritePtr( lppProblems, sizeof(LPSPropProblemArray))))
/*
* GetNamesFromIDs
*/
#define FBadGetNamesFromIDs( lpIPDAT, lppPropTags, lpPropSetGuid, ulFlags, \
lpcPropNames, lpppPropNames) \
( IsBadReadPtr( lppPropTags, sizeof(LPSPropTagArray)) \
|| ( lpPropSetGuid && IsBadReadPtr( lpPropSetGuid, sizeof(GUID))) \
|| ( *lppPropTags \
&& ( IsBadReadPtr( *lppPropTags, sizeof(ULONG)) \
|| IsBadReadPtr( *lppPropTags \
, (UINT)( ((*lppPropTags)->cValues + 1) \
* sizeof(ULONG))))) \
|| IsBadWritePtr( lpcPropNames, sizeof (ULONG)) \
|| IsBadWritePtr( lpppPropNames, sizeof (LPVOID FAR *)))
/*
* GetNamesFromIDs
*/
#define FBadGetIDsFromNames( lpIPDAT, cPropNames, lppPropNames, ulFlags \
, lppPropTags) \
( (cPropNames && FBadRglpNameID( lppPropNames, cPropNames)) \
|| IsBadWritePtr( lppPropTags, sizeof(LPULONG FAR *)))
STDAPI_(ULONG)
FBadRestriction( LPSRestriction lpres );
STDAPI_(ULONG)
FBadPropTag( ULONG ulPropTag );
STDAPI_(ULONG)
FBadRow( LPSRow lprow );
STDAPI_(ULONG)
FBadProp( LPSPropValue lpprop );
STDAPI_(ULONG)
FBadSortOrderSet( LPSSortOrderSet lpsos );
STDAPI_(ULONG)
FBadColumnSet( LPSPropTagArray lpptaCols );
/* Validation function
The eMethod parameter tells us which internal validation to perform.
The ppThis parameter tells us where the stack is, so we can access the other
parameters.
Becuase of this *magic* we MUST obtain the pointer to the This pointer in
the method function.
*/
#ifdef WIN16
#define BASED_STACK __based(__segname("_STACK"))
#else
#define BASED_STACK
#endif
#ifdef WIN16
HRESULT PASCAL
#else
HRESULT STDAPICALLTYPE
#endif
__CPPValidateParameters(METHODS eMethod, const LPVOID ppFirst);
#ifdef WIN16
HRESULT PASCAL
#else
HRESULT STDAPICALLTYPE
#endif
__ValidateParameters(METHODS eMethod, LPVOID ppThis);
#ifdef __cplusplus
}
#endif
#endif /* _INC_VALIDATE */