/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORP., 1998 * * TITLE: WiaDev.Cpp * * VERSION: 2.0 * * AUTHOR: ReedB * * DATE: 30 Aug, 1998 * * DESCRIPTION: * Implementation of the WIA test scanner mini driver * device methods. * *******************************************************************************/ #define __FORMATS_AND_MEDIA_TYPES__ #include #include #include #include "testusd.h" #include "defprop.h" extern HINSTANCE g_hInst; // Global hInstance extern WIA_FORMAT_INFO* g_wfiTable; /**************************************************************************\ * TestUsdDevice::InitializWia * * * * Arguments: * * * * Return Value: * * Status * * History: * * 9/11/1998 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvInitializeWia( BYTE *pWiasContext, LONG lFlags, BSTR bstrDeviceID, BSTR bstrRootFullItemName, IUnknown *pStiDevice, IUnknown *pIUnknownOuter, IWiaDrvItem **ppIDrvItemRoot, IUnknown **ppIUnknownInner, LONG *plDevErrVal) { HRESULT hr; LONG lDevErrVal; WIAS_TRACE((g_hInst,"drvInitializeWia, device ID: %ws", bstrDeviceID)); *ppIDrvItemRoot = NULL; *ppIUnknownInner = NULL; *plDevErrVal = 0; // // Need to init names and STI pointer? // if (m_pStiDevice == NULL) { // // save STI device inteface for locking // m_pStiDevice = (IStiDevice *)pStiDevice; // // Cache the device ID // m_bstrDeviceID = SysAllocString(bstrDeviceID); if (! m_bstrDeviceID) { return (E_OUTOFMEMORY); } m_bstrRootFullItemName = SysAllocString(bstrRootFullItemName); if (! m_bstrRootFullItemName) { return (E_OUTOFMEMORY); } } // // Build the device item tree // hr = drvDeviceCommand(NULL, 0, &WIA_CMD_SYNCHRONIZE, NULL, &lDevErrVal); if (SUCCEEDED(hr)) { *ppIDrvItemRoot = m_pIDrvItemRoot; } return (hr); } /**************************************************************************\ * TestUsdDevice::drvUnInitializeWia * * Gets called when a client connection is going away. * * Arguments: * * pWiasContext - Pointer to the WIA Root item context of the client's * item tree. * * Return Value: * Status * * History: * * 30/12/1999 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvUnInitializeWia( BYTE *pWiasContext) { return S_OK; } /**************************************************************************\ * * Mini Driver Device Services * \**************************************************************************/ /**************************************************************************\ * drvGetDeviceErrorStr * * Map a device error value to a string. * * Arguments: * * * * Return Value: * * Status * * History: * * 10/2/1998 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvGetDeviceErrorStr( LONG lFlags, LONG lDevErrVal, LPOLESTR *ppszDevErrStr, LONG *plDevErr) { *plDevErr = 0; if (!ppszDevErrStr) { WIAS_ERROR((g_hInst,"drvGetDeviceErrorStr, NULL ppszDevErrStr")); return E_POINTER; } // Map device errors to a string to be placed in the event log. switch (lDevErrVal) { case 0: *ppszDevErrStr = L"No Error"; break; default: *ppszDevErrStr = L"Device Error, Unknown Error"; return E_FAIL; } return S_OK; } /**************************************************************************\ * DeleteDeviceItemTree * * Recursive device item tree delete routine. Deletes the whole tree. * * Arguments: * * * * Return Value: * * Status * * History: * * 10/2/1998 Original Version * \**************************************************************************/ HRESULT TestUsdDevice::DeleteDeviceItemTree( LONG *plDevErrVal) { HRESULT hr; // // does tree exist // if (m_pIDrvItemRoot == NULL) { return S_OK; } // // Unlink and release the driver item tree. // hr = m_pIDrvItemRoot->UnlinkItemTree(WiaItemTypeDisconnected); m_pIDrvItemRoot = NULL; return hr; } /**************************************************************************\ * BuildDeviceItemTree * * The device uses the IWiaDrvServices methods to build up a tree of * device items. * * Arguments: * * * * Return Value: * * Status * * History: * * 10/2/1998 Original Version * \**************************************************************************/ HRESULT TestUsdDevice::BuildDeviceItemTree( LONG *plDevErrVal) { HRESULT hr = S_OK; // // This device doesn't touch hardware to build the tree. // if (plDevErrVal) { *plDevErrVal = 0; } CAMERA_STATUS camStatus; if (! m_pIDrvItemRoot) { hr = CamBuildImageTree(&camStatus, &m_pIDrvItemRoot); } return hr; } /**************************************************************************\ * InitDeviceProperties * * * * Arguments: * * * * Return Value: * * Status * * History: * * 10/2/1998 Original Version * \**************************************************************************/ HRESULT TestUsdDevice::InitDeviceProperties( BYTE *pWiasContext, LONG *plDevErrVal) { HRESULT hr; BSTR bstrFirmwreVer; SYSTEMTIME camTime; int i; PROPVARIANT propVar; // // This device doesn't touch hardware to initialize the device properties. // if (plDevErrVal) { *plDevErrVal = 0; } // // Parameter validation. // if (! pWiasContext) { WIAS_ERROR((g_hInst,"InitDeviceProperties, invalid input pointers")); return E_POINTER; } // // Write standard property names // hr = wiasSetItemPropNames(pWiasContext, sizeof(gDevicePropIDs)/sizeof(PROPID), gDevicePropIDs, gDevicePropNames); if (FAILED(hr)) { WIAS_TRACE((g_hInst,"InitDeviceProperties() WritePropertyNames() failed")); return (hr); } // // Write the properties supported by all WIA devices // bstrFirmwreVer = SysAllocString(L"02161999"); if (bstrFirmwreVer) { wiasWritePropStr( pWiasContext, WIA_DPA_FIRMWARE_VERSION, bstrFirmwreVer); SysFreeString(bstrFirmwreVer); } wiasWritePropLong( pWiasContext, WIA_DPA_CONNECT_STATUS, 1); wiasWritePropLong( pWiasContext, WIA_DPC_PICTURES_TAKEN, 0); GetSystemTime(&camTime); wiasWritePropBin( pWiasContext, WIA_DPA_DEVICE_TIME, sizeof(SYSTEMTIME), (PBYTE)&camTime); // // Write the camera properties, just default values, it may vary with items // wiasWritePropLong( pWiasContext, WIA_DPC_PICTURES_REMAINING, 0); wiasWritePropLong( pWiasContext, WIA_DPC_THUMB_WIDTH, 80); wiasWritePropLong( pWiasContext, WIA_DPC_THUMB_HEIGHT, 60); wiasWritePropLong( pWiasContext, WIA_DPC_PICT_WIDTH, 1024); wiasWritePropLong( pWiasContext, WIA_DPC_PICT_HEIGHT, 768); // Give WIA_DPC_EXPOSURE_MODE to WIA_DPC_TIMER_VALUE some default. wiasWritePropLong( pWiasContext, WIA_DPC_EXPOSURE_MODE, 0); wiasWritePropLong( pWiasContext, WIA_DPC_FLASH_MODE, 1); wiasWritePropLong( pWiasContext, WIA_DPC_FOCUS_MODE, 0); wiasWritePropLong( pWiasContext, WIA_DPC_ZOOM_POSITION, 0); wiasWritePropLong( pWiasContext, WIA_DPC_BATTERY_STATUS, 1); wiasWritePropLong( pWiasContext, WIA_DPC_TIMER_MODE, 0); wiasWritePropLong( pWiasContext, WIA_DPC_TIMER_VALUE, 0); // // Write the WIA_DPP_TCAM_ROOT_PATH property // BSTR bstrRootPath; #ifdef UNICODE bstrRootPath = SysAllocString(gpszPath); #else WCHAR wszPath[MAX_PATH]; mbstowcs(wszPath, gpszPath, strlen(gpszPath)+1); bstrRootPath = SysAllocString(wszPath); #endif if (! bstrRootPath) { return (E_OUTOFMEMORY); } wiasWritePropStr(pWiasContext, WIA_DPP_TCAM_ROOT_PATH, bstrRootPath); // // Use WIA services to set the property access and // valid value information from gDevPropInfoDefaults. // hr = wiasSetItemPropAttribs(pWiasContext, NUM_CAM_DEV_PROPS, gDevicePropSpecDefaults, gDevPropInfoDefaults); return (S_OK); } /**************************************************************************\ * drvDeviceCommand * * * * Arguments: * * * * Return Value: * * Status * * History: * * 9/11/1998 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvDeviceCommand( BYTE *pWiasContext, LONG lFlags, const GUID *plCommand, IWiaDrvItem **ppWiaDrvItem, LONG *plErr) { HRESULT hr; // // init return value // if (ppWiaDrvItem != NULL) { *ppWiaDrvItem = NULL; } // // dispatch command // if (*plCommand == WIA_CMD_SYNCHRONIZE) { hr = drvLockWiaDevice(pWiasContext, lFlags, plErr); if (FAILED(hr)) { return (hr); } // // SYNCHRONIZE - make sure tree is up to date with device // // The driver's responsibility is to make sure the tree is accurate. // hr = BuildDeviceItemTree(plErr); drvUnLockWiaDevice(pWiasContext, lFlags, plErr); return (hr); } else { WIAS_TRACE((g_hInst,"drvDeviceCommand: Unsupported command")); hr = E_NOTIMPL; } return hr; } /**************************************************************************\ * drvGetCapabilities * * * * Arguments: * * * * Return Value: * * Status * * History: * * 17/3/1999 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvGetCapabilities( BYTE *pWiasContext, LONG ulFlags, LONG *pCelt, WIA_DEV_CAP_DRV **ppCapabilities, LONG *plDevErrVal) { *plDevErrVal = 0; // // Return Commmand &| Events depending on flags // switch (ulFlags) { case WIA_DEVICE_COMMANDS: // // Only commands // *pCelt = NUM_CAP_ENTRIES - NUM_EVENTS; *ppCapabilities = &gCapabilities[NUM_EVENTS]; break; case WIA_DEVICE_EVENTS: // // Only events // *pCelt = NUM_EVENTS; *ppCapabilities = gCapabilities; break; case (WIA_DEVICE_COMMANDS | WIA_DEVICE_EVENTS): // // Both events and commands // *pCelt = NUM_CAP_ENTRIES; *ppCapabilities = gCapabilities; break; default: // // Flags is invalid // WIAS_ERROR((g_hInst, "drvGetCapabilities, flags was invalid")); return (E_INVALIDARG); } return (S_OK); } /**************************************************************************\ * drvGetWiaFormatInfo * * Returns an array of formats and media types supported. * * Arguments: * * pWiasContext - Pointer to the WIA item context, unused. * lFlags - Operation flags, unused. * pcelt - Pointer to returned number of elements in * returned WiaFormatInfo array. * ppfe - Pointer to returned WiaFormatInfo array. * plDevErrVal - Pointer to the device error value. * * Return Value: * A pointer to an array of FORMATETC. These are the formats and media * types supported. * * Status * * History: * * 16/03/1999 Original Version * \**************************************************************************/ #define NUM_WIA_FORMAT_INFO 3 HRESULT _stdcall TestUsdDevice::drvGetWiaFormatInfo( BYTE *pWiasContext, LONG lFlags, LONG *pcelt, WIA_FORMAT_INFO **ppwfi, LONG *plDevErrVal) { // // If it hasn't been done already, set up the g_wfiTable table // if (! g_wfiTable) { g_wfiTable = (WIA_FORMAT_INFO*) CoTaskMemAlloc(sizeof(WIA_FORMAT_INFO) * NUM_WIA_FORMAT_INFO); if (! g_wfiTable) { WIAS_ERROR((g_hInst, "drvGetWiaFormatInfo, out of memory")); return (E_OUTOFMEMORY); } // // Set up the format/tymed pairs // g_wfiTable[0].guidFormatID = WiaImgFmt_MEMORYBMP; g_wfiTable[0].lTymed = TYMED_CALLBACK; g_wfiTable[1].guidFormatID = WiaImgFmt_BMP; g_wfiTable[1].lTymed = TYMED_FILE; g_wfiTable[2].guidFormatID = WiaAudFmt_WAV; g_wfiTable[2].lTymed = TYMED_FILE; } *plDevErrVal = 0; *pcelt = NUM_WIA_FORMAT_INFO; *ppwfi = g_wfiTable; return S_OK; } /**************************************************************************\ * drvNotifyPnpEvent * * Notify Pnp Event received by device manager * * Arguments: * * * * Return Value: * * Status * * History: * * Aug/3rd/1999 Original Version * \**************************************************************************/ HRESULT _stdcall TestUsdDevice::drvNotifyPnpEvent( const GUID *pEventGUID, BSTR bstrDeviceID, ULONG ulReserved) { return (S_OK); }