2025-04-27 07:49:33 -04:00

371 lines
13 KiB
C++

/***************************************************************************
*
* TESTUSD.H
*
* Copyright (c) Microsoft Corporation 1996-1999
* All rights reserved
*
***************************************************************************/
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#pragma intrinsic(memcmp,memset)
#include <objbase.h>
#include <sti.h>
#include <stierr.h>
#include <stiusd.h>
#include "wiamindr.h"
#define DATA_1BIT_SRC_NAME TEXT("TEST1BT.BMP") // Data source file name.
#define DATA_8BIT_SRC_NAME TEXT("TEST8BT.BMP") // Data source file name.
#define DATA_24BIT_SRC_NAME TEXT("TEST24BT.BMP") // Data source file name.
// GUID's
#if defined( _WIN32 ) && !defined( _NO_COM)
// {E9FA3320-7F3F-11D0-90EA-00AA0060F86C}
DEFINE_GUID(CLSID_TestUsd, 0xC3A80960L, 0x28B1, 0x11D1, 0xAC, 0xAD, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48);
// {61127F40-E1A5-11D0-B454-00A02438AD48}
DEFINE_GUID(guidEventTimeChanged, 0x61127F40L, 0xE1A5, 0x11D0, 0xB4, 0x54, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48);
// {052ED270-28A3-11D1-ACAD-00A02438AD48}
DEFINE_GUID(guidEventSizeChanged, 0x052ED270L, 0x28A3, 0x11D1, 0xAC, 0xAD, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48);
// {052ED270-28A3-11D1-ACAD-00A02438AD48}
DEFINE_GUID(guidEventFirstLoaded, 0x052ED270L, 0x28A3, 0x11D3, 0xAC, 0xAD, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48);
#endif
#define DATASEG_PERINSTANCE ".instance"
#define DATASEG_SHARED ".shared"
#define DATASEG_READONLY ".code"
#define DATASEG_DEFAULT DATASEG_SHARED
#pragma data_seg(DATASEG_PERINSTANCE)
// Set the default data segment
#pragma data_seg(DATASEG_DEFAULT)
//
// Module ref counting
//
extern UINT g_cRefThisDll;
extern UINT g_cLocks;
extern BOOL DllInitializeCOM(void);
extern BOOL DllUnInitializeCOM(void);
extern void DllAddRef(void);
extern void DllRelease(void);
//
// Base class for supporting non-delegating IUnknown for contained objects
//
struct INonDelegatingUnknown
{
// IUnknown-like methods
STDMETHOD(NonDelegatingQueryInterface)( THIS_ REFIID riid, LPVOID * ppvObj) PURE;
STDMETHOD_(ULONG,NonDelegatingAddRef)(THIS) PURE;
STDMETHOD_(ULONG,NonDelegatingRelease)( THIS) PURE;
};
// The the test scanner supports a single scanning context.
#define NUM_DEVICE_ITEM 1
// Device item specific context.
typedef struct _TESTMINIDRIVERITEMCONTEXT{
LONG lSize;
HANDLE hTestBmp; // Handle to data source file.
HANDLE hTestBmpMap; // Handle to data source file mapping.
PBYTE pTestBmp; // Pointer to data source file.
PBYTE pTestBmpBits; // Pointer to image data.
LONG lTotalWritten; // Total image bytes written.
LONG lTestBmpLine; // Current test bitmap line.
// Test image parameters: (Test BMP images)
LONG lTestBmpDepth; // image data bit depth
LONG lTestBmpWidth; // image data width (pixels)
LONG lTestBmpHeight; // image data height (pixels)
LONG lTestBmpDir; // image data direction (-1 = topdown, 1 = bottomup)
LONG lTestBmpBytesPerScanLine; // image data bytes per scan line
LONG lTestBmpLinePad; // image data byte per line padding(if out of image data)
// Scan parameters:
LONG lBytesPerScanLine; // bytes per scan line (scanned data)
LONG lBytesPerScanLineRaw; // bytes per scan line RAW (scanned data)
LONG lTotalRequested; // Total image bytes requested.
} TESTMINIDRIVERITEMCONTEXT, *PTESTMINIDRIVERITEMCONTEXT;
//
// Class definition for object
//
class TestUsdDevice : public IStiUSD,
public IWiaMiniDrv,
public INonDelegatingUnknown
{
private:
// COM object data
ULONG m_cRef; // Device object reference count.
// STI information
BOOL m_fValid; // Is object initialized?
LPUNKNOWN m_punkOuter; // Pointer to outer unknown.
PSTIDEVICECONTROL m_pIStiDevControl; // Device control interface.
BOOLEAN m_bUsdLoadEvent; // Controls load event.
DWORD m_dwLastOperationError; // Last error.
// Data source file information.
TCHAR m_szSrcDataName[MAX_PATH]; // Path of data source file.
FILETIME m_ftLastWriteTime; // Last time of source data file.
LARGE_INTEGER m_dwLastHugeSize; // Last size of source data file.
// Event information
CRITICAL_SECTION m_csShutdown; // Syncronizes shutdown.
HANDLE m_hSignalEvent; // Signal event handle.
HANDLE m_hShutdownEvent; // Shutdown event handle.
HANDLE m_hEventNotifyThread; // Does event notification.
GUID m_guidLastEvent; // Last event ID.
// WIA information, one time initialization.
BSTR m_bstrDeviceID; // WIA unique device ID.
BSTR m_bstrRootFullItemName; // Device name for prop streams.
IWiaEventCallback *m_pIWiaEventCallback; // WIA event sink.
IWiaDrvItem *m_pIDrvItemRoot; // The root item.
IStiDevice *m_pStiDevice; // Sti object.
BOOL inline IsValid(VOID) {
return m_fValid;
}
public:
//
// IUnknown-like methods. Needed in conjunction with normal IUnknown
// methods to implement delegating components.
//
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) NonDelegatingAddRef();
STDMETHODIMP_(ULONG) NonDelegatingRelease();
//
// COM IUnknown Methods
//
STDMETHODIMP QueryInterface( REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef( void);
STDMETHODIMP_(ULONG) Release( void);
//
// Methods for implementing the IStiUSD interface.
//
STDMETHOD(Initialize)(THIS_ PSTIDEVICECONTROL pHelDcb,DWORD dwStiVersion,HKEY hParametersKey);
STDMETHOD(GetCapabilities) (THIS_ PSTI_USD_CAPS pDevCaps);
STDMETHOD(GetStatus)(THIS_ PSTI_DEVICE_STATUS pDevStatus);
STDMETHOD(DeviceReset)(THIS);
STDMETHOD(Diagnostic)(THIS_ LPDIAG pBuffer);
STDMETHOD(Escape)(THIS_ STI_RAW_CONTROL_CODE EscapeFunction,LPVOID lpInData,DWORD cbInDataSize,LPVOID pOutData,DWORD dwOutDataSize,LPDWORD pdwActualData) ;
STDMETHOD(GetLastError)(THIS_ LPDWORD pdwLastDeviceError);
STDMETHOD(LockDevice)(THIS);
STDMETHOD(UnLockDevice)(THIS);
STDMETHOD(RawReadData)(THIS_ LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped);
STDMETHOD(RawWriteData)(THIS_ LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped);
STDMETHOD(RawReadCommand)(THIS_ LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped);
STDMETHOD(RawWriteCommand)(THIS_ LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped);
STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hEvent);
STDMETHOD(GetNotificationData)(THIS_ LPSTINOTIFY lpNotify);
STDMETHOD(GetLastErrorInfo)(THIS_ STI_ERROR_INFO *pLastErrorInfo);
//
// Methods for implementing WIA's Mini driver interface
//
STDMETHOD(drvInitializeWia)(THIS_
BYTE *pWiasContext,
LONG lFlags,
BSTR bstrDeviceID,
BSTR bstrRootFullItemName,
IUnknown *pStiDevice,
IUnknown *pIUnknownOuter,
IWiaDrvItem **ppIDrvItemRoot,
IUnknown **ppIUnknownInner,
LONG *plDevErrVal);
STDMETHOD(drvGetDeviceErrorStr)(THIS_
LONG lFlags,
LONG lDevErrVal,
LPOLESTR *ppszDevErrStr,
LONG *plDevErr);
STDMETHOD(drvDeviceCommand)(THIS_
BYTE *pWiasContext,
LONG lFlags,
const GUID *plCommand,
IWiaDrvItem **ppWiaDrvItem,
LONG *plDevErrVal);
STDMETHOD(drvAcquireItemData)(THIS_
BYTE *pWiasContext,
LONG lFlags,
PMINIDRV_TRANSFER_CONTEXT pmdtc,
LONG *plDevErrVal);
STDMETHOD(drvInitItemProperties)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal);
STDMETHOD(drvValidateItemProperties)(THIS_
BYTE *pWiasContext,
LONG lFlags,
ULONG nPropSpec,
const PROPSPEC *pPropSpec,
LONG *plDevErrVal);
STDMETHOD(drvWriteItemProperties)(THIS_
BYTE *pWiasContext,
LONG lFlags,
PMINIDRV_TRANSFER_CONTEXT pmdtc,
LONG *plDevErrVal);
STDMETHOD(drvReadItemProperties)(THIS_
BYTE *pWiasContext,
LONG lFlags,
ULONG nPropSpec,
const PROPSPEC *pPropSpec,
LONG *plDevErrVal);
STDMETHOD(drvLockWiaDevice)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal);
STDMETHOD(drvUnLockWiaDevice)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal);
STDMETHOD(drvAnalyzeItem)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal);
STDMETHOD(drvDeleteItem)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *plDevErrVal);
STDMETHOD(drvFreeDrvItemContext)(THIS_
LONG lFlags,
BYTE *pSpecContext,
LONG *plDevErrVal);
STDMETHOD(drvGetCapabilities)(THIS_
BYTE *pWiasContext,
LONG ulFlags,
LONG *pcelt,
WIA_DEV_CAP_DRV **ppCapabilities,
LONG *plDevErrVal);
STDMETHOD(drvGetWiaFormatInfo)(THIS_
BYTE *pWiasContext,
LONG lFlags,
LONG *pcelt,
WIA_FORMAT_INFO **ppwfi,
LONG *plDevErrVal);
STDMETHOD(drvNotifyPnpEvent)(THIS_
const GUID *pEventGUID,
BSTR bstrDeviceID,
ULONG ulReserved);
STDMETHOD(drvUnInitializeWia)(THIS_
BYTE*);
private:
//
// Private helper methods
//
HRESULT _stdcall BuildItemTree(void);
HRESULT _stdcall DeleteItemTree(void);
HRESULT _stdcall ScanItem(PTESTMINIDRIVERITEMCONTEXT,PMINIDRV_TRANSFER_CONTEXT,LONG*);
HRESULT _stdcall ScanItemCB(PTESTMINIDRIVERITEMCONTEXT,PMINIDRV_TRANSFER_CONTEXT,LONG*);
HRESULT FillBufferFromFile(
PBYTE pBuffer,
LONG lLength,
PLONG pReceived,
PTESTMINIDRIVERITEMCONTEXT pItemContext);
HRESULT FillBufferWithTestPattern(
PBYTE pBuffer,
LONG lLength,
PLONG pReceived,
PTESTMINIDRIVERITEMCONTEXT pItemContext,
PMINIDRV_TRANSFER_CONTEXT pmtc);
HRESULT SetSrcBmp(BYTE *pWiasContext);
HRESULT OpenTestBmp(GUID guidFormatID, PTESTMINIDRIVERITEMCONTEXT pItemContext);
HRESULT CloseTestBmp(PTESTMINIDRIVERITEMCONTEXT pItemContext);
HRESULT Scan(
GUID guidFormatID,
LONG iPhase,
PBYTE pBuffer,
LONG Length,
PLONG pReceived,
PTESTMINIDRIVERITEMCONTEXT pItemContext,
PMINIDRV_TRANSFER_CONTEXT pmtc);
LONG ReadFromScanner(BYTE* pBuffer, DWORD Length, LONG TermChar);
LONG WriteToScanner (BYTE* pBuffer, DWORD Length);
// Validation helpers found in validate.cpp
HRESULT CheckDataType(BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext);
HRESULT CheckIntent (BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext);
//HRESULT CheckTymed (BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext);
HRESULT CheckPreferredFormat (BYTE *pWiasContext, WIA_PROPERTY_CONTEXT *pContext);
HRESULT UpdateValidDepth(BYTE *pWiasContext, LONG lDataType, LONG *lDepth);
HRESULT GetBSTRResourceString(LONG lLocalResourceID, BSTR *pBSTR, BOOL bLocal);
HRESULT GetOLESTRResourceString(LONG lLocalResourceID, LPOLESTR *ppsz, BOOL bLocal);
HRESULT BuildRootItemProperties();
HRESULT BuildTopItemProperties();
HRESULT BuildCapabilities();
HRESULT DeleteCapabilitiesArrayContents();
public:
TestUsdDevice(LPUNKNOWN punkOuter);
~TestUsdDevice();
VOID RunNotifications(VOID);
BOOL IsChangeDetected(GUID *pguidEvent);
};
typedef TestUsdDevice *PTestUsdDevice;
//
// Syncronization mechanisms
//
#define ENTERCRITICAL DllEnterCrit(void);
#define LEAVECRITICAL DllLeaveCrit(void);