Use mnemonic TWAIN state names; some simplification

Change-Id: Ic3fc8a98b2ca7d4d699d08fdc1a653d4f44f71db
Reviewed-on: https://gerrit.libreoffice.org/77660
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/extensions/source/scanner/twain32shim.cxx b/extensions/source/scanner/twain32shim.cxx
index f813ff8..8ccd2bd 100644
--- a/extensions/source/scanner/twain32shim.cxx
+++ b/extensions/source/scanner/twain32shim.cxx
@@ -49,13 +49,24 @@ public:
    ~ImpTwain();

private:
    enum class TWAINState
    {
        DSMunloaded = 1,
        DSMloaded = 2,
        DSMopened = 3,
        DSopened = 4,
        DSenabled = 5,
        DSreadyToXfer = 6,
        Xferring = 7,
    };

    TW_IDENTITY m_aAppId;
    TW_IDENTITY m_aSrcId;
    DWORD m_nParentThreadId;
    HANDLE m_hProc;
    DSMENTRYPROC m_pDSM = nullptr;
    HMODULE m_hMod = nullptr;
    ULONG_PTR m_nCurState = 1;
    TWAINState m_nCurState = TWAINState::DSMunloaded;
    HWND m_hTwainWnd = nullptr;
    HHOOK m_hTwainHook = nullptr;
    HANDLE m_hMap = nullptr; // the *duplicated* handle
@@ -66,7 +77,7 @@ private:
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
    static LRESULT CALLBACK MsgHook(int nCode, WPARAM wParam, LPARAM lParam);

    void Destroy();
    void Destroy() { ImplFallback(TWAIN_EVENT_QUIT); }
    bool SelectSource();
    bool InitXfer();

@@ -199,15 +210,13 @@ ImpTwain::~ImpTwain()
    UnhookWindowsHookEx(m_hTwainHook);
}

void ImpTwain::Destroy() { ImplFallback(TWAIN_EVENT_QUIT); }

bool ImpTwain::SelectSource()
{
    TW_UINT16 nRet = TWRC_FAILURE;

    ImplOpenSourceManager();

    if (3 == m_nCurState)
    if (TWAINState::DSMopened == m_nCurState)
    {
        TW_IDENTITY aIdent;

@@ -217,8 +226,7 @@ bool ImpTwain::SelectSource()
        nRet = m_pDSM(&m_aAppId, nullptr, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &aIdent);
    }

    ImplFallback(TWAIN_EVENT_QUIT);

    Destroy();
    return (TWRC_SUCCESS == nRet);
}

@@ -228,34 +236,34 @@ bool ImpTwain::InitXfer()

    ImplOpenSourceManager();

    if (3 == m_nCurState)
    if (TWAINState::DSMopened == m_nCurState)
    {
        ImplOpenSource();

        if (4 == m_nCurState)
        if (TWAINState::DSopened == m_nCurState)
            bRet = ImplEnableSource();
    }

    if (!bRet)
        ImplFallback(TWAIN_EVENT_QUIT);
        Destroy();

    return bRet;
}

void ImpTwain::ImplOpenSourceManager()
{
    if (1 == m_nCurState)
    if (TWAINState::DSMunloaded == m_nCurState)
    {
        if ((m_hMod = LoadLibraryW(L"TWAIN_32.DLL")))
        {
            m_nCurState = 2;
            m_nCurState = TWAINState::DSMloaded;

            m_pDSM = reinterpret_cast<DSMENTRYPROC>(GetProcAddress(m_hMod, "DSM_Entry"));
            if (m_pDSM
                && (m_pDSM(&m_aAppId, nullptr, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &m_hTwainWnd)
                    == TWRC_SUCCESS))
            {
                m_nCurState = 3;
                m_nCurState = TWAINState::DSMopened;
            }
        }
    }
@@ -263,7 +271,7 @@ void ImpTwain::ImplOpenSourceManager()

void ImpTwain::ImplOpenSource()
{
    if (3 == m_nCurState)
    if (TWAINState::DSMopened == m_nCurState)
    {
        if ((m_pDSM(&m_aAppId, nullptr, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &m_aSrcId)
             == TWRC_SUCCESS)
@@ -279,7 +287,7 @@ void ImpTwain::ImplOpenSource()
            GlobalUnlock(aCap.hContainer);
            m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &aCap);
            GlobalFree(aCap.hContainer);
            m_nCurState = 4;
            m_nCurState = TWAINState::DSopened;
        }
    }
}
@@ -288,12 +296,12 @@ bool ImpTwain::ImplEnableSource()
{
    bool bRet = false;

    if (4 == m_nCurState)
    if (TWAINState::DSopened == m_nCurState)
    {
        TW_USERINTERFACE aUI = { true, true, m_hTwainWnd };

        NotifyParent(TWAIN_EVENT_SCANNING, 0);
        m_nCurState = 5;
        m_nCurState = TWAINState::DSenabled;

        if (m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, &aUI)
            == TWRC_SUCCESS)
@@ -303,7 +311,7 @@ bool ImpTwain::ImplEnableSource()
        else
        {
            // dialog failed
            m_nCurState = 4;
            m_nCurState = TWAINState::DSopened;
        }
    }

