hackedteam/core-winmobile

View on GitHub
Mornella/Mornella_Mobile/Process.cpp

Summary

Maintainability
Test Coverage
#include "Event.h"
#include "Common.h"
#include "Conf.h"
#include "ProcessMonitor.h"

// Il formato dei parametri e' il seguente:
// Azione da triggerare a processo TERMINATO (TRIGGER_ACTION(myData->pParams))
// Tipo di ricerca da fare (window title [1] o nome del processo [0])
// Nome del processo in WCHAR NULL-terminato
// Abbiamo un thread per processo, tuttavia il thread e' estremamente lightweight poiche'
// effettua solo un busy-cycle, il resto viene fatto tutto dalla classe singleton Process.
DWORD WINAPI OnProcess(LPVOID lpParam) {
    ProcessMonitor *processObj = ProcessMonitor::self();
    Event *me = (Event *)lpParam;
    Configuration *conf;
    wstring processName;
    BOOL onlyWindow, processActive = FALSE;
    HANDLE eventHandle = me->getEvent();

    me->setStatus(EVENT_RUNNING);
    conf = me->getConf();

    try {
        processName = conf->getString(L"process");
    } catch (...) {
        processName = L"";
    }

    if (processName.empty()) {
        me->setStatus(EVENT_STOPPED);

        return 0;
    }

    try {
        onlyWindow = conf->getBool(L"window");
    } catch (...) {
        onlyWindow = FALSE;
    }

    DBG_TRACE(L"Debug - Process.cpp - Process Event is Alive\n", 1, FALSE);

    if (onlyWindow) {
        LOOP {
            if (me->shouldStop()) {
                DBG_TRACE(L"Debug - Process.cpp - Process Event is Closing\n", 1, FALSE);
                me->setStatus(EVENT_STOPPED);

                return 0;
            }

            if (processActive == TRUE && processObj->IsWindowPresent(processName.c_str()) == FALSE) {
                processActive = FALSE;
                me->triggerEnd();
            } else if (processActive == FALSE && processObj->IsWindowPresent(processName.c_str()) == TRUE) {
                processActive = TRUE;
                me->triggerStart();
            }

            WaitForSingleObject(eventHandle, 5000);
        }
    } else {
        LOOP {
            if (me->shouldStop()) {
                DBG_TRACE(L"Debug - Process.cpp - Process Event is Closing\n", 1, FALSE);
                me->setStatus(EVENT_STOPPED);

                return 0;
            }

            if (processActive == TRUE && processObj->IsProcessRunningW(processName.c_str()) == FALSE) {
                processActive = FALSE;
                me->triggerEnd();
            } else if (processActive == FALSE && processObj->IsProcessRunningW(processName.c_str()) == TRUE) {
                processActive = TRUE;
                me->triggerStart();
            }

            WaitForSingleObject(eventHandle, 5000);
        }
    }

    return 0;
}