//	Keep the base members common across all the MAPIX objects such that
//	code reuse is leveraged.  AddRef(), Release() and GetLastError() assume
//	that the BASE members are the first set of members in the object
//
#define MAPIX_BASE_MEMBERS(_type)												\
	_type##_Vtbl *		lpVtbl;				/* object method table	*/			\
																				\
	ULONG				cIID;				/* count of interfaces supported */	\
	LPIID *				rglpIID;			/* array of &interfaces supported */\
	ULONG				lcInit;				/* refcount */						\
	CRITICAL_SECTION	cs;					/* critical section memory */		\
																				\
	HRESULT				hLastError;			/* for MAPI_GetLastError */			\
	UINT				idsLastError;		/* for MAPI_GetLastError */			\
	LPTSTR				lpszComponent;		/* for MAPI_GetLastError */			\
	ULONG				ulContext;			/* for MAPI_GetLastError */			\
	ULONG				ulLowLevelError;	/* for MAPI_GetLastError */			\
	ULONG				ulErrorFlags;		/* for MAPI_GetLastError */			\
	LPMAPIERROR			lpMAPIError;		/* for MAPI_GetLastError */			\


//
//  Function prototypes
//
//  Those not mentioned use IAB_methods


#undef	INTERFACE
#define INTERFACE	struct _WRAP

#undef  MAPIMETHOD_
#define	MAPIMETHOD_(type, method)	MAPIMETHOD_DECLARE(type, method, WRAP_)
		MAPI_IUNKNOWN_METHODS(IMPL)
		MAPI_IMAPIPROP_METHODS(IMPL)
#undef  MAPIMETHOD_
#define	MAPIMETHOD_(type, method)	MAPIMETHOD_TYPEDEF(type, method, WRAP_)
		MAPI_IUNKNOWN_METHODS(IMPL)
		MAPI_IMAPIPROP_METHODS(IMPL)
#undef  MAPIMETHOD_
#define MAPIMETHOD_(type, method)	STDMETHOD_(type, method)

DECLARE_MAPI_INTERFACE(WRAP_)
{
	BEGIN_INTERFACE
	MAPI_IUNKNOWN_METHODS(IMPL)
	MAPI_IMAPIPROP_METHODS(IMPL)
};

typedef struct _WRAP {

	MAPIX_BASE_MEMBERS(WRAP)
	LPPROPDATA lpPropData;

} WRAP, *LPWRAP;
#define CBWRAP sizeof(WRAP)





//
//  One-Off from object from an entryid
//
typedef struct _OOP {

	MAPIX_BASE_MEMBERS(WRAP)
	LPPROPDATA lpPropData;
	ULONG fUnicodeEID;
	
} OOP, *LPOOP;
#define CBOOP sizeof(OOP)

//
//  Entry point to create a new OOP MAPIProp object from a OO entryid
//

HRESULT NewOOP ( LPENTRYID lpEntryID,
				 ULONG cbEntryID,
				 LPCIID lpInterface,
				 ULONG ulOpenFlags,
				 LPVOID lpIAB,
				 ULONG *lpulObjType,
				 LPVOID *lppOOP,
				 UINT *lpidsError );


HRESULT NewOOPUI ( LPENTRYID lpEntryID,
				 ULONG cbEntryID,
				 LPCIID lpInterface,
				 ULONG ulOpenFlags,
				 LPIAB lpIAB,
				 ULONG *lpulObjType,
				 LPVOID *lppOOP,
				 UINT *lpidsError );


//
//  Entry point to programmatically create a new OO entry from a
//  foreign template...
//
//  The end result is a OO entryid (no attatched details, yet...)
//
typedef struct _OOE {

	MAPIX_BASE_MEMBERS(WRAP)
	LPPROPDATA lpPropData;
	ULONG fUnicodeEID;

	//
	//  New stuff
	//
	LPMAPIPROP lpPropTID;
	
} OOE, *LPOOE;
#define CBOOE sizeof(OOE)

HRESULT HrCreateNewOOEntry(	LPVOID lpROOT,
							ULONG cbEntryID,
							LPENTRYID lpEntryID,
							ULONG ulCreateFlags,
							LPMAPIPROP FAR * lppMAPIPropEntry );