#include "pch.h"

CMICRO::CMICRO(TCHAR *pszMicroDriver)
{
    m_hModule         = NULL;
    m_pMicroEntry     = NULL;
    m_pScan           = NULL;
    m_pSetPixelWindow = NULL;
    m_bDisabled       = FALSE;

    //
    // Load Micro driver
    //

    m_hModule = LoadLibrary(pszMicroDriver);
    if (m_hModule != NULL) {

        //
        // Get entry point
        //

        m_pMicroEntry = (FPMICROENTRY)GetProcAddress(m_hModule,"MicroEntry");

        if (m_pMicroEntry != NULL) {

            //
            // Get Scan entry point
            //

            m_pScan = (FPSCANENTRY)GetProcAddress(m_hModule,"Scan");

            if (m_pScan != NULL) {

                //
                // Get SetPixelWindow entry point
                //

                m_pSetPixelWindow = (FPSETPIXELWINDOWENTRY)GetProcAddress(m_hModule,"SetPixelWindow");

                if (m_pSetPixelWindow != NULL) {

                    //
                    // we are GO!
                    //

                }

            }

        }

    }
}

CMICRO::~CMICRO()
{
    if (m_hModule != NULL) {
        FreeLibrary(m_hModule);
    }
}

HRESULT CMICRO::MicroEntry(LONG lCommand, PVAL pValue)
{
    HRESULT hr = E_FAIL;
    if (m_pMicroEntry != NULL) {

        //
        // call Micro driver's entry point
        //

        hr =  m_pMicroEntry(lCommand, pValue);
    }
    return hr;
}

HRESULT CMICRO::Scan(PSCANINFO pScanInfo, LONG lPhase, PBYTE pBuffer, LONG lLength, PLONG plRecieved)
{
    HRESULT hr = E_FAIL;
    if (m_pMicroEntry != NULL) {

        if (!m_bDisabled) {
            //
            // call Micro driver's scan entry point
            //

            hr =  m_pScan(pScanInfo, lPhase, pBuffer, lLength, plRecieved);
        } else {
            UnInitialize(pScanInfo);
        }
    }
    return hr;
}

HRESULT CMICRO::SetPixelWindow(PSCANINFO pScanInfo, LONG x, LONG y, LONG xExtent, LONG yExtent)
{
    HRESULT hr = E_FAIL;
    if (m_pSetPixelWindow != NULL) {

        //
        // call Micro driver's SetPixelWindow entry point
        //

        hr =  m_pSetPixelWindow(pScanInfo,x,y,xExtent,yExtent);
    }
    return hr;
}

HRESULT CMICRO::Disable()
{
    HRESULT hr = S_OK;

    m_bDisabled = TRUE;
    return hr;
}

HRESULT CMICRO::UnInitialize(PSCANINFO pScanInfo)
{
    HRESULT hr = E_FAIL;

    if ((m_pMicroEntry != NULL)) {
        //
        // call Micro driver's entry point to UnInitalize
        //

        VAL Val;

        memset(&Val, 0, sizeof(Val));
        Val.pScanInfo = pScanInfo;
        hr = m_pMicroEntry(CMD_UNINITIALIZE,&Val);
        m_pMicroEntry = NULL;
    }

    return hr;
}