/************************************************************************** * * (C) COPYRIGHT MICROSOFT CORP., 2002 * * TITLE: wiascanr.h * * VERSION: 1.1 * * DATE: 05 March, 2002 * * DESCRIPTION: * * ***************************************************************************/ #include "pch.h" // // Base structure 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; }; // WIA item specific context. typedef struct _MINIDRIVERITEMCONTEXT{ LONG lSize; LONG lHeaderSize; // Transfer header size LONG lImageSize; // Image LONG lDepth; // image bit depth LONG lBytesPerScanLine; // bytes per scan line (scanned data) LONG lBytesPerScanLineRaw; // bytes per scan line RAW (scanned data) LONG lTotalRequested; // Total image bytes requested. LONG lTotalWritten; // Total image bytes written. } MINIDRIVERITEMCONTEXT, *PMINIDRIVERITEMCONTEXT; typedef struct _BASIC_PROP_INFO { LONG lNumValues; LONG *plValues; }BASIC_PROP_INFO,*PBASIC_PROP_INFO; typedef struct _BASIC_PROP_INIT_INFO { LONG lNumProps; // number of item properties LPOLESTR *pszPropNames; // item property names PROPID *piPropIDs; // item property ids PROPVARIANT *pvPropVars; // item property prop variants PROPSPEC *psPropSpec; // item property propspecs WIA_PROPERTY_INFO *pwpiPropInfo; // item property attributes }BASIC_PROP_INIT_INFO,*PBASIC_PROP_INIT_INFO; #define HKEY_WIASCANR_FAKE_EVENTS TEXT("Software\\Microsoft\\WIASCANR") #define WIASCANR_DWORD_FAKE_EVENT_CODE TEXT("EventCode") #define AVERAGE_FAKE_PAGE_HEIGHT_INCHES 11 #define DEFAULT_LOCK_TIMEOUT 100 #define WIA_DEVICE_ROOT_NAME L"Root" // THIS SHOULD NOT BE LOCALIZED #define WIA_DEVICE_FLATBED_NAME L"Flatbed" // THIS SHOULD NOT BE LOCALIZED #define WIA_DEVICE_FEEDER_NAME L"Feeder" // THIS SHOULD NOT BE LOCALIZED // // Class definition for WIA device object // class CWIADevice : public IStiUSD, // STI USD interface public IWiaMiniDrv, // WIA Minidriver interface public INonDelegatingUnknown // NonDelegatingUnknown { public: ///////////////////////////////////////////////////////////////////////// // Construction/Destruction Section // ///////////////////////////////////////////////////////////////////////// CWIADevice(LPUNKNOWN punkOuter); ~CWIADevice(); HRESULT PrivateInitialize(); private: // COM object data ULONG m_cRef; // Device object reference count. // STI information LPUNKNOWN m_punkOuter; // Pointer to outer unknown. DWORD m_dwLastOperationError; // Last error. DWORD m_dwLockTimeout; // Lock timeout for LockDevice() calls BOOL m_bDeviceLocked; // device locked/unlocked HANDLE m_hDeviceDataHandle; // Device communication handle // Event information OVERLAPPED m_EventOverlapped; // event overlapped IO structure BYTE m_EventData[32]; // event data BOOL m_bPolledEvent; // event polling flag HKEY m_hFakeEventKey; // event HKEY for simulating notifications GUID m_guidLastEvent; // Last event ID. // WIA information IWiaDrvItem *m_pIDrvItemRoot; // The root item. IStiDevice *m_pStiDevice; // Sti object. IWiaLog *m_pIWiaLog; // WIA logging object BOOL m_bADFEnabled; // ADF enabled flag BOOL m_bADFAttached; // ADF attached flag LONG m_lClientsConnected; // number of applications connected CFakeScanAPI *m_pScanAPI; // FakeScanner API object LONG m_NumSupportedFormats; // Number of supported formats WIA_FORMAT_INFO *m_pSupportedFormats; // supported formats LONG m_NumSupportedCommands; // Number of supported commands LONG m_NumSupportedEvents; // Number of supported events WIA_DEV_CAP_DRV *m_pCapabilities; // capabilities LONG m_NumInitialFormats; // Number of Initial formats GUID *m_pInitialFormats; // initial formats BASIC_PROP_INFO m_SupportedTYMED; // supported TYMED BASIC_PROP_INFO m_SupportedDataTypes; // supported data types BASIC_PROP_INFO m_SupportedIntents; // supported intents BASIC_PROP_INFO m_SupportedCompressionTypes; // supported compression types BASIC_PROP_INFO m_SupportedResolutions; // supported resolutions BASIC_PROP_INFO m_SupportedPreviewModes;// supported preview modes LONG m_NumRootItemProperties;// Number of Root item properties LONG m_NumItemProperties; // Number of item properties BASIC_PROP_INIT_INFO m_RootItemInitInfo; BASIC_PROP_INIT_INFO m_ChildItemInitInfo; public: ///////////////////////////////////////////////////////////////////////// // Standard COM Section // ///////////////////////////////////////////////////////////////////////// STDMETHODIMP QueryInterface( REFIID riid, LPVOID * ppvObj); STDMETHODIMP_(ULONG) AddRef( void); STDMETHODIMP_(ULONG) Release( void); ///////////////////////////////////////////////////////////////////////// // IStiUSD Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // 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 dwNumberOfBytes, LPOVERLAPPED lpOverlapped); STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hEvent); STDMETHOD(GetNotificationData)(THIS_ LPSTINOTIFY lpNotify); STDMETHOD(GetLastErrorInfo)(THIS_ STI_ERROR_INFO *pLastErrorInfo); ///////////////////////////////////////////////////////////////////////// // IWiaMiniDrv Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // 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(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(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(drvGetCapabilities)(THIS_ BYTE *pWiasContext, LONG ulFlags, LONG *pcelt, WIA_DEV_CAP_DRV **ppCapabilities, LONG *plDevErrVal); STDMETHOD(drvDeleteItem)(THIS_ BYTE *pWiasContext, LONG lFlags, LONG *plDevErrVal); STDMETHOD(drvFreeDrvItemContext)(THIS_ LONG lFlags, BYTE *pSpecContext, 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 *pWiasContext); ///////////////////////////////////////////////////////////////////////// // INonDelegating Interface Section (for all WIA drivers) // ///////////////////////////////////////////////////////////////////////// // // 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(); private: ///////////////////////////////////////////////////////////////////////// // Private helper functions section (for your specific driver) // ///////////////////////////////////////////////////////////////////////// // // // This section is for private helpers used for common WIA operations. // // These are custom to your driver. // // // // // // -- WIA Item Management Helpers // // DeleteItemTree() // // // // -- WIA Property Management Helpers // // BuildRootItemProperties() // // BuildTopItemProperties() // // // // -- WIA Capability Management Helpers // // BuildRootItemProperties() // // DeleteRootItemProperties() // // BuildTopItemProperties() // // DeleteTopItemProperties() // // BuildCapabilities() // // DeleteCapabilitiesArrayContents() // // BuildSupportedFormats() // // DeleteSupportedFormatsArrayContents() // // BuildSupportedDataTypes() // // DeleteSupportedDataTypesArrayContents() // // BuildSupportedIntents() // // DeleteSupportedIntentsArrayContents() // // BuildSupportedCompressions() // // DeleteSupportedCompressionsArrayContents() // // BuildSupportedPreviewModes() // // DeleteSupportedPreviewModesArrayContents() // // BuildSupportedTYMED() // // DeleteSupportedTYMEDArrayContents() // // BuildSupportedResolutions() // // DeleteSupportedResolutionsArrayContents() // // BuildInitialFormats() // // DeleteInitialFormatsArrayContents() // // // // -- WIA Validation Helpers // // CheckDataType() // // CheckIntent() // // CheckPreferredFormat() // // CheckADFStatus() // // CheckPreview() // // CheckXExtent() // // UpdateValidDepth() // // UpdateValidPages() // // ValidateDataTransferContext() // // // // -- WIA Resource file Helpers // // GetBSTRResourceString() // // GetOLESTRResourceString() // // // // -- WIA Data Helpers // // AlignInPlace() // // SwapBuffer24() // // GetPageCount() // // IsPreviewScan() // // SetItemSize() // // // ///////////////////////////////////////////////////////////////////////// HRESULT DeleteItemTree(); HRESULT BuildRootItemProperties(); HRESULT DeleteRootItemProperties(); HRESULT BuildChildItemProperties(); HRESULT DeleteChildItemProperties(); HRESULT BuildCapabilities(); HRESULT DeleteCapabilitiesArrayContents(); HRESULT BuildSupportedFormats(); HRESULT DeleteSupportedFormatsArrayContents(); HRESULT BuildSupportedDataTypes(); HRESULT DeleteSupportedDataTypesArrayContents(); HRESULT BuildSupportedIntents(); HRESULT DeleteSupportedIntentsArrayContents(); HRESULT BuildSupportedCompressions(); HRESULT DeleteSupportedCompressionsArrayContents(); HRESULT BuildSupportedPreviewModes(); HRESULT DeleteSupportedPreviewModesArrayContents(); HRESULT BuildSupportedTYMED(); HRESULT DeleteSupportedTYMEDArrayContents(); HRESULT BuildSupportedResolutions(); HRESULT DeleteSupportedResolutionsArrayContents(); HRESULT BuildInitialFormats(); HRESULT DeleteInitialFormatsArrayContents(); HRESULT CheckDataType(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckIntent(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckPreferredFormat(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckADFStatus(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckPreview(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT CheckXExtent(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext,LONG lWidth); HRESULT UpdateValidDepth(BYTE *pWiasContext,LONG lDataType,LONG *lDepth); HRESULT UpdateValidPages(BYTE *pWiasContext,WIA_PROPERTY_CONTEXT *pContext); HRESULT ValidateDataTransferContext(PMINIDRV_TRANSFER_CONTEXT pDataTransferContext); HRESULT GetBSTRResourceString(LONG lLocalResourceID,BSTR *pBSTR,BOOL bLocal); HRESULT GetOLESTRResourceString(LONG lLocalResourceID,LPOLESTR *ppsz,BOOL bLocal); UINT AlignInPlace(PBYTE pBuffer,LONG cbWritten,LONG lBytesPerScanLine,LONG lBytesPerScanLineRaw); VOID SwapBuffer24(PBYTE pBuffer,LONG lByteCount); LONG GetPageCount(BYTE *pWiasContext); BOOL IsPreviewScan(BYTE *pWiasContext); HRESULT SetItemSize(BYTE *pWiasContext); };