/* * Tread sub to ask protocol to retrieve away message */ static void amThreadProc(void *) { Netlib_Logf(NULL, "amThreadProc thread start"); ClcCacheEntry dnce; memset(&dnce, 0, sizeof(dnce)); while (!MirandaExiting()) { MCONTACT hContact = amGetCurrentChain(); while (hContact) { DWORD time = GetTickCount(); if ((time - amRequestTick) < AMASKPERIOD) { SleepEx(AMASKPERIOD - (time - amRequestTick) + 10, TRUE); if (MirandaExiting()) goto LBL_Exit; } CListSettings_FreeCacheItemData(&dnce); dnce.hContact = hContact; Sync(CLUI_SyncGetPDNCE, (WPARAM)0, (LPARAM)&dnce); HANDLE ACK = 0; if (dnce.ApparentMode != ID_STATUS_OFFLINE) //don't ask if contact is always invisible (should be done with protocol) ACK = (HANDLE)CallContactService(hContact, PSS_GETAWAYMSG, 0, 0); if (!ACK) { ACKDATA ack; ack.hContact = hContact; ack.type = ACKTYPE_AWAYMSG; ack.result = ACKRESULT_FAILED; if (dnce.m_cache_cszProto) ack.szModule = dnce.m_cache_cszProto; else ack.szModule = NULL; ClcDoProtoAck(hContact, &ack); } CListSettings_FreeCacheItemData(&dnce); amRequestTick = time; hContact = amGetCurrentChain(); if (hContact) { DWORD i = 0; do { i++; SleepEx(50, TRUE); } while (i < AMASKPERIOD / 50 && !MirandaExiting()); } else break; if (MirandaExiting()) goto LBL_Exit; } WaitForSingleObjectEx(hamProcessEvent, INFINITE, TRUE); ResetEvent(hamProcessEvent); if (MirandaExiting()) break; } LBL_Exit: g_hAwayMsgThread = NULL; Netlib_Logf(NULL, "amThreadProc thread end"); }
static void gtaThreadProc(void*) { Netlib_Logf(NULL, "GTA thread start"); SHORTDATA data = { 0 }; while (!MirandaExiting()) { Sync(CLUI_SyncGetShortData, (WPARAM)pcli->hwndContactTree, (LPARAM)&data); while (true) { if (MirandaExiting()) goto LBL_Exit; SleepEx(0, TRUE); //1000 contacts per second GTACHAINITEM mpChain = { 0 }; SHORTDATA dat2 = { 0 }; if (!gtaGetItem(&mpChain)) break; SHORTDATA *dat; if (mpChain.dat == NULL || (!IsBadReadPtr(mpChain.dat, sizeof(*mpChain.dat)) && mpChain.dat->hWnd == data.hWnd)) dat = &data; else { Sync(CLUI_SyncGetShortData, (WPARAM)mpChain.dat->hWnd, (LPARAM)&dat2); dat = &dat2; } if (MirandaExiting()) goto LBL_Exit; ClcCacheEntry cacheEntry; memset(&cacheEntry, 0, sizeof(cacheEntry)); cacheEntry.hContact = mpChain.hContact; if (!Sync(CLUI_SyncGetPDNCE, (WPARAM)0, (LPARAM)&cacheEntry)) { Cache_GetSecondLineText(dat, &cacheEntry); Cache_GetThirdLineText(dat, &cacheEntry); Sync(CLUI_SyncSetPDNCE, (WPARAM)CCI_LINES, (LPARAM)&cacheEntry); CListSettings_FreeCacheItemData(&cacheEntry); } KillTimer(dat->hWnd, TIMERID_INVALIDATE_FULL); CLUI_SafeSetTimer(dat->hWnd, TIMERID_INVALIDATE_FULL, 500, NULL); } WaitForSingleObjectEx(hgtaWakeupEvent, INFINITE, TRUE); ResetEvent(hgtaWakeupEvent); } LBL_Exit: CloseHandle(hgtaWakeupEvent); hgtaWakeupEvent = NULL; g_hGetTextAsyncThread = NULL; Netlib_Logf(NULL, "GTA thread end"); }
static int gtaThreadProc(void * lpParam) { BOOL exit=FALSE; HWND hwnd=pcli->hwndContactList; struct SHORTDATA data={0}; struct SHORTDATA * dat; while (!MirandaExiting()) { Sync(CLUI_SyncGetShortData,(WPARAM)pcli->hwndContactTree,(LPARAM)&data); do { if (!MirandaExiting()) SleepEx(0,TRUE); //1000 contacts per second if (MirandaExiting()) { g_dwGetTextAsyncThreadID=0; return 0; } else { GTACHAINITEM mpChain={0}; struct SHORTDATA dat2={0}; if (!gtaGetItem(&mpChain)) break; if (mpChain.dat==NULL || (!IsBadReadPtr(mpChain.dat,sizeof(mpChain.dat)) && mpChain.dat->hWnd==data.hWnd)) dat=&data; else { Sync(CLUI_SyncGetShortData,(WPARAM)mpChain.dat->hWnd,(LPARAM)&dat2); dat=&dat2; } if (!MirandaExiting()) { displayNameCacheEntry cacheEntry; memset( &cacheEntry, 0, sizeof(cacheEntry)); cacheEntry.m_cache_hContact=mpChain.hContact; if (!Sync(CLUI_SyncGetPDNCE, (WPARAM) 0,(LPARAM)&cacheEntry)) { if (!MirandaExiting()) Cache_GetSecondLineText(dat, &cacheEntry); if (!MirandaExiting()) Cache_GetThirdLineText(dat, &cacheEntry); if (!MirandaExiting()) Sync(CLUI_SyncSetPDNCE, (WPARAM) CCI_LINES,(LPARAM)&cacheEntry); CListSettings_FreeCacheItemData(&cacheEntry); } } else { g_dwGetTextAsyncThreadID=0; return 0; } KillTimer(dat->hWnd,TIMERID_INVALIDATE_FULL); CLUI_SafeSetTimer(dat->hWnd,TIMERID_INVALIDATE_FULL,500,NULL); } } while (!exit); WaitForSingleObjectEx(hgtaWakeupEvent, INFINITE, FALSE ); ResetEvent(hgtaWakeupEvent); } g_dwGetTextAsyncThreadID=0; return 1; }