/* * _ M A P I U . H * * Non-public MACROs and FUNCTIONs which may be used by MAPI * * Used in conjunction with routines found in MAPIU.DLL. * * Copyright 1992-93 Microsoft Corporation. All Rights Reserved. */ #ifndef _MAPIU_H #define _MAPIU_H #ifdef __cplusplus extern "C" { #endif extern CRITICAL_SECTION csUnkobjInit; /* Macros provided by MAPIU */ #ifndef CharSizeOf #define CharSizeOf(x) (sizeof(x) / sizeof(x[0])) #endif // Alignment #define AlignN(n, x) (((x)+(1<<(n))-1) & ~((1<<(n))-1)) #define Align2(x) AlignN(1,(x)) #define Align4(x) AlignN(2,(x)) #define Align8(x) AlignN(3,(x)) #if defined (_AMD64_) || defined (_IA64_) #define AlignNatural(cb) Align8(cb) #elif defined (WIN32) #define AlignNatural(cb) Align4(cb) #else // defined (WIN16) #define AlignNatural(cb) Align2(cb) #endif #define FIsAligned(p) (AlignNatural((ULONG_PTR)((LPVOID)p)) == (ULONG_PTR)((LPVOID)p)) #define FIsAlignedCb(cb) (AlignNatural((ULONG_PTR)(cb)) == (ULONG_PTR)(cb)) /* Prototypes for private math functions */ STDAPI_(DWORD) DwDivFtDw( FILETIME ftDividend, DWORD dwDivisor); VOID VSzFromIDS(ULONG ulIDS, UINT uncchBuffer, LPWSTR lpszBuffer, ULONG ulFlags); /* Prototype for LoadString wrapper * Utility to allocate memory and loadstring and string IDS, ANSI/UNICODE. */ #define MAX_CCH_IDS 256 SCODE ScStringFromIDS( LPALLOCATEBUFFER lpMapiAllocBuffer, ULONG ulFlags, UINT ids, LPTSTR * lppszIDS ); /* Prototypes for Message and Dialog Box utilities. */ SCODE ScMessageBoxIDS( ULONG ulUIParam, UINT idsCaption, UINT idsMessage, UINT uMBType); /* Prototypes for MAPI status utilities. */ BOOL FProfileLoggedOn( LPSTR szProfileName); /* Prototypes for functions used to validate complex parameters. */ #ifndef __cplusplus #define FBadIfacePtr(param, iface) \ ( IsBadReadPtr((param), sizeof(iface)) \ || IsBadReadPtr((param)->lpVtbl, sizeof(iface##Vtbl))) #else #define FBadIfacePtr(param, iface) (FALSE) #endif /* * FBadDelPTA * * Returns TRUE if the given Prop Tag Array is readable and contains only * prop tags which are valid for a DeleteProps (or related) call. */ STDAPI_(BOOL) FBadDelPTA(LPSPropTagArray lpPropTagArray); #ifndef WIN16 // WIN16 C compiler doesn't support INLINE functions. /* * IListedPropID * * Purpose * If a tag with ID == PROP_ID(ulPropTag) is listed in lptaga then * the index of tag is returned. If the tag is not in lptaga then * -1 is returned. * * Arguments * ulPropTag Property tag to locate. * lptaga Property tag array to search. * * Returns TRUE or FALSE */ _inline LONG_PTR IListedPropID( ULONG ulPropTag, LPSPropTagArray lptaga) { UNALIGNED ULONG FAR *lpulPTag; /* No tag is contained in a NULL list of tags. */ if (!lptaga) { return -1; } /* Mutate ulPropTag to just a PROP_ID. */ ulPropTag = PROP_ID(ulPropTag); for ( lpulPTag = lptaga->aulPropTag + lptaga->cValues ; --lpulPTag >= lptaga->aulPropTag ; ) { /* Compare PROP_ID's. */ if (PROP_ID(*lpulPTag) == ulPropTag) { return (lpulPTag - lptaga->aulPropTag); } } return -1; } /* * FListedPropID * * Purpose * Determine if a tag with ID == PROP_ID(ulPropTag) is listed in lptaga. * * Arguments * ulPropTag Property tag to locate. * lptaga Property tag array to search. * * Returns TRUE or FALSE */ _inline BOOL FListedPropID( ULONG ulPropTag, LPSPropTagArray lptaga) { UNALIGNED ULONG FAR *lpulPTag; /* No tag is contained in a NULL list of tags. */ if (!lptaga) { return FALSE; } /* Mutate ulPropTag to just a PROP_ID. */ ulPropTag = PROP_ID(ulPropTag); for ( lpulPTag = lptaga->aulPropTag + lptaga->cValues ; --lpulPTag >= lptaga->aulPropTag ; ) { /* Compare PROP_ID's. */ if (PROP_ID(*lpulPTag) == ulPropTag) { return TRUE; } } return FALSE; } /* * FListedPropTAG * * Purpose * Determine if a the given ulPropTag is listed in lptaga. * * Arguments * ulPropTag Property tag to locate. * lptaga Property tag array to search. * * Returns TRUE or FALSE */ _inline BOOL FListedPropTAG( ULONG ulPropTag, LPSPropTagArray lptaga) { UNALIGNED ULONG FAR *lpulPTag; /* No tag is contained in a NULL list of tags. */ if (!lptaga) { return FALSE; } /* Compare the entire prop tag to be sure both ID and TYPE match */ for ( lpulPTag = lptaga->aulPropTag + lptaga->cValues ; --lpulPTag >= lptaga->aulPropTag ; ) { /* Compare PROP_ID's. */ if (PROP_ID(*lpulPTag) == ulPropTag) { return TRUE; } } return FALSE; } /* * AddProblem * * Purpose * Adds a problem to the next available entry of a pre-allocated problem * array. * The pre-allocated problem array must be big enough to have another * problem added. The caller is responsible for making sure this is * true. * * Arguments * lpProblems Pointer to pre-allocated probelem array. * ulIndex Index into prop tag/value array of the problem property. * ulPropTag Prop tag of property which had the problem. * scode Error code to list for the property. * * Returns TRUE or FALSE */ _inline VOID AddProblem( LPSPropProblemArray lpProblems, ULONG ulIndex, ULONG ulPropTag, SCODE scode) { if (lpProblems) { Assert( !IsBadWritePtr( lpProblems->aProblem + lpProblems->cProblem , sizeof(SPropProblem))); lpProblems->aProblem[lpProblems->cProblem].ulIndex = ulIndex; lpProblems->aProblem[lpProblems->cProblem].ulPropTag = ulPropTag; lpProblems->aProblem[lpProblems->cProblem].scode = scode; lpProblems->cProblem++; } } __inline BOOL FIsExcludedIID( LPCIID lpiidToCheck, LPCIID rgiidExclude, ULONG ciidExclude) { /* Check the obvious (no exclusions). */ if (!ciidExclude || !rgiidExclude) { return FALSE; } /* Check each iid in the list of exclusions. */ for (; ciidExclude; rgiidExclude++, ciidExclude--) { // if (IsEqualGUID( lpiidToCheck, rgiidExclude)) if (!memcmp( lpiidToCheck, rgiidExclude, sizeof(MAPIUID))) { return TRUE; } } return FALSE; } /* * Error/Warning Alert Message Boxes */ int AlertIdsCtx( HWND hwnd, HINSTANCE hinst, UINT idsMsg, LPSTR szComponent, ULONG ulContext, ULONG ulLow, UINT fuStyle); __inline int AlertIds(HWND hwnd, HINSTANCE hinst, UINT idsMsg, UINT fuStyle) { return AlertIdsCtx(hwnd, hinst, idsMsg, NULL, 0, 0, fuStyle); } int AlertSzCtx( HWND hwnd, LPSTR szMsg, LPSTR szComponent, ULONG ulContext, ULONG ulLow, UINT fuStyle); __inline int AlertSz(HWND hwnd, LPSTR szMsg, UINT fuStyle) { return AlertSzCtx(hwnd, szMsg, NULL, 0, 0, fuStyle); } #else // !WIN16 LONG IListedPropID( ULONG ulPropTag, LPSPropTagArray lptaga); BOOL FListedPropID( ULONG ulPropTag, LPSPropTagArray lptaga); BOOL FListedPropTAG( ULONG ulPropTag, LPSPropTagArray lptaga); VOID AddProblem( LPSPropProblemArray lpProblems, ULONG ulIndex, ULONG ulPropTag, SCODE scode); BOOL FIsExcludedIID( LPCIID lpiidToCheck, LPCIID rgiidExclude, ULONG ciidExclude); int AlertIds(HWND hwnd, HINSTANCE hinst, UINT idsMsg, UINT fuStyle); int AlertSzCtx( HWND hwnd, LPSTR szMsg, LPSTR szComponent, ULONG ulContext, ULONG ulLow, UINT fuStyle); int AlertSz(HWND hwnd, LPSTR szMsg, UINT fuStyle); #endif // !WIN16 /* Encoding and decoding strings */ STDAPI_(void) EncodeID(LPBYTE lpb, ULONG cb, LPTSTR lpsz); STDAPI_(BOOL) FDecodeID(LPTSTR lpsz, LPBYTE lpb, ULONG FAR *lpcb); STDAPI_(ULONG) CchOfEncoding(ULONG cb); STDAPI_(ULONG) CbOfEncoded(LPTSTR lpsz); STDAPI_(int) CchEncodedLine(int cb); /* Idle engine routines */ #ifdef DEBUG /* * DumpIdleTable * * Used for debugging only. Writes information in the PGD(hftgIdle) * table to COM1. */ STDAPI_(void) DumpIdleTable (void); #endif /* * FDoNextIdleTask * * Dispatches the first eligible idle function, according to * its simple scheduling algorithm. */ STDAPI_(BOOL) FDoNextIdleTask (void); /* C runtime substitutes */ typedef int (__cdecl FNSGNCMP)(const void FAR *lpv1, const void FAR *lpv2); typedef FNSGNCMP FAR *PFNSGNCMP; FNSGNCMP SgnCmpPadrentryByType; BOOL FRKFindSubpb(LPBYTE pbTarget, ULONG cbTarget, LPBYTE pbPattern, ULONG cbPattern); BOOL FRKFindSubpsz(LPSTR pszTarget, ULONG cbTarget, LPSTR pszPattern, ULONG cbPattern, ULONG ulFuzzyLevel); LPSTR LpszRKFindSubpsz(LPSTR pszTarget, ULONG cbTarget, LPSTR pszPattern, ULONG cbPattern, ULONG ulFuzzyLevel); STDAPI_(void) ShellSort(LPVOID lpv, UINT cv, /* qsort */ LPVOID lpvT, UINT cb, PFNSGNCMP fpCmp); /* Advise list maintainence utilities */ /* * Structure and functions for maintaining a list of advise sinks, * together with the keys used to release them. */ typedef struct { LPMAPIADVISESINK lpAdvise; ULONG ulConnection; ULONG ulType; LPUNKNOWN lpParent; } ADVISEITEM, FAR *LPADVISEITEM; typedef struct { ULONG cItemsMac; ULONG cItemsMax; #if defined(WIN32) && !defined(MAC) CRITICAL_SECTION FAR * lpcs; #endif ADVISEITEM rgItems[1]; } ADVISELIST, FAR *LPADVISELIST; #define CbNewADVISELIST(_citems) \ (offsetof(ADVISELIST, rgItems) + (_citems) * sizeof(ADVISEITEM)) #define CbADVISELIST(_plist) \ (offsetof(ADVISELIST, rgItems) + (_plist)->cItemsMax * sizeof(ADVISEITEM)) STDAPI_(SCODE) ScAddAdviseList( LPVOID lpvReserved, LPADVISELIST FAR *lppList, LPMAPIADVISESINK lpAdvise, ULONG ulConnection, ULONG ulType, LPUNKNOWN lpParent); STDAPI_(SCODE) ScDelAdviseList( LPADVISELIST lpList, ULONG ulConnection); STDAPI_(SCODE) ScFindAdviseList( LPADVISELIST lpList, ULONG ulConnection, LPADVISEITEM FAR *lppItem); STDAPI_(void) DestroyAdviseList( LPADVISELIST FAR *lppList); // prototype for routine that detects whether calling apps is // an interactive EXE or a service. #if defined( _WINNT ) BOOL WINAPI IsServiceAnExe( VOID ); #endif // prototype for internal routine that computes the size required // to hold a given propval array based on specified alignment SCODE ScCountPropsEx( int cprop, LPSPropValue rgprop, ULONG ulAlign, ULONG FAR *pcb ); /* Option data handling routines */ #ifdef MAPISPI_H STDAPI_(SCODE) ScCountOptionData(LPOPTIONDATA lpOption, ULONG FAR *lpcb); STDAPI_(SCODE) ScCopyOptionData(LPOPTIONDATA lpOption, LPVOID lpvDst, ULONG FAR *lpcb); STDAPI_(SCODE) ScRelocOptionData(LPOPTIONDATA lpOption, LPVOID lpvBaseOld, LPVOID lpvBaseNew, ULONG FAR *lpcb); #endif /* MAPISPI_H */ #ifdef __cplusplus } #endif #endif // _MAPIU_H