|
|
/****************************************************************************
* * (C) COPYRIGHT 2000, MICROSOFT CORP. * * FILE: wiautil.h * * VERSION: 1.0 * * DATE: 11/17/2000 * * DESCRIPTION: * Definitions for WIA driver helper classes and functions. * NOTE: This header requires wiamindr.h to be included. * *****************************************************************************/
#pragma once
/**************************************************************************\
* CWiauFormatConverter * * Helper class for converting images to BMP format. * \**************************************************************************/
typedef struct _BMP_IMAGE_INFO { INT Width; // Width of the image in pixels
INT Height; // Height of the image in lines
INT ByteWidth; // Width of the image in bytes
INT Size; // Total size of the image, including headers
} BMP_IMAGE_INFO, *PBMP_IMAGE_INFO;
typedef enum { SKIP_OFF, SKIP_FILEHDR, SKIP_BOTHHDR
} SKIP_AMOUNT;
class CWiauFormatConverter { public: CWiauFormatConverter(); ~CWiauFormatConverter();
/**************************************************************************\
* Init * * Intializes this class and GDI+ for converting images. This method * should be called just once. * \**************************************************************************/
HRESULT Init();
/**************************************************************************\
* IsFormatSupported * * This method will verify that GDI+ supports the image format * that is to be converted. * * Arguments: * * pguidFormat - pointer to GUID format from gdiplusimaging.h * \**************************************************************************/
BOOL IsFormatSupported(const GUID *pguidFormat);
/**************************************************************************\
* ConvertToBmp * * This method will convert an image to BMP format. The caller can pass * a result buffer in ppDest and the size in piDestSize. Alternatively * the caller can set *ppDest to NULL and *piDestSize to zero to * indicate that this method should allocate the memory. The caller is * responsible for freeing the memory with "delete []". * * Arguments: * * pSource - pointer to memory location of source image * iSourceSize - size of source image * ppDest - location to receive memory location of result image * piDestSize - location to receive size of result image * pBmpImageInfo - location to receive stats about the BMP * iSkipAmt - Indicates how much of the BMP header to skip: * SKIP_OFF = skip neither header * SKIP_FILEHDR = skip the file header * SKIP_BOTHHDR = skip the file and info headers * \**************************************************************************/
HRESULT ConvertToBmp(BYTE *pSource, INT iSourceSize, BYTE **ppDest, INT *piDestSize, BMP_IMAGE_INFO *pBmpImageInfo, SKIP_AMOUNT iSkipAmt = SKIP_OFF);
private: ULONG_PTR m_Token; UINT m_EncoderCount; BYTE *m_pEncoderInfo; GUID m_guidCodecBmp; };
/**************************************************************************\
* CWiauPropertyList * * Helper class for definining and initializing WIA properties * \**************************************************************************/
class CWiauPropertyList { private:
int m_NumAlloc; // number of slots allocated
int m_NumProps; // number of properties defined
PROPID *m_pId; // property ids
LPOLESTR *m_pNames; // property names
PROPVARIANT *m_pCurrent; // current value
PROPSPEC *m_pPropSpec; // property spec (used for WriteMultiple)
WIA_PROPERTY_INFO *m_pAttrib; // property attributes
public:
CWiauPropertyList(); ~CWiauPropertyList(); /**************************************************************************\
* Init * * Initializes the property info object. * * Arguments: * NumProps - number of properties to reserve space for. This number can * be larger than the actual number used, but cannot be smaller. * \**************************************************************************/ HRESULT Init(INT NumProps); /**************************************************************************\
* DefineProperty * * Adds a property definition to the object. * * Arguments: * index - pointer to an int that will be set to the property index * within the object, useful for passing to other property * info methods * PropId - property ID constant * PropName - property name string * Access - determines access to the property, usually either * WIA_PROP_READ or WIA_PROP_RW * SubType - indicates subtype of the property, usually either * WIA_PROP_NONE, WIA_PROP_FLAG, WIA_PROP_RANGE, or WIA_PROP_LIST * \**************************************************************************/
HRESULT DefineProperty(int *pIdx, PROPID PropId, LPOLESTR PropName, ULONG Access, ULONG SubType); /**************************************************************************\
* SendToWia * * Calls the WIA service to define all of the properties currently * contained in the object. Should be called once after all properties * are defined and set. * * Arguments: * pWiasContext - pointer to the context passed into drvInitItemProperties * \**************************************************************************/ HRESULT SendToWia(BYTE *pWiasContext); /**************************************************************************\
* SetAccessSubType * * Used to reset the access and subtype of a property. * * Arguments: * index - the property index, from DefineProperty * Access - determines access to the property, usually either * WIA_PROP_READ or WIA_PROP_RW * SubType - indicates subtype of the property, usually either * WIA_PROP_NONE, WIA_PROP_FLAG, WIA_PROP_RANGE, or WIA_PROP_LIST * \**************************************************************************/ VOID SetAccessSubType(INT index, ULONG Access, ULONG SubType); /**************************************************************************\
* SetValidValues (flag) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_I4 and subtype to WIA_PROP_FLAG. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * validFlags - combination of all valid flags * \**************************************************************************/ VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue, LONG validFlags); /**************************************************************************\
* SetValidValues (signed long, range) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_I4 and subtype to WIA_PROP_RANGE. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * minValue - minimum value for the range * maxValue - maximum value for the range * stepValue - step value for the range * \**************************************************************************/ VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue, LONG minValue, LONG maxValue, LONG stepValue); /**************************************************************************\
* SetValidValues (signed long, list) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_I4 and subtype to WIA_PROP_LIST. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * numValues - number of values in the list * pValues - pointer to the value list (must be valid until SendToWia * is called) * \**************************************************************************/ VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue, INT numValues, PLONG pValues); /**************************************************************************\
* SetValidValues (BSTR, list) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_BSTR and subtype to WIA_PROP_LIST. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * numValues - number of values in the list * pValues - pointer to the value list (must be valid until SendToWia * is called) * \**************************************************************************/ VOID SetValidValues(INT index, BSTR defaultValue, BSTR currentValue, INT numValues, BSTR *pValues); /**************************************************************************\
* SetValidValues (float, range) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_R4 and subtype to WIA_PROP_RANGE. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * minValue - minimum value for the range * maxValue - maximum value for the range * stepValue - step value for the range * \**************************************************************************/ VOID SetValidValues(INT index, FLOAT defaultValue, FLOAT currentValue, FLOAT minValue, FLOAT maxValue, FLOAT stepValue); /**************************************************************************\
* SetValidValues (float, list) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_R4 and subtype to WIA_PROP_LIST. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * numValues - number of values in the list * pValues - pointer to the value list (must be valid until SendToWia * is called) * \**************************************************************************/ VOID SetValidValues(INT index, FLOAT defaultValue, FLOAT currentValue, INT numValues, PFLOAT pValues); /**************************************************************************\
* SetValidValues (CLSID, list) * * Sets the type and current, default, and valid values of a property. * Also sets property type to VT_CLSID and subtype to WIA_PROP_LIST. * * Arguments: * index - the property index, from DefineProperty * defaultValue - default setting of this property on the device * currentValue - current setting of this property on the device * numValues - number of values in the list * pValues - pointer to the value list (must be valid until SendToWia * is called) * \**************************************************************************/ VOID SetValidValues(INT index, CLSID *defaultValue, CLSID *currentValue, INT numValues, CLSID **pValues); /**************************************************************************\
* SetCurrentValue (signed long) * * Sets the current value for a property. Also sets the type to VT_I4. * * Arguments: * index - the property index, from DefineProperty * value - current setting of this property on the device * \**************************************************************************/ VOID SetCurrentValue(INT index, LONG value); /**************************************************************************\
* SetCurrentValue (BSTR) * * Sets the current value for a property. Also sets the type to VT_BSTR. * * Arguments: * index - the property index, from DefineProperty * value - current setting of this property on the device * (must be valid until SendToWia is called) * \**************************************************************************/ VOID SetCurrentValue(INT index, BSTR value); /**************************************************************************\
* SetCurrentValue (float) * * Sets the current value for a property. Also sets the type to VT_R4. * * Arguments: * index - the property index, from DefineProperty * value - current setting of this property on the device * \**************************************************************************/ VOID SetCurrentValue(INT index, FLOAT value); /**************************************************************************\
* SetCurrentValue (CLSID) * * Sets the current value for a property. Also sets the type to VT_CLSID. * * Arguments: * index - the property index, from DefineProperty * value - current setting of this property on the device * (must be valid until SendToWia is called) * \**************************************************************************/ VOID SetCurrentValue(INT index, CLSID *pValue); /**************************************************************************\
* SetCurrentValue (SYSTEMTIME) * * Sets the current value for a property. Also sets the type to * VT_UI2 | VT_VECTOR. * * Arguments: * index - the property index, from DefineProperty * value - current setting of this property on the device * (must be valid until SendToWia is called) * \**************************************************************************/ VOID SetCurrentValue(INT index, PSYSTEMTIME value); /**************************************************************************\
* SetCurrentValue (byte array) * * Sets the current value for a property. Also sets the type to * VT_UI1 | VT_VECTOR. * * Arguments: * index - the property index, from DefineProperty * value - pointer to current setting of this property on the device * (must be valid until SendToWia is called) * \**************************************************************************/ VOID SetCurrentValue(INT index, BYTE *value, INT size);
/**************************************************************************\
* GetPropId * * Returns the property id given a property index. * \**************************************************************************/ PROPID GetPropId(INT index) { return m_pId[index]; } /**************************************************************************\
* LookupPropId * * Finds the property index given a property ID. * \**************************************************************************/ INT LookupPropId(PROPID PropId); };
/**************************************************************************\
* wiauGetDrvItemContext * * This helper function gets the driver item context, and optionally * return the driver item * * Arguments: * * pWiasContext - pointer to the item context * ppItemCtx - location to store pointer to driver item context * ppDrvItem - location to store pointer to driver item (can be NULL) * \**************************************************************************/
HRESULT wiauGetDrvItemContext(BYTE *pWiasContext, VOID **ppItemCtx, IWiaDrvItem **ppDrvItem = NULL);
/**************************************************************************\
* wiauSetImageItemSize * * Calulates the size and width in bytes for an image based on the current * WIA_IPA_FORMAT setting, and writes the new values to the appropriate * properties. If the format is not BMP, this function assumes that the * value passed in lSize is correct for the current format. * * Arguments: * * pWiasContext - pointer to item context * lWidth - width of the image in pixels * lHeight - height of the image in lines * lDepth - depth of the image in bits * lSize - size of the image as stored on the device * pwszExt - optional pointer to the 3 letter extension for the * item's native format (if this is NULL, the extension * property won't be updated) * \**************************************************************************/
HRESULT wiauSetImageItemSize(BYTE *pWiasContext, LONG lWidth, LONG lHeight, LONG lDepth, LONG lSize, PWSTR pwszExt = NULL);
/**************************************************************************\
* wiauPropsInPropSpec * * Returns true if one or more of the property ids in pProps are * contained in pPropSpecs. * * Arguments: * * NumPropSpecs - number of property specs in the array * pPropSpecs - the property specs array * NumProps - number of property ids to search for * pProps - pointer to the array of property ids to search for * \**************************************************************************/
BOOL wiauPropsInPropSpec(LONG NumPropSpecs, const PROPSPEC *pPropSpecs, int NumProps, PROPID *pProps);
/**************************************************************************\
* wiauPropInPropSpec * * Returns true if the PropId property ID is in the passed pPropSpecs * array. Optionally will return the index of where the ID was found. * * Arguments: * * NumPropSpecs - number of property specs in the array * pPropSpecs - the property specs array * PropId - property id to search for * pIdx - optional pointer to the location to store the index * \**************************************************************************/
BOOL wiauPropInPropSpec(LONG NumPropSpecs, const PROPSPEC *pPropSpecs, PROPID PropId, int *pIdx = NULL);
/**************************************************************************\
* wiauGetValidFormats * * Calls drvGetWiaFormatInfo and makes a list of valid formats given * a tymed value. Caller is responsible for freeing the format array * with []delete. * * Arguments: * * pDrv - Pointer to WIA minidriver object (use "this") * pWiasContext - WIA service context * TymedValue - tymed value to search for * pNumFormats - pointer to value to receive number of formats * ppFormatArray - pointer to a location to receive array address * \**************************************************************************/
HRESULT wiauGetValidFormats(IWiaMiniDrv *pDrv, BYTE *pWiasContext, LONG TymedValue, int *pNumFormats, GUID **ppFormatArray);
/**************************************************************************\
* wiauGetResourceString * * This helper gets a resource string and returns it as a BSTR * * Arguments: * * hInst - Handle to module instance * lResourceID - Resource ID of the target BSTR value * pbstrStr - Location to store the retrieved string (caller must * free this string with SysFreeString()) * \**************************************************************************/ HRESULT wiauGetResourceString(HINSTANCE hInst, LONG lResourceID, BSTR *pbstrStr);
/**************************************************************************\
* wiauRegOpenDataW * * Opens the DeviceData key. Call this function only in the STI Initialize * function. Call RegCloseKey when finished. * * Arguments: * * hkeyAncestor - HKey of parent (use hkey passed into Initialize) * phkeyDeviceData - Location to store opened hkey * \**************************************************************************/ HRESULT wiauRegOpenDataW(HKEY hkeyAncestor, HKEY *phkeyDeviceData);
/**************************************************************************\
* wiauRegOpenDataA * * Opens the DeviceData key. Call this function only in the STI Initialize * function. Call RegCloseKey when finished. * * Arguments: * * hkeyAncestor - HKey of parent (use hkey passed into Initialize) * phkeyDeviceData - Location to store opened hkey * \**************************************************************************/ HRESULT wiauRegOpenDataA(HKEY hkeyAncestor, HKEY *phkeyDeviceData);
/**************************************************************************\
* wiauRegGetStrW * * Use to get string value from the DeviceData section of the registry. * * Arguments: * * hkey - Use hkey returned from wiauRegOpenData * pwszValueName - Name of registry entry * pwszValue - Location to store returned string * pdwLength - Size of location in bytes * \**************************************************************************/ HRESULT wiauRegGetStrW(HKEY hkKey, PCWSTR pwszValueName, PWSTR pwszValue, DWORD *pdwLength);
/**************************************************************************\
* wiauRegGetStrA * * Use to get string value from the DeviceData section of the registry. * * Arguments: * * hkey - Use hkey returned from wiauRegOpenData * pszValueName - Name of registry entry * pszValue - Location to store returned string * pdwLength - Size of location in bytes * \**************************************************************************/ HRESULT wiauRegGetStrA(HKEY hkKey, PCSTR pszValueName, PSTR pszValue, DWORD *pdwLength);
/**************************************************************************\
* wiauRegGetDwordW * * Use to get DWORD value from the DeviceData section of the registry. * * Arguments: * * hkey - Use hkey returned from wiauRegOpenData * pwszValueName - Name of registry entry * pdwValue - Location to store returned DWORD * \**************************************************************************/ HRESULT wiauRegGetDwordW(HKEY hkKey, PCWSTR pwszValueName, DWORD *pdwValue);
/**************************************************************************\
* wiauRegGetDwordA * * Use to get DWORD value from the DeviceData section of the registry. * * Arguments: * * hkey - Use hkey returned from wiauRegOpenData * pszValueName - Name of registry entry * pdwValue - Location to store returned DWORD * \**************************************************************************/ HRESULT wiauRegGetDwordA(HKEY hkKey, PCSTR pszValueName, DWORD *pdwValue);
/**************************************************************************\
* WiauStrW2C * * Converts a wide character string to an ANSI character string * * Arguments: * pwszSrc - wide character string to be converted * pszDst - location to store the ANSI conversion * iSize - size of the buffer pointed to by pszDst, in bytes * \**************************************************************************/
HRESULT wiauStrW2C(WCHAR *pwszSrc, CHAR *pszDst, INT iSize);
/**************************************************************************\
* WiauStrC2W * * Converts an ANSI character string to a wide character string * * Arguments: * pszSrc - ANSI string to convert * wpszDst - location to store the wide string * iSize - size of the buffer pointed to by wpszDst, in bytes * \**************************************************************************/ HRESULT wiauStrC2W(CHAR *pszSrc, WCHAR *pwszDst, INT iSize);
/**************************************************************************\
* WiauStrW2W * * Copies a wide character string to another wide character string * * Arguments: * pwszSrc - wide character string to be copied * pwszDst - location to copy to * iSize - size of the buffer pointed to by pwszDst, in bytes * \**************************************************************************/
HRESULT wiauStrW2W(WCHAR *pwszSrc, WCHAR *pwszDst, INT iSize);
/**************************************************************************\
* WiauStrC2C * * Copies an ANSI character string to another ANSI character string * * Arguments: * pszSrc - ANSI string to be copied * pszDst - location to copy to * iSize - size of the buffer pointed to by pszDst, in bytes * \**************************************************************************/
HRESULT wiauStrC2C(CHAR *pszSrc, CHAR *pszDst, INT iSize);
#ifdef UNICODE
#define wiauRegOpenData wiauRegOpenDataW
#define wiauRegGetStr wiauRegGetStrW
#define wiauRegGetDword wiauRegGetDwordW
#define wiauStrT2C wiauStrW2C
#define wiauStrC2T wiauStrC2W
#define wiauStrT2W wiauStrW2W
#define wiauStrW2T wiauStrW2W
#define WIAU_DEBUG_TSTR "S"
#else
#define wiauRegOpenData wiauRegOpenDataA
#define wiauRegGetStr wiauRegGetStrA
#define wiauRegGetDword wiauRegGetDwordA
#define wiauStrT2C wiauStrC2C
#define wiauStrC2T wiauStrC2C
#define wiauStrT2W wiauStrC2W
#define wiauStrW2T wiauStrW2C
#define WIAU_DEBUG_TSTR "s"
#endif // UNICODE
/**************************************************************************\
* WIA Debugging * * Definitions for debug messages. To use WIA debugging: * 1. Set registry HKLM\System\CurrentControlSet\Control\StillImage\Debug\<ModuleName>, * DWORD value "DebugFlags" to the combination of the WIAUDBG_* flags * desired. The application and possibly the WIA service will need to be * restarted to pick up the new settings. The key is auto created the * first time the module is executed. (Note: <ModuleName> above is the * name of the DLL or EXE, e.g. wiavusd.dll has a registry key of * "HKLM\System\CurrentControlSet\Control\StillImage\Debug\wiavusd.dll".) * 2. Or in the debugger, set g_dwDebugFlags to the combination of the * WIAUDBG_* flags desired. This can be done anytime during the debug * session. * 3. From the module, call wiauDbgSetFlags(<flags>), where <flags> is the * combination of the WIAUDBG_* flags desired. * * Messages will be logged to the debugger and the file * %systemroot%\\wiadebug.log, unless the WIAUDBG_DONT_LOG_* flags are set. * Setting both flags will turn off all messages. * * All strings should be ASCII. Use %S in the format string to print a * Unicode string. * \**************************************************************************/
#define _STIDEBUG_H_ // WIA debugging is incompatible with stidebug.h, so don't include it
//
// Predefined debug flags
//
const DWORD WIAUDBG_ERRORS = 0x00000001; const DWORD WIAUDBG_WARNINGS = 0x00000002; const DWORD WIAUDBG_TRACES = 0x00000004; const DWORD WIAUDBG_FNS = 0x00000008; // Function entry and exit
const DWORD WIAUDBG_DUMP = 0x00000010; // Dump data
const DWORD WIAUDBG_PRINT_TIME = 0x08000000; // Prints time for each message
const DWORD WIAUDBG_PRINT_INFO = 0x10000000; // Turns on thread, file, line info
const DWORD WIAUDBG_DONT_LOG_TO_DEBUGGER = 0x20000000; const DWORD WIAUDBG_DONT_LOG_TO_FILE = 0x40000000; const DWORD WIAUDBG_BREAK_ON_ERRORS = 0x80000000; // Do DebugBreak on errors
//
// Don't log at all
//
const DWORD WIAUDBG_DONT_LOG = WIAUDBG_DONT_LOG_TO_FILE | WIAUDBG_DONT_LOG_TO_DEBUGGER;
//
// Set default flags
//
#ifdef DEBUG
const DWORD WIAUDBG_DEFAULT_FLAGS = WIAUDBG_ERRORS; #else
const DWORD WIAUDBG_DEFAULT_FLAGS = WIAUDBG_DONT_LOG; #endif
//
// FormatMessage flags
//
const DWORD WIAUDBG_MFMT_FLAGS = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK;
#ifdef __cplusplus
extern "C" { #endif
//
// WIA Debugging has very little overhead and should be put into retail
// code for drivers. If it's really desired to remove it, define NO_WIA_DEBUG.
//
#ifdef NO_WIA_DEBUG
#define g_dwDebugFlags 0
#define wiauDbgInit(a)
#define wiauDbgHelper(a,b,c,d)
#define wiauDbgHelper2 wiauNull3
#define wiauDbgFlags wiauNull4
#define wiauDbgError wiauNull2
#define wiauDbgErrorHr wiauNull3hr
#define wiauDbgWarning wiauNull2
#define wiauDbgTrace wiauNull2
#define wiauDbgDump wiauNull2
#define wiauDbgSetFlags(a) 0
#define wiauDbgLegacyError wiauNull1
#define wiauDbgLegacyWarning wiauNull1
#define wiauDbgLegacyTrace wiauNull1
#define wiauDbgLegacyError2 wiauNull2h
#define wiauDbgLegacyTrace2 wiauNull2h
#define wiauDbgLegacyHresult2 wiauNullHHr
inline void wiauNull1(LPCSTR a, ...) {} inline void wiauNull2(LPCSTR a, LPCSTR b,...) {} inline void wiauNull2h(HINSTANCE hInstance, LPCSTR b,...) {} inline void wiauNull3(LPCSTR a, LPCSTR b, LPCSTR c, ...) {} inline void wiauNull3hr(HRESULT a, LPCSTR b, LPCSTR c, ...) {} inline void wiauNull4(DWORD a, LPCSTR b, LPCSTR c, LPCSTR d, ...) {} inline void wiauNullHHr(HINSTANCE hInstance, HRESULT hr) {}
#else // NO_WIA_DEBUG
extern DWORD g_dwDebugFlags; extern HANDLE g_hDebugFile; extern DWORD g_dwDebugFileSizeLimit; extern BOOL g_bDebugInited;
/**************************************************************************\
* wiauDbgInit * * Call to initialize WIA debugging. If it's not called, all DLLs will * inherit the debug flags of the process that creates them. * * Arguments: * * hInstance - DLL instance handle * \**************************************************************************/
void __stdcall wiauDbgInit(HINSTANCE hInstance); void __stdcall wiauDbgHelper(LPCSTR prefix, LPCSTR fname, LPCSTR fmt, va_list marker); void __stdcall wiauDbgHelper2(LPCSTR prefix, LPCSTR fname, LPCSTR fmt, ...);
inline void __stdcall wiauDbgFlags(DWORD flags, LPCSTR prefix, LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and the flag is enabled
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & flags)) {
va_start(marker, fmt); wiauDbgHelper(prefix, fname, fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgError(LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and error messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_ERRORS)) {
va_start(marker, fmt); wiauDbgHelper("ERROR ", fname, fmt, marker); va_end(marker); }
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) { DebugBreak(); } }
inline void __stdcall wiauDbgErrorHr(HRESULT hr, LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and error messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_ERRORS)) {
va_start(marker, fmt); wiauDbgHelper("ERROR ", fname, fmt, marker); va_end(marker);
CHAR szError[MAX_PATH]; \ if(!FormatMessageA(WIAUDBG_MFMT_FLAGS, NULL, hr, 0, szError, MAX_PATH, NULL)) { strcpy(szError, "Unknown HRESULT"); } wiauDbgHelper2("ERROR ", fname, "HRESULT = 0x%08x, %s", hr, szError); }
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) { DebugBreak(); } }
inline void __stdcall wiauDbgWarning(LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and warning messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_WARNINGS)) {
va_start(marker, fmt); wiauDbgHelper("WARN ", fname, fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgTrace(LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and trace messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_TRACES)) {
va_start(marker, fmt); wiauDbgHelper(" ", fname, fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgDump(LPCSTR fname, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and trace messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_DUMP)) {
va_start(marker, fmt); wiauDbgHelper(" ", fname, fmt, marker); va_end(marker); } }
inline DWORD __stdcall wiauDbgSetFlags(DWORD flags) { DWORD dwOld = g_dwDebugFlags; g_dwDebugFlags = flags; return dwOld; }
inline void __stdcall wiauDbgLegacyError(LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and error messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_ERRORS)) {
va_start(marker, fmt); wiauDbgHelper("ERROR ", "", fmt, marker); va_end(marker); }
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) { DebugBreak(); } }
inline void __stdcall wiauDbgLegacyWarning(LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and warning messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_WARNINGS)) {
va_start(marker, fmt); wiauDbgHelper("WARN ", "", fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgLegacyTrace(LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and trace messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_TRACES)) {
va_start(marker, fmt); wiauDbgHelper(" ", "", fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgLegacyError2(HINSTANCE hInstance, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and error messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_ERRORS)) {
va_start(marker, fmt); wiauDbgHelper("ERROR ", "", fmt, marker); va_end(marker); }
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) { DebugBreak(); } }
inline void __stdcall wiauDbgLegacyTrace2(HINSTANCE hInstance, LPCSTR fmt, ...) { va_list marker;
//
// See if log messages are enabled and trace messages are turned on
//
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) && (g_dwDebugFlags & WIAUDBG_TRACES)) {
va_start(marker, fmt); wiauDbgHelper(" ", "", fmt, marker); va_end(marker); } }
inline void __stdcall wiauDbgLegacyHresult2(HINSTANCE hInstance, HRESULT hr) { wiauDbgErrorHr(hr, "", ""); }
#endif // NO_WIA_DEBUG
//
// Macros for mapping the old WIA logging to the new system
//
#ifdef WIA_MAP_OLD_DEBUG
#define CWiaLogProc
#define WIAS_LOGPROC(x, y, z, fname) CWiauDbgFn __CWiauDbgFnObject(fname)
#define WIAS_LERROR(x,y,params) wiauDbgLegacyError ## params
#define WIAS_LWARNING(x,y,params) wiauDbgLegacyWarning ## params
#define WIAS_LTRACE(x,y,z,params) wiauDbgLegacyTrace ## params
#define WIAS_LHRESULT(x,y) wiauDbgErrorHr(y, "", "")
#define WIAS_TRACE(x) wiauDbgLegacyTrace2 ## x
#define WIAS_ERROR(x) wiauDbgLegacyError2 ## x
#define WIAS_HRESULT(x) wiauDbgLegacyHresult2 ## x
#define WIAS_ASSERT(x, y) \
if (!(y)) { \ WIAS_ERROR((x, (char*) TEXT("ASSERTION FAILED: %hs(%d): %hs"), __FILE__,__LINE__,#x)); \ DebugBreak(); \ } #endif // WIA_MAP_OLD_DEBUG
//
// Macros for checking return values and common error conditions
//
#define REQUIRE_SUCCESS(hr, fname, msg) \
if (FAILED(hr)) { \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgErrorHr(hr, fname, msg); \ goto Cleanup; \ }
#define REQUIRE_OK(hr, fname, msg) \
if ((hr) != S_OK) { \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgErrorHr(hr, fname, msg); \ goto Cleanup; \ }
#define REQUIRE_ARGS(args, hr, fname) \
if (args) { \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgError(fname, "Invalid arg"); \ hr = E_INVALIDARG; \ goto Cleanup; \ }
#define REQUIRE_ALLOC(var, hr, fname) \
if (!(var)) { \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgError(fname, "Memory allocation failed on " #var); \ hr = E_OUTOFMEMORY; \ goto Cleanup; \ }
#define REQUIRE_FILEHANDLE(handle, hr, fname, msg) \
if ((handle) == NULL || (handle) == INVALID_HANDLE_VALUE) { \ hr = HRESULT_FROM_WIN32(::GetLastError()); \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgErrorHr(hr, fname, msg); \ goto Cleanup; \ }
#define REQUIRE_FILEIO(ret, hr, fname, msg) \
if (!(ret)) { \ hr = HRESULT_FROM_WIN32(::GetLastError()); \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgErrorHr(hr, fname, msg); \ goto Cleanup; \ }
#define REQUIRE_WIN32(err, hr, fname, msg) \
if ((err) != ERROR_SUCCESS) { \ hr = HRESULT_FROM_WIN32(err); \ if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \ DWORD threadId = GetCurrentThreadId(); \ wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \ } \ wiauDbgErrorHr(hr, fname, msg); \ goto Cleanup; \ }
//
// Macro and class for entry/exit point tracing
//
#ifdef __cplusplus
#ifdef NO_WIA_DEBUG
#define DBG_FN(fname)
#else // NO_WIA_DEBUG
#define DBG_FN(fname) CWiauDbgFn __CWiauDbgFnObject(fname)
class CWiauDbgFn { public:
CWiauDbgFn(LPCSTR fname) { m_fname = fname; m_threadId = GetCurrentThreadId(); wiauDbgFlags(WIAUDBG_FNS, " ", m_fname, "Entering, thread 0x%x (%d)", m_threadId, m_threadId);
} ~CWiauDbgFn() { wiauDbgFlags(WIAUDBG_FNS, " ", m_fname, "Exiting, thread 0x%x (%d)", m_threadId, m_threadId); }
private: LPCSTR m_fname; DWORD m_threadId; }; #endif // NO_WIA_DEBUG
}
#else // __cplusplus
#define DBG_FN(fname) wiauDbgFlags(WIAUDBG_FNS, " ", fname, "Entering");
#endif // __cplusplus
|