|
|
/**************************************************************************
* * (C) COPYRIGHT MICROSOFT CORP., 2000 * * TITLE: scanapi.cpp * * VERSION: 1.0 * * DATE: 18 July, 2000 * * DESCRIPTION: * Fake Scanner device library * ***************************************************************************/
#include "pch.h"
#ifdef UNICODE
#define TSTRSTR wcsstr
#define TSSCANF swscanf
#else
#define TSTRSTR strstr
#define TSSCANF sscanf
#endif
#define MAX_CAPABILITIES 65535
extern HINSTANCE g_hInst;
////////////////////////////////////////////////////////////////////////////////
// MICRO DRIVER SYSTEM SUPPORT //
////////////////////////////////////////////////////////////////////////////////
CMicroDriverAPI::CMicroDriverAPI() { // wipe supported resolutions string
memset(m_szResolutions,0,sizeof(m_szResolutions)); // wipe scaninfo structure
memset(&m_ScanInfo,0,sizeof(m_ScanInfo)); m_bDisconnected = FALSE; }
CMicroDriverAPI::~CMicroDriverAPI() {
//
// close any open Device Data handles left open by Micro Driver
// skip index 0 because WIAFBDRV owns that handle..
//
for(int i = 1; i < MAX_IO_HANDLES ; i++){ if((NULL != m_ScanInfo.DeviceIOHandles[i]) && (INVALID_HANDLE_VALUE != m_ScanInfo.DeviceIOHandles[i])){ CloseHandle(m_ScanInfo.DeviceIOHandles[i]); m_ScanInfo.DeviceIOHandles[i] = NULL; } }
if(m_pMicroDriver){ delete m_pMicroDriver; m_pMicroDriver = NULL; } }
//
// data acquisition functions
//
HRESULT CMicroDriverAPI::Scan(LONG lState, PBYTE pData, DWORD dwBytesToRead, PDWORD pdwBytesWritten) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::Scan");
HRESULT hr = S_OK; LONG lLine = SCAN_FIRST;
switch (lState) { case SCAN_START: WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, SCAN_START")); lLine = SCAN_FIRST; break; case SCAN_CONTINUE: WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, SCAN_CONTINUE")); lLine = SCAN_NEXT; break; case SCAN_END: WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, SCAN_END")); lLine = SCAN_FINISHED; default: break; }
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, Requesting %d bytes from caller",dwBytesToRead)); hr = m_pMicroDriver->Scan(&m_ScanInfo,lLine,pData,dwBytesToRead,(LONG*)pdwBytesWritten); if(pdwBytesWritten){ WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, Returning %d bytes to caller",*pdwBytesWritten)); } else { WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, Returning 0 bytes to caller")); }
if(FAILED(hr)){ WIAS_LERROR(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,("CMicroDriverAPI::Scan, Failed to Acquire data")); WIAS_LHRESULT(m_pIWiaLog, hr); } else { WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::Scan, Data Pointer = %x",pData)); }
//
// handle device disconnection error
//
if(m_bDisconnected){ WIAS_LERROR(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,("Scan, Device was disconnected, returning WIA_ERROR_OFFLINE to caller")); return WIA_ERROR_OFFLINE; } return hr; }
HRESULT CMicroDriverAPI::SetDataType(LONG lDataType) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetDataType");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo;
Val.lVal = lDataType; hr = m_pMicroDriver->MicroEntry(CMD_SETDATATYPE, &Val);
return hr; }
HRESULT CMicroDriverAPI::SetXYResolution(LONG lXResolution, LONG lYResolution) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetXYResolution");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo;
Val.lVal = lXResolution; hr = m_pMicroDriver->MicroEntry(CMD_SETXRESOLUTION, &Val); if (FAILED(hr)) return hr;
Val.lVal = lYResolution; hr = m_pMicroDriver->MicroEntry(CMD_SETYRESOLUTION, &Val);
return hr; }
HRESULT CMicroDriverAPI::SetSelectionArea(LONG lXPos, LONG lYPos, LONG lXExt, LONG lYExt) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetSelectionArea");
HRESULT hr = S_OK; hr = m_pMicroDriver->SetPixelWindow(&m_ScanInfo,lXPos,lYPos,lXExt,lYExt); return hr; }
HRESULT CMicroDriverAPI::SetContrast(LONG lContrast) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetContrast");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo;
Val.lVal = lContrast; hr = m_pMicroDriver->MicroEntry(CMD_SETCONTRAST, &Val);
return hr; }
HRESULT CMicroDriverAPI::SetIntensity(LONG lIntensity) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetIntensity");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo;
Val.lVal = lIntensity; hr = m_pMicroDriver->MicroEntry(CMD_SETINTENSITY, &Val);
return hr; }
HRESULT CMicroDriverAPI::DisableDevice() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::DisableDevice");
HRESULT hr = S_OK; m_bDisconnected = TRUE; return hr; }
HRESULT CMicroDriverAPI::EnableDevice() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::EnableDevice");
HRESULT hr = S_OK; m_bDisconnected = FALSE; return hr; }
HRESULT CMicroDriverAPI::DeviceOnline() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::DeviceOnline");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; hr = m_pMicroDriver->MicroEntry(CMD_STI_GETSTATUS,&Val); if (SUCCEEDED(hr)) { if (Val.lVal != 1) hr = E_FAIL; } return hr; }
HRESULT CMicroDriverAPI::GetDeviceEvent(GUID *pEvent) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::GetDeviceEvent");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; *pEvent = GUID_NULL; hr = m_pMicroDriver->MicroEntry(CMD_STI_GETSTATUS,&Val); if (SUCCEEDED(hr)) { if (Val.pGuid != NULL) *pEvent = *Val.pGuid; else *pEvent = GUID_NULL; } return hr; }
HRESULT CMicroDriverAPI::DoInterruptEventThread(PINTERRUPTEVENTINFO pEventInfo) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::DoInterruptEventThread");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pHandle = pEventInfo->phSignalEvent; Val.handle = pEventInfo->hShutdownEvent; Val.pGuid = pEventInfo->pguidEvent; Val.pScanInfo = &m_ScanInfo; lstrcpyA(Val.szVal,pEventInfo->szDeviceName);
hr = m_pMicroDriver->MicroEntry(CMD_GET_INTERRUPT_EVENT,&Val); return hr; }
HRESULT CMicroDriverAPI::Diagnostic() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::Diagnostic");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; hr = m_pMicroDriver->MicroEntry(CMD_STI_DIAGNOSTIC,&Val);
return hr; }
HRESULT CMicroDriverAPI::Initialize(PINITINFO pInitInfo) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::Initialize");
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val));
m_pMicroDriver = NULL; m_pMicroDriver = new CMICRO(pInitInfo->szModuleFileName); if (NULL != m_pMicroDriver) {
// set DeviceIOHandles
m_ScanInfo.DeviceIOHandles[0] = pInitInfo->hDeviceDataHandle; // send HKEY
hr = SetSTIDeviceHKEY(&pInitInfo->hKEY); // send Initialize call
Val.pScanInfo = &m_ScanInfo; lstrcpyA(Val.szVal,pInitInfo->szCreateFileName); hr = m_pMicroDriver->MicroEntry(CMD_INITIALIZE,&Val); if(hr == S_OK){
//
// perform a quick validation sweep, to make sure we didn't get bad values
// from a micro driver
//
//
// check current values, for strange negative values...or 0
//
if(m_ScanInfo.BedHeight <= 0){ hr = E_INVALIDARG; }
if(m_ScanInfo.BedWidth <= 0){ hr = E_INVALIDARG; }
if(m_ScanInfo.Xresolution <= 0){ hr = E_INVALIDARG; }
if(m_ScanInfo.Yresolution <= 0){ hr = E_INVALIDARG; }
if(m_ScanInfo.OpticalXResolution <= 0){ hr = E_INVALIDARG; }
if(m_ScanInfo.OpticalYResolution <= 0){ hr = E_INVALIDARG; }
if(SUCCEEDED(hr)){
//
// check logical values
//
} } } else hr = E_OUTOFMEMORY; return hr; }
HRESULT CMicroDriverAPI::UnInitialize() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::UnInitialize"); HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); // send UnInitialize call
Val.pScanInfo = &m_ScanInfo; hr = m_pMicroDriver->MicroEntry(CMD_UNINITIALIZE,&Val); if(E_NOTIMPL == hr){ hr = S_OK; } return hr; }
//
// standard device operations
//
HRESULT CMicroDriverAPI::ResetDevice() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ResetDevice");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; hr = m_pMicroDriver->MicroEntry(CMD_STI_DEVICERESET,&Val);
return hr; } HRESULT CMicroDriverAPI::SetEmulationMode(LONG lDeviceMode) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetEmulationMode");
HRESULT hr = S_OK; return hr; }
//
// Automatic document feeder functions
//
HRESULT CMicroDriverAPI::ADFAttached() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ADFAttached");
if(m_ScanInfo.ADF == 1) return S_OK; else return S_FALSE; }
HRESULT CMicroDriverAPI::ADFHasPaper() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ADFHasPaper");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.lVal = MCRO_ERROR_GENERAL_ERROR;
hr = m_pMicroDriver->MicroEntry(CMD_GETADFHASPAPER,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
if(MicroDriverErrorToWIAError(Val.lVal) == WIA_ERROR_PAPER_EMPTY){ hr = S_FALSE; } return hr; }
HRESULT CMicroDriverAPI::ADFAvailable() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ADFAvailable");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.lVal = MCRO_ERROR_GENERAL_ERROR;
hr = m_pMicroDriver->MicroEntry(CMD_GETADFAVAILABLE,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
return MicroDriverErrorToWIAError(Val.lVal); }
HRESULT CMicroDriverAPI::ADFFeedPage() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ADFFeedPage");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.lVal = MCRO_ERROR_GENERAL_ERROR;
hr = m_pMicroDriver->MicroEntry(CMD_LOAD_ADF,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
return MicroDriverErrorToWIAError(Val.lVal); }
HRESULT CMicroDriverAPI::ADFUnFeedPage() { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::ADFUnFeedPage");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.lVal = MCRO_ERROR_GENERAL_ERROR;
hr = m_pMicroDriver->MicroEntry(CMD_UNLOAD_ADF,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
return MicroDriverErrorToWIAError(Val.lVal); }
HRESULT CMicroDriverAPI::ADFStatus() { HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.lVal = MCRO_ERROR_GENERAL_ERROR;
hr = m_pMicroDriver->MicroEntry(CMD_GETADFSTATUS,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
return MicroDriverErrorToWIAError(Val.lVal); }
HRESULT CMicroDriverAPI::SetFormat(GUID *pguidFormat) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetFormat");
HRESULT hr = S_OK;
VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; Val.pGuid = pguidFormat;
hr = m_pMicroDriver->MicroEntry(CMD_SETFORMAT,&Val); if(hr == E_NOTIMPL) return S_OK;
if(FAILED(hr)) return hr;
return hr; }
HRESULT CMicroDriverAPI::MicroDriverErrorToWIAError(LONG lMicroDriverError) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::MicroDriverErrorToWIAError");
HRESULT hr = E_FAIL; switch(lMicroDriverError){ case MCRO_STATUS_OK: hr = S_OK; break; case MCRO_ERROR_USER_INTERVENTION: hr = WIA_ERROR_USER_INTERVENTION; break; case MCRO_ERROR_PAPER_JAM: hr = WIA_ERROR_PAPER_JAM; break; case MCRO_ERROR_PAPER_PROBLEM: hr = WIA_ERROR_PAPER_PROBLEM; break; case MCRO_ERROR_OFFLINE: hr = WIA_ERROR_OFFLINE; break; case MCRO_ERROR_GENERAL_ERROR: hr = WIA_ERROR_GENERAL_ERROR; break; case MCRO_ERROR_PAPER_EMPTY: hr = WIA_ERROR_PAPER_EMPTY; break; default: break; } return hr; }
//
// EXPECTED FORMAT:
// Range: "MIN 75,MAX 1200,NOM 150,INC 1"
// list: "75, 100, 150, 200, 600, 1200"
//
BOOL CMicroDriverAPI::IsValidRestriction(LONG **ppList, LONG *plNumItems, RANGEVALUEEX *pRangeValues) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::IsValidRestriction");
// set list pointer to null
*ppList = NULL; LONG *pList = NULL;
// set number of items to zero
LONG lNumItems = 0; *plNumItems = 0;
// set range stucture to zeros
pRangeValues->lMax = 0; pRangeValues->lMin = 0; pRangeValues->lNom = 0; pRangeValues->lStep = 0;
// string size check
if(lstrlen(m_szResolutions) <= 0) return FALSE;
// valid range or list check
TCHAR *psz = NULL;
CHAR szTemp[20];
// valid range?
INT iErrorCode = EOF;
BOOL bValidRange = FALSE; psz = TSTRSTR(m_szResolutions,TEXT("MIN")); if (psz) { psz = TSTRSTR(psz,TEXT(" ")); if (psz) { iErrorCode = TSSCANF(psz,TEXT("%d"),&pRangeValues->lMin); psz = NULL; psz = TSTRSTR(m_szResolutions,TEXT("MAX")); if ((psz)&&(iErrorCode != 0)&&(iErrorCode != EOF)) { psz = TSTRSTR(psz,TEXT(" ")); if (psz) { iErrorCode = TSSCANF(psz,TEXT("%d"),&pRangeValues->lMax); psz = NULL; psz = TSTRSTR(m_szResolutions,TEXT("NOM")); if ((psz)&&(iErrorCode != 0)&&(iErrorCode != EOF)) { psz = TSTRSTR(psz,TEXT(" ")); if (psz) { iErrorCode = TSSCANF(psz,TEXT("%d"),&pRangeValues->lNom); psz = NULL; psz = TSTRSTR(m_szResolutions,TEXT("INC")); if ((psz)&&(iErrorCode != 0)&&(iErrorCode != EOF)) { psz = TSTRSTR(psz,TEXT(" ")); if (psz) { iErrorCode = TSSCANF(psz,TEXT("%d"),&pRangeValues->lStep); if ((iErrorCode != 0)&&(iErrorCode != EOF)) { bValidRange = TRUE; } } } } } } } }
// check that range values are valid (to the definition of a RANGE)
if (bValidRange) { if (pRangeValues->lMin > pRangeValues->lMax) return FALSE; if (pRangeValues->lNom > pRangeValues->lMax) return FALSE; if (pRangeValues->lStep > pRangeValues->lMax) return FALSE; if (pRangeValues->lNom < pRangeValues->lMin) return FALSE; } }
if(!bValidRange){
// set range stucture to zeros (invalid range settings)
pRangeValues->lMax = 0; pRangeValues->lMin = 0; pRangeValues->lNom = 0; pRangeValues->lStep = 0;
LONG lTempResArray[255]; memset(lTempResArray,0,sizeof(lTempResArray)); // not valid range?..what about a valid list?
// valid list?
psz = m_szResolutions; while(psz){
// save value if one is found
if(psz){ iErrorCode = TSSCANF(psz,TEXT("%d"),&lTempResArray[lNumItems]); if((iErrorCode == EOF)||(iErrorCode == 0)) { // could not extract a value, assume invalid Resolution
// was found.
lNumItems = 0; break; } if(lTempResArray[lNumItems] <= 0){ // quit list iteration.. an invalid Resolution was found
lNumItems = 0; break; } lNumItems++; }
// seek to next value
psz = TSTRSTR(psz,TEXT(",")); if(psz) { // move past ',' marker
psz++; } }
if (lNumItems > 0) { // create list, and send it back to caller
pList = new LONG[lNumItems]; if (!pList) return FALSE;
for (LONG i = 0; i < lNumItems ; i++) { pList[i] = lTempResArray[i]; }
*plNumItems = lNumItems; *ppList = pList; } else { return FALSE; } }
return TRUE; }
//
// button
//
HRESULT CMicroDriverAPI::QueryButtonPanel(PDEVICE_BUTTON_INFO pButtonInformation) { HRESULT hr = S_OK; return hr; }
HRESULT CMicroDriverAPI::BuildCapabilities(PWIACAPABILITIES pCaps) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::BuildCapabilities");
//
// validate incoming parameters, and return E_INVALIDARG as needed
//
if (!pCaps) { return E_INVALIDARG; }
HRESULT hr = S_OK; VAL Val; memset(&Val,0,sizeof(Val)); Val.pScanInfo = &m_ScanInfo; WCHAR **ppszButtonNames = NULL;
hr = m_pMicroDriver->MicroEntry(CMD_GETCAPABILITIES,&Val); if (SUCCEEDED(hr)) {
//
// if this API is called with pCaps->pCapabilities == NULL, then return the
// total number of additional events.
//
if (NULL == pCaps->pCapabilities) { if ((Val.lVal >= 0) && (Val.lVal < MAX_CAPABILITIES)) { *pCaps->pNumSupportedEvents = Val.lVal; WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildCapabilities, Additional Supported Events from MicroDriver = %d",Val.lVal)); } else { hr = E_INVALIDARG; }
} else {
//
// populate the capabilities array with names and descriptions
//
for (LONG index = 0; index < Val.lVal; index++) {
ppszButtonNames = Val.ppButtonNames;
//
// allocate capability memory, for names, and descriptions
//
//
// calculate size in BYTES for maximium string value
// allowed by a capability
//
LONG lMaxCapabilityString = (MAX_PATH * sizeof(WCHAR)); pCaps->pCapabilities[index].wszName = (LPOLESTR)CoTaskMemAlloc(lMaxCapabilityString); pCaps->pCapabilities[index].wszDescription = (LPOLESTR)CoTaskMemAlloc(lMaxCapabilityString);
if ((pCaps->pCapabilities[index].wszDescription)&& (pCaps->pCapabilities[index].wszName)) {
pCaps->pCapabilities[index].wszName[(lMaxCapabilityString/sizeof(WCHAR)) - 1] = L'\0'; pCaps->pCapabilities[index].wszDescription[(lMaxCapabilityString/sizeof(WCHAR)) - 1] = L'\0';
if (ppszButtonNames) {
//
// copy button name
//
if (lstrcpyn(pCaps->pCapabilities[index].wszName,ppszButtonNames[index],(lMaxCapabilityString/sizeof(WCHAR)) - 1)) {
//
// copy button name, into button description (they are the same for Micro drivers)
//
if (!lstrcpyn(pCaps->pCapabilities[index].wszDescription,pCaps->pCapabilities[index].wszName,(lMaxCapabilityString/sizeof(WCHAR)) - 1)) {
//
// continue, allowing the other events to be read
//
} } } else {
//
// do default WIA provided Names for buttons (1,2,3,4,5,...etc)
//
WCHAR wszEventName[MAX_PATH]; memset(wszEventName,0,sizeof(wszEventName));
//
// load default button name from resource
//
if(LoadStringW(g_hInst,IDS_DEFAULT_EVENT_NAME,wszEventName,(sizeof(wszEventName)/sizeof(wszEventName[0])))) {
_snwprintf(pCaps->pCapabilities[index].wszName, ((lMaxCapabilityString/sizeof(WCHAR)) - 1), L"%ws %d", wszEventName, (index + 1)); if (!lstrcpyn(pCaps->pCapabilities[index].wszDescription,pCaps->pCapabilities[index].wszName,(lMaxCapabilityString/sizeof(WCHAR)) - 1)) {
//
// continue, allowing the other events to be read
//
} } }
//
// assign 'ACTION' to events
//
if(Val.pGuid) { pCaps->pCapabilities[index].guid = &Val.pGuid[index]; }
pCaps->pCapabilities[index].ulFlags = WIA_NOTIFICATION_EVENT|WIA_ACTION_EVENT; pCaps->pCapabilities[index].wszIcon = WIA_ICON_SCAN_BUTTON_PRESS;
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildCapabilities, Button Name = %ws",pCaps->pCapabilities[index].wszName)); WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildCapabilities, Button Desc = %ws",pCaps->pCapabilities[index].wszDescription));
} else { hr = E_OUTOFMEMORY; }// if ((pCaps->pCapabilities[index].wszDescription)&&(pCaps->pCapabilities[index].wszName))
} // for (LONG index = 0; index < Val.lVal; index++)
} } return hr; }
HRESULT CMicroDriverAPI::GetBedWidthAndHeight(PLONG pWidth, PLONG pHeight) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::GetBedWidthAndHeight");
HRESULT hr = S_OK; *pWidth = m_ScanInfo.BedWidth; *pHeight = m_ScanInfo.BedHeight; WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::GetBedWidthAndHeight, Width = %d, Height = %d",m_ScanInfo.BedWidth,m_ScanInfo.BedHeight)); return hr; }
HRESULT CMicroDriverAPI::BuildRootItemProperties(PWIAPROPERTIES pProperties) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::BuildRootItemProperties");
HRESULT hr = S_OK; LONG PropIndex = 0; //
// set the number of properties
//
hr = ADFAttached(); if(hr == S_OK){ pProperties->NumItemProperties = 19; // standard properties + ADF specific
} else { pProperties->NumItemProperties = 10; // standard properties only
}
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::BuildRootItemProperties, Number of Properties = %d",pProperties->NumItemProperties));
hr = AllocateAllProperties(pProperties); if(FAILED(hr)){ WIAS_LERROR(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,("CMicroDriverAPI::BuildRootItemProperties, AllocateAllProperties failed")); WIAS_LHRESULT(m_pIWiaLog, hr); DeleteAllProperties(pProperties); return hr; }
// Intialize WIA_DPS_HORIZONTAL_BED_SIZE
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_HORIZONTAL_BED_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_HORIZONTAL_BED_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.BedWidth; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_DPS_VERTICAL_BED_SIZE
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_VERTICAL_BED_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_VERTICAL_BED_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.BedHeight; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_ACCESS_RIGHTS
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_ACCESS_RIGHTS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_ACCESS_RIGHTS; pProperties->pvItemDefaults [PropIndex].lVal = WIA_ITEM_READ|WIA_ITEM_WRITE; pProperties->pvItemDefaults [PropIndex].vt = VT_UI4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_DPS_OPTICAL_XRES
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_OPTICAL_XRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_OPTICAL_XRES; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.OpticalXResolution; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_DPS_OPTICAL_YRES
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_OPTICAL_YRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_OPTICAL_YRES; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.OpticalYResolution; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPA_FIRMWARE_VERSION
pProperties->pszItemDefaults[PropIndex] = WIA_DPA_FIRMWARE_VERSION_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPA_FIRMWARE_VERSION; pProperties->pvItemDefaults [PropIndex].bstrVal = SysAllocString(SCANNER_FIRMWARE_VERSION); pProperties->pvItemDefaults [PropIndex].vt = VT_BSTR; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_IPA_ITEM_FLAGS
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_ITEM_FLAGS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_ITEM_FLAGS; pProperties->pvItemDefaults [PropIndex].lVal = WiaItemTypeRoot|WiaItemTypeFolder|WiaItemTypeDevice; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_FLAG; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits = WiaItemTypeRoot|WiaItemTypeFolder|WiaItemTypeDevice;
PropIndex++;
// Intialize WIA_DPS_MAX_SCAN_TIME (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_MAX_SCAN_TIME_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_MAX_SCAN_TIME; pProperties->pvItemDefaults [PropIndex].lVal = 10000; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_DPS_PREVIEW (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_PREVIEW_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_PREVIEW; pProperties->pvItemDefaults [PropIndex].lVal = WIA_FINAL_SCAN; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList= (BYTE*)pProperties->pSupportedPreviewModes; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedPreviewModes;
PropIndex++;
// Initialize WIA_DPS_SHOW_PREVIEW_CONTROL (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_SHOW_PREVIEW_CONTROL_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_SHOW_PREVIEW_CONTROL; pProperties->pvItemDefaults [PropIndex].lVal = WIA_SHOW_PREVIEW_CONTROL; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
if(m_ScanInfo.ADF == 1) {
// Initialize WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.BedWidth; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_VERTICAL_SHEET_FEED_SIZE
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_VERTICAL_SHEET_FEED_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_VERTICAL_SHEET_FEED_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.BedHeight; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES; pProperties->pvItemDefaults [PropIndex].lVal = FLAT | FEED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_FLAG; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_DOCUMENT_HANDLING_STATUS
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_DOCUMENT_HANDLING_STATUS_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_DOCUMENT_HANDLING_STATUS; pProperties->pvItemDefaults [PropIndex].lVal = FLAT_READY; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_DOCUMENT_HANDLING_SELECT
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_DOCUMENT_HANDLING_SELECT_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_DOCUMENT_HANDLING_SELECT; pProperties->pvItemDefaults [PropIndex].lVal = FLATBED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_FLAG; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits = FEEDER | FLATBED;
PropIndex++;
// Initialize WIA_DPS_PAGES
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_PAGES_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_PAGES; pProperties->pvItemDefaults [PropIndex].lVal = 1; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 0; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = 25; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = 1;
PropIndex++;
// Initialize WIA_DPS_SHEET_FEEDER_REGISTRATION
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_SHEET_FEEDER_REGISTRATION_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_SHEET_FEEDER_REGISTRATION; pProperties->pvItemDefaults [PropIndex].lVal = LEFT_JUSTIFIED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_HORIZONTAL_BED_REGISTRATION
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_HORIZONTAL_BED_REGISTRATION_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_HORIZONTAL_BED_REGISTRATION; pProperties->pvItemDefaults [PropIndex].lVal = LEFT_JUSTIFIED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Initialize WIA_DPS_VERTICAL_BED_REGISTRATION
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_VERTICAL_BED_REGISTRATION_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_VERTICAL_BED_REGISTRATION; pProperties->pvItemDefaults [PropIndex].lVal = TOP_JUSTIFIED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
} return hr; }
HRESULT CMicroDriverAPI::DeleteAllProperties(PWIAPROPERTIES pProperties) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::DeleteAllProperties");
if(pProperties->pszItemDefaults){ delete [] pProperties->pszItemDefaults; pProperties->pszItemDefaults = NULL; }
if(pProperties->piItemDefaults){ delete [] pProperties->piItemDefaults; pProperties->piItemDefaults = NULL; }
if(pProperties->pvItemDefaults){ delete [] pProperties->pvItemDefaults; pProperties->pvItemDefaults = NULL; }
if(pProperties->psItemDefaults){ delete [] pProperties->psItemDefaults; pProperties->psItemDefaults = NULL; }
if(pProperties->wpiItemDefaults){ delete [] pProperties->wpiItemDefaults; pProperties->wpiItemDefaults = NULL; }
return S_OK; }
HRESULT CMicroDriverAPI::AllocateAllProperties(PWIAPROPERTIES pProperties) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::AllocateAllProperties");
HRESULT hr = S_OK;
pProperties->pszItemDefaults = new LPOLESTR[pProperties->NumItemProperties]; if(NULL != pProperties->pszItemDefaults){ pProperties->piItemDefaults = new PROPID[pProperties->NumItemProperties]; if (NULL != pProperties->piItemDefaults) { pProperties->pvItemDefaults = new PROPVARIANT[pProperties->NumItemProperties]; if(NULL != pProperties->pvItemDefaults){ pProperties->psItemDefaults = new PROPSPEC[pProperties->NumItemProperties]; if(NULL != pProperties->psItemDefaults){ pProperties->wpiItemDefaults = new WIA_PROPERTY_INFO[pProperties->NumItemProperties]; if(NULL == pProperties->wpiItemDefaults) hr = E_OUTOFMEMORY; } else hr = E_OUTOFMEMORY; } else hr = E_OUTOFMEMORY; } else hr = E_OUTOFMEMORY; } else hr = E_OUTOFMEMORY;
return hr; }
HRESULT CMicroDriverAPI::BuildTopItemProperties(PWIAPROPERTIES pProperties) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::BuildTopItemProperties");
HRESULT hr = S_OK; VAL Value; memset(&Value,0,sizeof(Value)); Value.pScanInfo = &m_ScanInfo;
hr = m_pMicroDriver->MicroEntry(CMD_RESETSCANNER,&Value); if(FAILED(hr)){ return hr; }
//
// set the number of properties
//
pProperties->NumItemProperties = 29;
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::BuildTopItemProperties, Number of Properties = %d",pProperties->NumItemProperties));
hr = AllocateAllProperties(pProperties); if(FAILED(hr)){ WIAS_LERROR(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,("CMicroDriverAPI::BuildTopItemProperties, AllocateAllProperties failed")); WIAS_LHRESULT(m_pIWiaLog, hr); DeleteAllProperties(pProperties); return hr; }
//
// Get Data type restrictions (backup original data types)
// Memory used for the original set will be reused to write back
// the new valid values.
//
if(pProperties->bLegacyBWRestrictions){ //
// The NoColor=1 registry key was set to restrict this driver from supporting
// color... remove the valid bits, just incase the bits were set..
// This will automatically restrict our Data type array to report
// the correct valid values.
m_ScanInfo.SupportedDataTypes &= ~SUPPORT_COLOR; }
LONG lSupportedDataTypesArray[3]; // 3 is the maximum data type set allowed
LONG lNumSupportedDataTypes = 0; memcpy(lSupportedDataTypesArray,pProperties->pSupportedDataTypes,(sizeof(lSupportedDataTypesArray)));
//
// Set New Data type restrictions
//
if (m_ScanInfo.SupportedDataTypes != 0) { // check for 24-bit color support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_COLOR) { pProperties->pSupportedDataTypes[lNumSupportedDataTypes] = WIA_DATA_COLOR; lNumSupportedDataTypes++; } // check for 1-bit BW support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_BW) { pProperties->pSupportedDataTypes[lNumSupportedDataTypes] = WIA_DATA_THRESHOLD; lNumSupportedDataTypes++; } // check for 8-bit grayscale support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_GRAYSCALE) { pProperties->pSupportedDataTypes[lNumSupportedDataTypes] = WIA_DATA_GRAYSCALE; lNumSupportedDataTypes++; }
// set new supported data type count
pProperties->NumSupportedDataTypes = lNumSupportedDataTypes; }
LONG PropIndex = 0;
PLONG pResolutions = NULL; LONG lNumItems = 0; RANGEVALUEEX RangeValues; if(IsValidRestriction(&pResolutions, &lNumItems, &RangeValues)) { if(lNumItems > 0){ WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildTopItemProperties, Using .INF provided Resolutions (LIST)")); // we have a list
if(pProperties->pSupportedResolutions){ //delete [] pProperties->pSupportedResolutions;
pProperties->pSupportedResolutions = NULL; pProperties->pSupportedResolutions = pResolutions; pProperties->NumSupportedResolutions = lNumItems; }
// Intialize WIA_IPS_XRES (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XRES; pProperties->pvItemDefaults [PropIndex].lVal = pProperties->pSupportedResolutions[PropIndex]; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList= (BYTE*)pProperties->pSupportedResolutions; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedResolutions;
PropIndex++;
// Intialize WIA_IPS_YRES (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YRES; pProperties->pvItemDefaults [PropIndex].lVal = pProperties->pSupportedResolutions[PropIndex-1]; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList= (BYTE*)pProperties->pSupportedResolutions; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedResolutions;
PropIndex++;
} else { WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildTopItemProperties, Using .INF provided Resolutions (RANGE)")); // we have a range
// Intialize WIA_IPS_XRES (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XRES; pProperties->pvItemDefaults [PropIndex].lVal = RangeValues.lNom; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = RangeValues.lStep; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = RangeValues.lMin; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = RangeValues.lMax; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = RangeValues.lNom;
PropIndex++;
// Intialize WIA_IPS_YRES (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YRES; pProperties->pvItemDefaults [PropIndex].lVal = RangeValues.lNom; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = RangeValues.lStep; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = RangeValues.lMin; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = RangeValues.lMax; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = RangeValues.lNom;
PropIndex++; } } else { WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("BuildTopItemProperties, Using HOST Provided Resolution Restrictions")); #ifdef USE_RANGE_VALUES
// Intialize WIA_IPS_XRES (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XRES; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_XRESOLUTION; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 12; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = 1200; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_YRES (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YRES; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_YRESOLUTION; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 12; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = 1200; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
#else // USE_RANGE_VALUES (different property sets for different drivers)
// Intialize WIA_IPS_XRES (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XRES; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_XRESOLUTION; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList= (BYTE*)pProperties->pSupportedResolutions; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedResolutions;
PropIndex++;
// Intialize WIA_IPS_YRES (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YRES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YRES; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_YRESOLUTION; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList= (BYTE*)pProperties->pSupportedResolutions; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedResolutions;
PropIndex++;
#endif
}
// Intialize WIA_IPS_XEXTENT (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XEXTENT_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XEXTENT; pProperties->pvItemDefaults [PropIndex].lVal = (pProperties->pvItemDefaults [PropIndex-2].lVal * m_ScanInfo.BedWidth)/1000; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_YEXTENT (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YEXTENT_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YEXTENT; pProperties->pvItemDefaults [PropIndex].lVal = (pProperties->pvItemDefaults [PropIndex-2].lVal * m_ScanInfo.BedHeight)/1000;; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_XPOS (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_XPOS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_XPOS; pProperties->pvItemDefaults [PropIndex].lVal = 0; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 0; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = (pProperties->wpiItemDefaults[PropIndex-2].ValidVal.Range.Max - 1); pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_YPOS (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_YPOS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_YPOS; pProperties->pvItemDefaults [PropIndex].lVal = 0; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = 0; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = (pProperties->wpiItemDefaults[PropIndex-2].ValidVal.Range.Max - 1); pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPA_DATATYPE (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_DATATYPE_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_DATATYPE; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.DataType; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList = (BYTE*)pProperties->pSupportedDataTypes; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedDataTypes;
PropIndex++;
// Intialize WIA_IPA_DEPTH (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_DEPTH_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_DEPTH; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.PixelBits; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPS_BRIGHTNESS (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_BRIGHTNESS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_BRIGHTNESS; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.Intensity;//INITIAL_BRIGHTNESS;
pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = m_ScanInfo.IntensityRange.lStep; // 1
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = m_ScanInfo.IntensityRange.lMin; //-127;
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = m_ScanInfo.IntensityRange.lMax; // 128;
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_CONTRAST (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_CONTRAST_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_CONTRAST; pProperties->pvItemDefaults [PropIndex].lVal = m_ScanInfo.Contrast;//INITIAL_CONTRAST;
pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = m_ScanInfo.ContrastRange.lStep; // 1
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = m_ScanInfo.ContrastRange.lMin; //-127;
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = m_ScanInfo.ContrastRange.lMax; // 128;
pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPS_CUR_INTENT (FLAG)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_CUR_INTENT_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_CUR_INTENT; pProperties->pvItemDefaults [PropIndex].lVal = WIA_INTENT_NONE; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_FLAG; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits = WIA_INTENT_MINIMIZE_SIZE | WIA_INTENT_MAXIMIZE_QUALITY;
// check for 24-bit color support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_COLOR) { pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits |= WIA_INTENT_IMAGE_TYPE_COLOR; }
// check for 1-bit BW support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_BW) { pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits |= WIA_INTENT_IMAGE_TYPE_TEXT; }
// check for 8-bit grayscale support
if (m_ScanInfo.SupportedDataTypes & SUPPORT_GRAYSCALE) { pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits |= WIA_INTENT_IMAGE_TYPE_GRAYSCALE; }
if(pProperties->bLegacyBWRestrictions){ //
// The NoColor=1 registry key was set to restrict this driver from supporting
// color... remove the valid bits, just incase the bits were set..
// note: NoColor overrides all driver settings
//
pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits &= ~ WIA_INTENT_IMAGE_TYPE_COLOR; }
//////////////////////////////////////////////////////////////////////////////////////////////////
// The full valid bits for intent for information only //
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits = WIA_INTENT_IMAGE_TYPE_COLOR |
// WIA_INTENT_IMAGE_TYPE_GRAYSCALE |
// WIA_INTENT_IMAGE_TYPE_TEXT |
// WIA_INTENT_MINIMIZE_SIZE |
// WIA_INTENT_MAXIMIZE_QUALITY;
//////////////////////////////////////////////////////////////////////////////////////////////////
PropIndex++;
// Intialize WIA_IPA_PIXELS_PER_LINE (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_PIXELS_PER_LINE_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_PIXELS_PER_LINE; pProperties->pvItemDefaults [PropIndex].lVal = pProperties->pvItemDefaults [PropIndex-9].lVal; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_NUMER_OF_LINES (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_NUMBER_OF_LINES_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_NUMBER_OF_LINES; pProperties->pvItemDefaults [PropIndex].lVal = pProperties->pvItemDefaults [PropIndex-9].lVal; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_DPS_MAX_SCAN_TIME (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_DPS_MAX_SCAN_TIME_STR; pProperties->piItemDefaults [PropIndex] = WIA_DPS_MAX_SCAN_TIME; pProperties->pvItemDefaults [PropIndex].lVal = 10000; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_PREFERRED_FORMAT (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_PREFERRED_FORMAT_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_PREFERRED_FORMAT; pProperties->pvItemDefaults [PropIndex].puuid = &pProperties->pInitialFormats[0];; pProperties->pvItemDefaults [PropIndex].vt = VT_CLSID; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_ITEM_SIZE (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_ITEM_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_ITEM_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = 0; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPS_THRESHOLD (RANGE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_THRESHOLD_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_THRESHOLD; pProperties->pvItemDefaults [PropIndex].lVal = 0; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_RANGE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Inc = 1; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Min = -127; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Max = 128; pProperties->wpiItemDefaults[PropIndex].ValidVal.Range.Nom = pProperties->pvItemDefaults [PropIndex].lVal;
PropIndex++;
// Intialize WIA_IPA_FORMAT (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_FORMAT_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_FORMAT; pProperties->pvItemDefaults [PropIndex].puuid = &pProperties->pInitialFormats[0]; pProperties->pvItemDefaults [PropIndex].vt = VT_CLSID; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
pProperties->wpiItemDefaults[PropIndex].ValidVal.ListGuid.pList = pProperties->pInitialFormats; pProperties->wpiItemDefaults[PropIndex].ValidVal.ListGuid.Nom = *pProperties->pvItemDefaults [PropIndex].puuid; pProperties->wpiItemDefaults[PropIndex].ValidVal.ListGuid.cNumList = pProperties->NumInitialFormats;
PropIndex++;
// Intialize WIA_IPA_TYMED (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_TYMED_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_TYMED; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_TYMED; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList = (BYTE*)pProperties->pSupportedTYMED; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedTYMED;
PropIndex++;
// Intialize WIA_IPA_CHANNELS_PER_PIXEL (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_CHANNELS_PER_PIXEL_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_CHANNELS_PER_PIXEL; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_CHANNELS_PER_PIXEL; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_BITS_PER_CHANNEL (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_BITS_PER_CHANNEL_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_BITS_PER_CHANNEL; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_BITS_PER_CHANNEL; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_PLANAR (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_PLANAR_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_PLANAR; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_PLANAR; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_BYTES_PER_LINE (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_BYTES_PER_LINE_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_BYTES_PER_LINE; pProperties->pvItemDefaults [PropIndex].lVal = 0; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_MIN_BUFFER_SIZE (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_MIN_BUFFER_SIZE_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_MIN_BUFFER_SIZE; pProperties->pvItemDefaults [PropIndex].lVal = MIN_BUFFER_SIZE; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_ACCESS_RIGHTS (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_ACCESS_RIGHTS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_ACCESS_RIGHTS; pProperties->pvItemDefaults [PropIndex].lVal = WIA_ITEM_READ|WIA_ITEM_WRITE; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPA_COMPRESSION (LIST)
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_COMPRESSION_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_COMPRESSION; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_COMPRESSION; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_RW|WIA_PROP_LIST; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
pProperties->wpiItemDefaults[PropIndex].ValidVal.List.pList = (BYTE*)pProperties->pSupportedCompressionTypes; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.List.cNumList = pProperties->NumSupportedCompressionTypes;
PropIndex++;
// Initialize WIA_IPA_ITEM_FLAGS
pProperties->pszItemDefaults[PropIndex] = WIA_IPA_ITEM_FLAGS_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPA_ITEM_FLAGS; pProperties->pvItemDefaults [PropIndex].lVal = WiaItemTypeImage|WiaItemTypeFile|WiaItemTypeDevice; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_FLAG; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.Nom = pProperties->pvItemDefaults [PropIndex].lVal; pProperties->wpiItemDefaults[PropIndex].ValidVal.Flag.ValidBits = WiaItemTypeImage|WiaItemTypeFile|WiaItemTypeDevice;
PropIndex++;
// Initialize WIA_IPS_PHOTOMETRIC_INTERP
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_PHOTOMETRIC_INTERP_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_PHOTOMETRIC_INTERP; pProperties->pvItemDefaults [PropIndex].lVal = INITIAL_PHOTOMETRIC_INTERP; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
// Intialize WIA_IPS_WARM_UP_TIME_STR (NONE)
pProperties->pszItemDefaults[PropIndex] = WIA_IPS_WARM_UP_TIME_STR; pProperties->piItemDefaults [PropIndex] = WIA_IPS_WARM_UP_TIME; pProperties->pvItemDefaults [PropIndex].lVal = 10000; pProperties->pvItemDefaults [PropIndex].vt = VT_I4; pProperties->psItemDefaults [PropIndex].ulKind = PRSPEC_PROPID; pProperties->psItemDefaults [PropIndex].propid = pProperties->piItemDefaults [PropIndex]; pProperties->wpiItemDefaults[PropIndex].lAccessFlags = WIA_PROP_READ|WIA_PROP_NONE; pProperties->wpiItemDefaults[PropIndex].vt = pProperties->pvItemDefaults [PropIndex].vt;
PropIndex++;
return hr; }
HRESULT CMicroDriverAPI::SetResolutionRestrictionString(TCHAR *szResolutions) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "CMicroDriverAPI::SetResolutionRestrictionString"); //
// SBB - RAID 370299 - orenr - 2001/04/18 - Security fix -
// potential buffer overrun. Changed lstrcpy to use
// _tcsncpy instead.
//
ZeroMemory(m_szResolutions, sizeof(m_szResolutions)); _tcsncpy(m_szResolutions, szResolutions, (sizeof(m_szResolutions) / sizeof(TCHAR)) - 1);
#ifdef UNICODE
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::SetResolutionRestrictionString, szResolutions = %ws",szResolutions)); #else
WIAS_LTRACE(m_pIWiaLog,WIALOG_NO_RESOURCE_ID,WIALOG_LEVEL2,("CMicroDriverAPI::SetResolutionRestrictionString, szResolutions = %s",szResolutions)); #endif
return S_OK; }
HRESULT CMicroDriverAPI::SetScanMode(INT iScanMode) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "SetScanMode");
HRESULT hr = S_OK; VAL Value; memset(&Value,0,sizeof(Value)); Value.pScanInfo = &m_ScanInfo; Value.lVal = iScanMode;
hr = m_pMicroDriver->MicroEntry(CMD_SETSCANMODE,&Value); if(FAILED(hr)){ if(E_NOTIMPL == hr){ hr = S_OK; } return hr; } return hr; }
HRESULT CMicroDriverAPI::SetSTIDeviceHKEY(HKEY *pHKEY) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "SetSTIDeviceHKEY");
HRESULT hr = S_OK; VAL Value; memset(&Value,0,sizeof(Value)); Value.pScanInfo = &m_ScanInfo; Value.pHandle = (HANDLE*)pHKEY;
hr = m_pMicroDriver->MicroEntry(CMD_SETSTIDEVICEHKEY,&Value); if(FAILED(hr)){ if(E_NOTIMPL == hr){ hr = S_OK; } return hr; } return hr; }
HRESULT CMicroDriverAPI::GetSupportedFileFormats(GUID **ppguid, LONG *plNumSupportedFormats) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "GetSupportedFileFormats");
HRESULT hr = S_OK; *plNumSupportedFormats = 0; *ppguid = NULL; VAL Value; memset(&Value,0,sizeof(Value)); Value.pScanInfo = &m_ScanInfo;
hr = m_pMicroDriver->MicroEntry(CMD_GETSUPPORTEDFILEFORMATS,&Value); if(FAILED(hr)){ return hr; }
*plNumSupportedFormats = Value.lVal; *ppguid = Value.pGuid;
return hr; }
HRESULT CMicroDriverAPI::GetSupportedMemoryFormats(GUID **ppguid, LONG *plNumSupportedFormats) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "GetSupportedMemoryFormats");
HRESULT hr = S_OK; *plNumSupportedFormats = 0; *ppguid = NULL; VAL Value; memset(&Value,0,sizeof(Value)); Value.pScanInfo = &m_ScanInfo;
hr = m_pMicroDriver->MicroEntry(CMD_GETSUPPORTEDMEMORYFORMATS,&Value); if(FAILED(hr)){ return hr; }
*plNumSupportedFormats = Value.lVal; *ppguid = Value.pGuid;
return hr; }
HRESULT CMicroDriverAPI::IsColorDataBGR(BOOL *pbBGR) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "IsColorDataBGR");
HRESULT hr = S_OK; // WIA_ORDER_RGB 0
// WIA_ORDER_BGR 1
*pbBGR = (m_ScanInfo.RawPixelOrder == WIA_ORDER_BGR); return hr; }
HRESULT CMicroDriverAPI::IsAlignmentNeeded(BOOL *pbALIGN) { CWiaLogProc WIAS_LOGPROC(m_pIWiaLog, WIALOG_NO_RESOURCE_ID, WIALOG_LEVEL1, "IsAlignmentNeeded"); HRESULT hr = S_OK; *pbALIGN = m_ScanInfo.bNeedDataAlignment; return hr; }
|