//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: ref.hxx // // Contents: Reference implementation headers // //---------------------------------------------------------------------------- #ifndef __REF_HXX__ #define __REF_HXX__ #include #include #include #ifdef _WIN32 #include #include #endif #define FARSTRUCT #define interface struct #define DECLARE_INTERFACE(iface) interface iface #define DECLARE_INTERFACE_(iface, baseiface) interface iface: public baseiface typedef long SCODE; typedef long HRESULT; #define NOERROR 0 #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C extern #endif #define PURE = 0 #ifdef _MSC_VER #define STDCALL __stdcall #define STDMETHODCALLTYPE __stdcall #define EXPORTDLL _declspec(dllexport) #else // _MSC_VER #define STDCALL #define EXPORTDLL #define STDMETHODCALLTYPE #endif // _MSC_VER #define STDMETHODIMP HRESULT STDCALL #define STDMETHODIMP_(type) type STDCALL #define STDMETHOD(method) virtual HRESULT STDCALL method #define STDMETHOD_(type, method) virtual type STDCALL method #define STDAPI HRESULT EXPORTDLL STDCALL #define STDAPICALLTYPE STDCALL #define STDAPI_(type) type EXPORTDLL STDCALL #define THIS_ #define THIS void #define FAR typedef int BOOL, *LPBOOL; typedef BOOL BOOLEAN; typedef unsigned char BYTE; typedef char CHAR, *PCHAR; typedef unsigned char UCHAR; typedef unsigned short WORD; typedef unsigned int UINT; typedef int INT; typedef long LONG; typedef unsigned long DWORD; typedef short SHORT; typedef unsigned short USHORT; typedef DWORD ULONG; typedef void VOID; typedef WORD WCHAR; typedef LONG NTSTATUS, *PNTSTATUS; // NOTE: // for other compilers some form of 64 bit integer support // has to be provided #ifdef __GNUC__ typedef long long int LONGLONG; typedef unsigned long long int ULONGLONG; #endif #ifdef _MSC_VER typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; #endif typedef void *LPVOID; typedef char *LPSTR; typedef const char *LPCSTR; #define TRUE 1 #define FALSE 0 #ifndef _WIN32 // stuff declared in Windows but not in Unix #define _HEAP_MAXREQ 0xFFFFFFE0 #define _MAX_PATH 1024 #endif // _WIN32 const ULONG MAX_ULONG = 0xFFFFFFFF; const USHORT USHRT_MAX = 0xFFFF; #define MAXULONG MAX_ULONG #define MAX_PATH _MAX_PATH typedef struct _ULARGE_INTEGER { DWORD LowPart; DWORD HighPart; } ULARGE_INTEGER, *PULARGE_INTEGER; #define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v)) typedef struct _LARGE_INTEGER { DWORD LowPart; LONG HighPart; } LARGE_INTEGER, *PLARGE_INTEGER; #define LISet32(li, v) ((li).HighPart = ((LONG)(v)) < 0 ? -1 : 0, (li).LowPart = (v)) typedef struct tagGUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } GUID; typedef GUID CLSID; typedef GUID IID; #define REFGUID const GUID & #define REFIID const IID & #define REFCLSID const CLSID & DECLARE_INTERFACE(IUnknown) { STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; }; #include "storage.h" #define S_OK 0L #define MAKE_SCODE(sev,fac,code) \ ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | \ ((unsigned long)(code))) ) #define SEVERITY_SUCCESS 0 #define SEVERITY_ERROR 1 #define FACILITY_STORAGE 0x0003 // storage errors (STG_E_*) #define FACILITY_WIN32 0x0007 #define FACILITY_NULL 0x0000 #define FACILITY_NT_BIT 0x10000000 #define HRESULT_FROM_WIN32(x) \ (x ? ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) \ | 0x80000000)) : 0 ) #define WIN32_SCODE(err) HRESULT_FROM_WIN32(err) #define HRESULT_FROM_NT(x) ((HRESULT) ((x) | FACILITY_NT_BIT)) #define S_TRUE 0L #define S_FALSE MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_NULL, 1) #define E_OUTOFMEMORY MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 2) #define E_INVALIDARG MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 3) #define E_NOINTERFACE MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 4) #define E_FAIL MAKE_SCODE(SEVERITY_ERROR, FACILITY_NULL, 8) #define ERROR_DIR_NOT_EMPTY 145L #define ERROR_NO_UNICODE_TRANSLATION 1113L #define SUCCEEDED(Status) ((SCODE)(Status) >= 0) #define FAILED(Status) ((SCODE)(Status)<0) //#define GetScode(hr) ((SCODE)(hr) & 0x800FFFFF) //#define ResultFromScode(sc) ((HRESULT)((SCODE)(sc) & 0x800FFFFF)) #define ResultFromScode(sc) ((HRESULT) (sc)) #define GetScode(hr) ((SCODE) (hr)) /************** GUID's **************************************************/ /* if INITGUID is defined, initialize the GUID, else declare it as extern NOTE: every EXE/DLL needs to initialize at least (and preferrably) once */ #ifndef INITGUID #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID name #else #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID name; \ EXTERN_C const GUID name \ = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #endif /* INITGUID */ #define DEFINE_OLEGUID(name, l, w1, w2) \ DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46) DEFINE_GUID(GUID_NULL, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); /* storage related interfaces */ DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0); DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0); DEFINE_OLEGUID(IID_IRootStorage, 0x00000012L, 0, 0); DEFINE_OLEGUID(IID_IDfReserved1, 0x00000013L, 0, 0); DEFINE_OLEGUID(IID_IDfReserved2, 0x00000014L, 0, 0); DEFINE_OLEGUID(IID_IDfReserved3, 0x00000015L, 0, 0); DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0); DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0); DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0); DEFINE_OLEGUID(IID_IEnumSTATSTG, 0x0000000dL, 0, 0); DEFINE_OLEGUID(IID_IPropertyStorage, 0x00000138L, 0, 0); DEFINE_OLEGUID(IID_IEnumSTATPROPSTG, 0x00000139L, 0, 0); DEFINE_OLEGUID(IID_IPropertySetStorage, 0x0000013AL, 0, 0); DEFINE_OLEGUID(IID_IEnumSTATPROPSETSTG, 0x0000013BL, 0, 0); /* The FMTID of the "SummaryInformation" property set. */ DEFINE_GUID( FMTID_SummaryInformation, 0xf29f85e0, 0x4ff9, 0x1068, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 ); /* The FMTID of the first Section of the "DocumentSummaryInformation" property set. */ DEFINE_GUID( FMTID_DocSummaryInformation, 0xd5cdd502, 0x2e9c, 0x101b, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae ); /* The FMTID of the section Section of the "DocumentSummaryInformation" property set. */ DEFINE_GUID( FMTID_UserDefinedProperties, 0xd5cdd505, 0x2e9c, 0x101b, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae ); #define FMTID_NULL GUID_NULL /* Comparing GUIDs */ EXTERN_C STDAPI_(BOOL) IsEqualGUID(REFGUID rguid1, REFGUID rguid2); #define IsEqualIID(x, y) IsEqualGUID(x, y) #define IsEqualCLSID(x, y) IsEqualGUID(x, y) #define IID_NULL GUID_NULL #define CLSID_NULL GUID_NULL // Use these to 'refer' to the formal parameters that we are not using #define UNIMPLEMENTED_PARM(x) (x) #define UNREFERENCED_PARM(x) (x) /************** Debugging Stuff *******************************************/ #define DEB_ERROR 0x00000001 // exported error paths #define DEB_TRACE 0x00000004 // exported trace messages #define DEB_PROP_MAP DEB_ITRACE // 0x00000400 #define DEB_IERROR 0x00000100 // internal error paths #define DEB_ITRACE 0x00000400 // internal trace messages #define DEB_ALL 0xFFFFFFFF // all traces on #if DBG == 1 // // GCC versions 2.6.x (and below) has problems with inlined // variable argument macros, so we have to use non-inlined // functions for debugging. // Luckily DECLARE_INFOLEVEL is always used in a .c or .cxx file // so we can shift the function body around. // #if (__GNUC__ == 2 && __GNUC_MINOR__ <= 6) #define DECLARE_DEBUG(comp) \ EXTERN_C unsigned long comp##InfoLevel; \ EXTERN_C char *comp##InfoLevelString; \ void comp##InlineDebugOut(unsigned long fDebugMask, char const *pszfmt, ...); #define DECLARE_INFOLEVEL(comp, level) \ unsigned long comp##InfoLevel = level; \ char *comp##InfoLevelString = #comp; \ \ void \ comp##InlineDebugOut(unsigned long fDebugMask, char const *pszfmt, ...) \ { \ va_list vstart; \ va_start(vstart, pszfmt); \ if (comp##InfoLevel & fDebugMask) \ { \ vprintf((const char *)pszfmt, vstart); \ } \ } #else // (__GNUC__ > 2 && __GNUC_MINOR__ <= 6) #define DECLARE_DEBUG(comp) \ EXTERN_C unsigned long comp##InfoLevel; \ EXTERN_C char *comp##InfoLevelString; \ inline void \ comp##InlineDebugOut(unsigned long fDebugMask, char const *pszfmt, ...) \ { \ va_list vstart; \ va_start(vstart, pszfmt); \ if (comp##InfoLevel & fDebugMask) \ { \ vprintf((const char *)pszfmt, vstart); \ } \ } #define DECLARE_INFOLEVEL(comp, level) \ unsigned long comp##InfoLevel = level; \ char *comp##InfoLevelString = #comp; #endif // (__GNUC__ > 2 && __GNUC_MINOR__ <= 6) #else // DBG #define DECLARE_DEBUG(comp) #define DECLARE_INFOLEVEL(comp, level) #endif // DBG #endif // #ifndef __REF_HXX__