static void ReloadMyAvatar(LPVOID lpParam) { char *szProto = (char *)lpParam; mir_sleep(500); for (int i = 0; !g_shutDown && i < g_MyAvatars.getCount(); i++) { char *myAvatarProto = g_MyAvatars[i].szProtoname; if (szProto[0] == 0) { // Notify to all possibles if (mir_strcmp(myAvatarProto, szProto)) { if (!ProtoServiceExists(myAvatarProto, PS_SETMYAVATAR)) continue; if (!Proto_IsAvatarsEnabled(myAvatarProto)) continue; } } else if (mir_strcmp(myAvatarProto, szProto)) continue; if (g_MyAvatars[i].hbmPic) DeleteObject(g_MyAvatars[i].hbmPic); if (CreateAvatarInCache(INVALID_CONTACT_ID, &g_MyAvatars[i], myAvatarProto) != -1) NotifyEventHooks(hMyAvatarChanged, (WPARAM)myAvatarProto, (LPARAM)&g_MyAvatars[i]); else NotifyEventHooks(hMyAvatarChanged, (WPARAM)myAvatarProto, 0); } free(lpParam); }
static void RequestThread(void *vParam) { while (!g_shutDown) { EnterCriticalSection(&cs); if (queue.getCount() == 0) { // No items, so suspend thread LeaveCriticalSection(&cs); mir_sleep(POOL_DELAY); continue; } // Take a look at first item QueueItem& qi = queue[queue.getCount() - 1]; if (qi.check_time > GetTickCount()) { // Not time to request yet, wait... LeaveCriticalSection(&cs); mir_sleep(POOL_DELAY); continue; } // Will request this item MCONTACT hContact = qi.hContact; queue.remove(queue.getCount() - 1); QueueRemove(hContact); LeaveCriticalSection(&cs); if (FetchAvatarFor(hContact) == GAIR_WAITFOR) { // Mark to not request this contact avatar for more 30 min { mir_cslock lock(cs); QueueRemove(hContact); QueueAdd(hContact, REQUEST_WAITFOR_WAIT_TIME); } // Wait a little until requesting again mir_sleep(REQUEST_DELAY); } } }