void avatars_server_connection::checkRequestQueue() { mir_cslockfull alck(ppro->m_avatarsMutex); while (ppro->m_arAvatars.getCount() && runCount < 3) { // pick up an request and send it - happens immediatelly after login // do not fill queue to top, leave one place free avatars_request *pRequest = ppro->m_arAvatars[0]; { // rate management mir_cslock l(m_ratesMutex); WORD wGroup = m_rates->getGroupFromSNAC(ICQ_AVATAR_FAMILY, (WORD)(pRequest->type == ART_UPLOAD ? ICQ_AVATAR_GET_REQUEST : ICQ_AVATAR_UPLOAD_REQUEST)); // we are over rate, leave queue and wait if (m_rates->getNextRateLevel(wGroup) < m_rates->getLimitLevel(wGroup, RML_ALERT)) break; } if (pRequest->type == ART_BLOCK) { // block contact processing for (int i = 0; i < ppro->m_arAvatars.getCount(); i++) { avatars_request *ar = ppro->m_arAvatars[i]; if (GetTickCount() > ar->timeOut) { // expired contact block, remove ppro->m_arAvatars.remove(i); delete ar; } } return; // end processing } ppro->m_arAvatars.remove(int(0)); alck.unlock(); switch (pRequest->type) { case ART_GET: // get avatar sendGetAvatarRequest(pRequest->hContact, pRequest->dwUin, pRequest->szUid, pRequest->hash, pRequest->hashlen, pRequest->szFile); break; case ART_UPLOAD: // set avatar sendUploadAvatarRequest(pRequest->hContact, pRequest->wRef, pRequest->pData, pRequest->cbData); break; } delete pRequest; alck.lock(); } }
void avatars_server_connection::checkRequestQueue() { #ifdef _DEBUG ppro->debugLogA("Checking request queue..."); #endif ppro->m_avatarsMutex->Enter(); while (ppro->m_avatarsQueue && runCount < 3) // pick up an request and send it - happens immediatelly after login { // do not fill queue to top, leave one place free avatars_request *pRequest = ppro->m_avatarsQueue; { // rate management icq_lock l(m_ratesMutex); WORD wGroup = m_rates->getGroupFromSNAC(ICQ_AVATAR_FAMILY, (WORD)(pRequest->type == ART_UPLOAD ? ICQ_AVATAR_GET_REQUEST : ICQ_AVATAR_UPLOAD_REQUEST)); if (m_rates->getNextRateLevel(wGroup) < m_rates->getLimitLevel(wGroup, RML_ALERT)) { // we are over rate, leave queue and wait #ifdef _DEBUG ppro->debugLogA("Rates: Leaving avatar queue processing"); #endif break; } } if (pRequest->type == ART_BLOCK) { // block contact processing avatars_request **ppRequest = &ppro->m_avatarsQueue; while (pRequest) { if (GetTickCount() > pRequest->timeOut) { // expired contact block, remove *ppRequest = pRequest->pNext; delete pRequest; } else // it is not time, move to next request ppRequest = &pRequest->pNext; pRequest = *ppRequest; } // end queue processing (only block requests follows) break; } else ppro->m_avatarsQueue = pRequest->pNext; ppro->m_avatarsMutex->Leave(); #ifdef _DEBUG ppro->debugLogA("Picked up the %s request from queue.", strUID(pRequest->dwUin, pRequest->szUid)); #endif switch (pRequest->type) { case ART_GET: // get avatar sendGetAvatarRequest(pRequest->hContact, pRequest->dwUin, pRequest->szUid, pRequest->hash, pRequest->hashlen, pRequest->szFile); break; case ART_UPLOAD: // set avatar sendUploadAvatarRequest(pRequest->hContact, pRequest->wRef, pRequest->pData, pRequest->cbData); break; } delete pRequest; ppro->m_avatarsMutex->Enter(); } ppro->m_avatarsMutex->Leave(); }