示例#1
0
WIAMICRO_API HRESULT MicroEntry(LONG lCommand, _Inout_ PVAL pValue)
{ // depends on command
	PWIASANE_Context pContext;
	PWINSANE_Option oOption;
	LONG lReceived;
	HANDLE hHeap;
	HRESULT hr;

	Trace(TEXT("------ MicroEntry(lCommand=%d) ------"), lCommand);

	if (!pValue || !pValue->pScanInfo)
		return E_INVALIDARG;

	if (!pValue->pScanInfo->DeviceIOHandles[1])
		pValue->pScanInfo->DeviceIOHandles[1] = GetProcessHeap();

	hHeap = pValue->pScanInfo->DeviceIOHandles[1];
	if (!hHeap)
		return E_OUTOFMEMORY;

	if (!pValue->pScanInfo->pMicroDriverContext)
		pValue->pScanInfo->pMicroDriverContext = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(WIASANE_Context));

	pContext = (PWIASANE_Context) pValue->pScanInfo->pMicroDriverContext;
	if (!pContext)
		return E_OUTOFMEMORY;

	hr = E_NOTIMPL;

	switch (lCommand) {
		case CMD_SETSTIDEVICEHKEY: // offline
			Trace(TEXT("CMD_SETSTIDEVICEHKEY"));

			if (pValue->pHandle) {
				pValue->pScanInfo->DeviceIOHandles[2] = *pValue->pHandle;

				hr = ReadRegistryInformation(pValue->pScanInfo, pContext);
			} else
				hr = E_FAIL;

			break;

		case CMD_INITIALIZE: // online
			Trace(TEXT("CMD_INITIALIZE"));
			g_pContext = pContext;

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				hr = InitScannerDefaults(pValue->pScanInfo, pContext);

				ExitScannerSession(pValue->pScanInfo, pContext);
			}

			pValue->pScanInfo->DeviceIOHandles[2] = NULL;
			break;

		case CMD_UNINITIALIZE: // online
			Trace(TEXT("CMD_UNINITIALIZE"));
			g_pContext = NULL;

			hr = FreeScannerSession(pValue->pScanInfo, pContext);
			FreeScannerDefaults(pValue->pScanInfo, pContext);
			FreeRegistryInformation(pValue->pScanInfo, pContext);

			pValue->pScanInfo->pMicroDriverContext = NULL;
			pValue->pScanInfo->DeviceIOHandles[2] = NULL;
			pValue->pScanInfo->DeviceIOHandles[1] = NULL;
			break;

		case CMD_RESETSCANNER: // online
			Trace(TEXT("CMD_RESETSCANNER"));

		case CMD_STI_DEVICERESET: // online
			if (lCommand == CMD_STI_DEVICERESET)
				Trace(TEXT("CMD_STI_DEVICERESET"));

		case CMD_STI_DIAGNOSTIC: // online
			if (lCommand == CMD_STI_DIAGNOSTIC)
				Trace(TEXT("CMD_STI_DIAGNOSTIC"));

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				hr = ExitScannerSession(pValue->pScanInfo, pContext);
			}
			break;

		case CMD_STI_GETSTATUS: // online
			Trace(TEXT("CMD_STI_GETSTATUS"));

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				pValue->lVal = MCRO_STATUS_OK;

				ExitScannerSession(pValue->pScanInfo, pContext);
			} else {
				pValue->lVal = MCRO_ERROR_OFFLINE;
			}
			pValue->pGuid = (GUID*) &GUID_NULL;

			hr = S_OK;
			break;

		case CMD_SETXRESOLUTION: // offline, but requires device options
			Trace(TEXT("CMD_SETXRESOLUTION"));

			if (pContext->oDevice) {
				oOption = pContext->oDevice->GetOption(WIASANE_OPTION_RESOLUTION);
				if (!oOption) {
					Trace(TEXT("Required option '%hs' is not supported."),
						WIASANE_OPTION_RESOLUTION);
					hr = E_NOTIMPL;
					break;
				}
				if (!oOption->IsValidValue(pValue->lVal)) {
					Trace(TEXT("Invalid value '%d' for option '%hs'."),
						pValue->lVal, oOption->GetName());
					hr = E_INVALIDARG;
					break;
				}
			} else {
				Trace(TEXT("No device selected."));
				hr = E_FAIL;
				break;
			}

			Trace(TEXT("Set Xresolution to '%d'."), pValue->lVal);
			pValue->pScanInfo->Xresolution = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETYRESOLUTION: // offline, but requires device options
			Trace(TEXT("CMD_SETYRESOLUTION"));

			if (pValue->pScanInfo->Xresolution != pValue->lVal) {
				Trace(TEXT("Invalid value '%d' compared to '%d'."),
					pValue->lVal, pValue->pScanInfo->Xresolution);
				hr = E_INVALIDARG;
				break;
			}

			Trace(TEXT("Set Yresolution to '%d'."), pValue->lVal);
			pValue->pScanInfo->Yresolution = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETCONTRAST: // offline, but requires device options
			Trace(TEXT("CMD_SETCONTRAST"));

			if (pContext->oDevice) {
				oOption = pContext->oDevice->GetOption(WIASANE_OPTION_CONTRAST);
				if (!oOption) {
					oOption = pContext->oDevice->GetOption(WIASANE_OPTION_SHARPNESS);
				}
				if (!oOption) {
					Trace(TEXT("Option '%hs' or '%hs' is not supported."),
						WIASANE_OPTION_CONTRAST, WIASANE_OPTION_SHARPNESS);
					hr = E_NOTIMPL;
					break;
				}
				if (!oOption->IsValidValue(pValue->lVal)) {
					Trace(TEXT("Invalid value '%d' for option '%hs'."),
						pValue->lVal, oOption->GetName());
					hr = E_INVALIDARG;
					break;
				}
			} else {
				Trace(TEXT("No device selected."));
				hr = E_FAIL;
				break;
			}

			Trace(TEXT("Set Contrast to '%d'."), pValue->lVal);
			pValue->pScanInfo->Contrast = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETINTENSITY: // offline, but requires device options
			Trace(TEXT("CMD_SETINTENSITY"));

			if (pContext->oDevice) {
				oOption = pContext->oDevice->GetOption(WIASANE_OPTION_BRIGHTNESS);
				if (!oOption) {
					Trace(TEXT("Option '%hs' or '%hs' is not supported."),
						WIASANE_OPTION_BRIGHTNESS);
					hr = E_NOTIMPL;
					break;
				}
				if (!oOption->IsValidValue(pValue->lVal)) {
					Trace(TEXT("Invalid value '%d' for option '%hs'."),
						pValue->lVal, oOption->GetName());
					hr = E_INVALIDARG;
					break;
				}
			} else {
				Trace(TEXT("No device selected."));
				hr = E_FAIL;
				break;
			}

			Trace(TEXT("Set Intensity to '%d'."), pValue->lVal);
			pValue->pScanInfo->Intensity = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETDATATYPE: // offline
			Trace(TEXT("CMD_SETDATATYPE"));

			if (pValue->lVal == WIA_DATA_THRESHOLD && !(
			    pValue->pScanInfo->SupportedDataTypes & SUPPORT_BW)) {
					Trace(TEXT("Threshold mode is not supported."));
					hr = E_NOTIMPL;
					break;
			}
			if (pValue->lVal == WIA_DATA_GRAYSCALE && !(
			    pValue->pScanInfo->SupportedDataTypes & SUPPORT_GRAYSCALE)) {
					Trace(TEXT("Grayscale mode is not supported."));
					hr = E_NOTIMPL;
					break;
			}
			if (pValue->lVal == WIA_DATA_COLOR && !(
			    pValue->pScanInfo->SupportedDataTypes & SUPPORT_COLOR)) {
					Trace(TEXT("Color mode is not supported."));
					hr = E_NOTIMPL;
					break;
			}

			Trace(TEXT("Set DataType to '%d'."), pValue->lVal);
			pValue->pScanInfo->DataType = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETSCANMODE: // offline
			Trace(TEXT("CMD_SETSCANMODE"));

			if (pValue->lVal != SCANMODE_FINALSCAN &&
				pValue->lVal != SCANMODE_PREVIEWSCAN) {
					Trace(TEXT("Unknown scan mode is not supported."));
					hr = E_INVALIDARG;
					break;
			}

			Trace(TEXT("Set lScanMode to '%d'."), pValue->lVal);
			pContext->lScanMode = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_SETNEGATIVE: // offline
			Trace(TEXT("CMD_SETNEGATIVE"));

			Trace(TEXT("Set Negative to '%d'."), pValue->lVal);
			pValue->pScanInfo->Negative = pValue->lVal;
			hr = S_OK;
			break;

		case CMD_GETCAPABILITIES: // offline
			Trace(TEXT("CMD_GETCAPABILITIES"));

			pValue->lVal = 0;
			pValue->pGuid = NULL;
			pValue->ppButtonNames = NULL;

			hr = S_OK;
			break;

		case CMD_GETADFSTATUS: // online
			Trace(TEXT("CMD_GETADFSTATUS"));

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				pValue->lVal = MCRO_STATUS_OK;

				if (pContext->pTask && pContext->pTask->bUsingADF) {
					CloseScannerDevice(pValue->pScanInfo, pContext);
				} else {
					ExitScannerSession(pValue->pScanInfo, pContext);
				}
			} else {
				pValue->lVal = MCRO_ERROR_OFFLINE;
			}

			hr = S_OK;
			break;

		case CMD_GETADFHASPAPER: // online
			Trace(TEXT("CMD_GETADFHASPAPER"));

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				if (!pContext->pTask) {
					MicroEntry(CMD_LOAD_ADF, pValue);
				}

				if (pContext->pTask && pContext->pTask->bUsingADF) {
					pValue->lVal = MCRO_STATUS_OK;
					CloseScannerDevice(pValue->pScanInfo, pContext);
				} else {
					pValue->lVal = MCRO_ERROR_PAPER_EMPTY;
					ExitScannerSession(pValue->pScanInfo, pContext);
				}
			} else {
				pValue->lVal = MCRO_ERROR_OFFLINE;
			}

			hr = S_OK;
			break;

		case CMD_LOAD_ADF: // online
			Trace(TEXT("CMD_LOAD_ADF"));

			if (pContext->pTask && pContext->pTask->bUsingADF) {
				hr = S_OK;
				break;
			}

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				oOption = pContext->oDevice->GetOption(WIASANE_OPTION_SOURCE);
				if (oOption && pContext->pValues) {
					switch (pValue->pScanInfo->ADF) {
						case 1:
							hr = oOption->SetValueString(pContext->pValues->pszSourceADF);
							break;

						case 2:
							hr = oOption->SetValueString(pContext->pValues->pszSourceDuplex);
							break;
					}
					if (SUCCEEDED(hr)) {
						hr = Scan(pValue->pScanInfo, SCAN_FIRST, NULL, 0, &lReceived);
						if (pContext->pTask) {
							if (SUCCEEDED(hr)) {
								pContext->pTask->bUsingADF = TRUE;
							} else {
								Scan(pValue->pScanInfo, SCAN_FINISHED, NULL, 0, &lReceived);
							}
						}
						if (!pContext->pTask || !pContext->pTask->bUsingADF) {
							oOption = pContext->oDevice->GetOption(WIASANE_OPTION_SOURCE);
							if (oOption) {
								oOption->SetValueString(pContext->pValues->pszSourceFlatbed);
							}
						}
					}
				} else
					hr = E_NOTIMPL;

				CloseScannerDevice(pValue->pScanInfo, pContext);
			}
			break;

		case CMD_UNLOAD_ADF: // online
			Trace(TEXT("CMD_UNLOAD_ADF"));

			hr = OpenScannerDevice(pValue->pScanInfo, pContext);
			if (SUCCEEDED(hr)) {
				oOption = pContext->oDevice->GetOption(WIASANE_OPTION_SOURCE);
				if (oOption && pContext->pValues) {
					hr = oOption->SetValueString(pContext->pValues->pszSourceFlatbed);
					if (SUCCEEDED(hr)) {
						if (pContext->pTask) {
							pContext->pTask->bUsingADF = FALSE;
						}
						hr = Scan(pValue->pScanInfo, SCAN_FINISHED, NULL, 0, &lReceived);
					}
				} else
					hr = E_NOTIMPL;

				ExitScannerSession(pValue->pScanInfo, pContext);
			}
			break;

		default:
			Trace(TEXT("Unknown Command (%d)"), lCommand);
			break;
	}

	return hr;
}
示例#2
0
WIAMICRO_API HRESULT MicroEntry(LONG lCommand, _Inout_ PVAL pValue)
{
    HRESULT hr = E_NOTIMPL;
    INT index = 0;

//#define _DEBUG_COMMANDS

#ifdef _DEBUG_COMMANDS
    if(lCommand != CMD_STI_GETSTATUS)
        Trace(TEXT("Command Value (%d)"),lCommand);
#endif

    if( !pValue || !(pValue->pScanInfo))
    {
        return E_INVALIDARG;
    }

    switch(lCommand)
    {
    case CMD_INITIALIZE:
        hr = S_OK;

        //
        // create any DeviceIO handles needed, use index (1 - MAX_IO_HANDLES) to store these handles.
        // Index '0' is reserved by the WIA flatbed driver. The CreateFile Name is stored in the szVal
        // member of the VAL structure.
        //

        // pValue->pScanInfo->DeviceIOHandles[1] = CreateFileA( pValue->szVal,
        //                                   GENERIC_READ | GENERIC_WRITE, // Access mask
        //                                   0,                            // Share mode
        //                                   NULL,                         // SA
        //                                   OPEN_EXISTING,                // Create disposition
        //                                   FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,        // Attributes
        //                                   NULL );

        //
        // if your device supports buttons, create the BUTTON name information here..
        //

        if (!g_bButtonNamesCreated)
        {
            for(index = 0; index < MAX_BUTTONS; index++)
            {
                g_ButtonNames[index] = (WCHAR*)CoTaskMemAlloc(MAX_BUTTON_NAME);
                if (!g_ButtonNames[index])
                {
                    hr = E_OUTOFMEMORY;
                    break;
                }
            }

            if(SUCCEEDED(hr))
            {
                hr = GetOLESTRResourceString(IDS_SCAN_BUTTON_NAME,&g_ButtonNames[0],TRUE);
            }

            if(SUCCEEDED(hr))
            {
                g_bButtonNamesCreated = TRUE;
            }
            else
            {
                for(index = 0; index < MAX_BUTTONS; index++)
                {
                    if (g_ButtonNames[index])
                    {
                        CoTaskMemFree(g_ButtonNames[index]);
                        g_ButtonNames[index] = NULL;
                    }
                }
            }
        }

        //
        // Initialize the scanner's default settings
        //

        InitScannerDefaults(pValue->pScanInfo);

        break;
    case CMD_UNINITIALIZE:

        //
        // close any open handles created by the Micro driver
        //

        if(pValue->pScanInfo->DeviceIOHandles[1] != NULL)
        {
            CloseHandle(pValue->pScanInfo->DeviceIOHandles[1]);
        }


        //
        // if your device supports buttons, free/destroy the BUTTON name information here..
        //

        if(g_bButtonNamesCreated)
        {
            g_bButtonNamesCreated = FALSE;

            for(index = 0; index < MAX_BUTTONS; index++)
            {
                if (g_ButtonNames[index])
                {
                    CoTaskMemFree(g_ButtonNames[index]);
                    g_ButtonNames[index] = NULL;
                }
            }
        }

        //
        // close/unload libraries
        //

        hr = S_OK;
        break;
    case CMD_RESETSCANNER:

        //
        // reset scanner
        //

        hr = S_OK;
        break;
    case CMD_STI_DIAGNOSTIC:
    case CMD_STI_DEVICERESET:

        //
        // reset device
        //

        hr = S_OK;
        break;
    case CMD_STI_GETSTATUS:

        //
        // set status flag to ON-LINE
        //

        pValue->lVal = MCRO_STATUS_OK;
        pValue->pGuid = (GUID*) &GUID_NULL;

        //
        // button polling support
        //

#ifdef BUTTON_SUPPORT
        CheckButtonStatus(pValue);
#endif

        hr = S_OK;
        break;
    case CMD_SETXRESOLUTION:
        pValue->pScanInfo->Xresolution = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_SETYRESOLUTION:
        pValue->pScanInfo->Yresolution = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_SETCONTRAST:
        pValue->pScanInfo->Contrast    = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_SETINTENSITY:
        pValue->pScanInfo->Intensity   = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_SETDATATYPE:
        pValue->pScanInfo->DataType    = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_SETNEGATIVE:
        pValue->pScanInfo->Negative    = pValue->lVal;
        hr = S_OK;
        break;
    case CMD_GETADFSTATUS:
    case CMD_GETADFHASPAPER:
        // pValue->lVal = MCRO_ERROR_PAPER_EMPTY;
        // hr = S_OK;
        break;
    case CMD_GET_INTERRUPT_EVENT:
        hr = GetInterruptEvent(pValue);
        break;
    case CMD_GETCAPABILITIES:
        pValue->lVal = 0;
        pValue->pGuid = NULL;
        pValue->ppButtonNames = NULL;
        hr = S_OK;
        break;

    case CMD_SETSCANMODE:
        hr = S_OK;
        switch(pValue->lVal)
        {
        case SCANMODE_FINALSCAN:
            Trace(TEXT("Final Scan"));
            break;
        case SCANMODE_PREVIEWSCAN:
            Trace(TEXT("Preview Scan"));
            break;
        default:
            Trace(TEXT("Unknown Scan Mode (%d)"),pValue->lVal);
            hr = E_FAIL;
            break;
        }
        break;
    case CMD_SETSTIDEVICEHKEY:
        ReadRegistryInformation(pValue);
        break;

#ifdef _USE_EXTENDED_FORMAT_LIST

    // note: MEMORYBMP, and BMP file will be added by wiafbdrv host driver.
    //       do not include them in your extended list.
    //

    case CMD_GETSUPPORTEDFILEFORMATS:
        g_SupportedFileFormats[0] = WiaImgFmt_JPEG;
        pValue->lVal = NUM_SUPPORTED_FILEFORMATS;
        pValue->pGuid = g_SupportedFileFormats;
        hr = S_OK;
        break;

    case CMD_GETSUPPORTEDMEMORYFORMATS:
        g_SupportedMemoryFormats[0] = WiaImgFmt_TIFF;
        g_SupportedMemoryFormats[1] = WiaImgFmt_MYNEWFORMAT;
        pValue->lVal = NUM_SUPPORTED_MEMORYFORMATS;
        pValue->pGuid = g_SupportedMemoryFormats;
        hr = S_OK;
        break;
#endif

    default:
        Trace(TEXT("Unknown Command (%d)"),lCommand);
        break;
    }

    return hr;
}