@@ -317,58 +325,52 @@ void ImpTwain::NotifyParent(WPARAM nEvent, LPARAM lParam)

bool ImpTwain::ImplHandleMsg(MSG* pMsg)
{
    TW_UINT16 nRet;
    if (!m_pDSM)
        return false;

    TW_EVENT aEvt = { pMsg, MSG_NULL };
    TW_UINT16 nRet = m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, &aEvt);

    if (m_pDSM)
        nRet = m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, &aEvt);
    else
        nRet = TWRC_NOTDSEVENT;

    if (aEvt.TWMessage != MSG_NULL)
    switch (aEvt.TWMessage)
    {
        switch (aEvt.TWMessage)
        case MSG_XFERREADY:
        {
            case MSG_XFERREADY:
            WPARAM nEvent = TWAIN_EVENT_QUIT;

            if (TWAINState::DSenabled == m_nCurState)
            {
                WPARAM nEvent = TWAIN_EVENT_QUIT;
                m_nCurState = TWAINState::DSreadyToXfer;
                ImplXfer();

                if (5 == m_nCurState)
                {
                    m_nCurState = 6;
                    ImplXfer();

                    if (m_hMap)
                        nEvent = TWAIN_EVENT_XFER;
                }
                else if (7 == m_nCurState && m_hMap)
                {
                    // Already sent TWAIN_EVENT_XFER; not processed yet;
                    // duplicate event
                    nEvent = TWAIN_EVENT_NONE;
                }

                ImplFallback(nEvent);
                if (m_hMap)
                    nEvent = TWAIN_EVENT_XFER;
            }
            else if (TWAINState::Xferring == m_nCurState && m_hMap)
            {
                // Already sent TWAIN_EVENT_XFER; not processed yet;
                // duplicate event
                nEvent = TWAIN_EVENT_NONE;
            }

            ImplFallback(nEvent);
        }
        break;

        case MSG_CLOSEDSREQ:
            Destroy();
            break;

            case MSG_CLOSEDSREQ:
                ImplFallback(TWAIN_EVENT_QUIT);
                break;

            default:
                break;
        }
        case MSG_NULL:
            nRet = TWRC_NOTDSEVENT;
            break;
    }
    else
        nRet = TWRC_NOTDSEVENT;

    return (TWRC_DSEVENT == nRet);
}

void ImpTwain::ImplXfer()
{
    if (m_nCurState == 6)
    if (m_nCurState == TWAINState::DSreadyToXfer)
    {
        TW_IMAGEINFO aInfo;
        HANDLE hDIB = nullptr;
@@ -387,7 +389,7 @@ void ImpTwain::ImplXfer()
        switch (m_pDSM(&m_aAppId, &m_aSrcId, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hDIB))
        {
            case TWRC_CANCEL:
                m_nCurState = 7;
                m_nCurState = TWAINState::Xferring;
                break;

            case TWRC_XFERDONE:
@@ -438,7 +440,7 @@ void ImpTwain::ImplXfer()

                GlobalFree(static_cast<HGLOBAL>(hDIB));

                m_nCurState = 7;
                m_nCurState = TWAINState::Xferring;
            }
            break;

@@ -459,8 +461,8 @@ void ImpTwain::ImplFallbackHdl(WPARAM nEvent)

    switch (m_nCurState)
    {
        case 7:
        case 6:
        case TWAINState::Xferring:
        case TWAINState::DSreadyToXfer:
        {
            TW_PENDINGXFERS aXfers;

@@ -471,43 +473,43 @@ void ImpTwain::ImplFallbackHdl(WPARAM nEvent)
                    m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &aXfers);
            }

            m_nCurState = 5;
            m_nCurState = TWAINState::DSenabled;
        }
        break;

        case 5:
        case TWAINState::DSenabled:
        {
            TW_USERINTERFACE aUI = { true, true, m_hTwainWnd };

            m_pDSM(&m_aAppId, &m_aSrcId, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &aUI);
            m_nCurState = 4;
            m_nCurState = TWAINState::DSopened;
        }
        break;

        case 4:
        case TWAINState::DSopened:
        {
            m_pDSM(&m_aAppId, nullptr, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &m_aSrcId);
            m_nCurState = 3;
            m_nCurState = TWAINState::DSMopened;
        }
        break;

        case 3:
        case TWAINState::DSMopened:
        {
            m_pDSM(&m_aAppId, nullptr, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, &m_hTwainWnd);
            m_nCurState = 2;
            m_nCurState = TWAINState::DSMloaded;
        }
        break;

        case 2:
        case TWAINState::DSMloaded:
        {
            m_pDSM = nullptr;
            FreeLibrary(m_hMod);
            m_hMod = nullptr;
            m_nCurState = 1;
            m_nCurState = TWAINState::DSMunloaded;
        }
        break;

        default:
        case TWAINState::DSMunloaded:
        {
            if (nEvent > TWAIN_EVENT_NONE)
                NotifyParent(nEvent, reinterpret_cast<LPARAM>(m_hMap));