INT_PTR CAimProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) { PROTO_AVATAR_INFORMATION* AI = (PROTO_AVATAR_INFORMATION*)lParam; AI->filename[0] = 0; AI->format = PA_FORMAT_UNKNOWN; if (getByte(AIM_KEY_DA, 0)) return GAIR_NOAVATAR; switch (get_avatar_filename(AI->hContact, AI->filename, sizeof(AI->filename), NULL)) { case GAIR_SUCCESS: if (!(wParam & GAIF_FORCE) || state != 1 ) return GAIR_SUCCESS; case GAIR_WAITFOR: AI->format = detect_image_type(AI->filename); break; default: return GAIR_NOAVATAR; } if (state == 1) { ForkThread(&CAimProto::avatar_request_thread, AI->hContact); return GAIR_WAITFOR; } return GAIR_NOAVATAR; }
void CAimProto::avatar_retrieval_handler(const char* sn, const char* hash, const char* data, int data_len) { bool res = false; PROTO_AVATAR_INFORMATIONT AI = {0}; AI.cbSize = sizeof(AI); AI.hContact = contact_from_sn(sn); if (data_len > 0) { const TCHAR *type; AI.format = detect_image_type(data, type); get_avatar_filename(AI.hContact, AI.filename, SIZEOF(AI.filename), type); int fileId = _topen(AI.filename, _O_CREAT | _O_TRUNC | _O_WRONLY | O_BINARY, _S_IREAD | _S_IWRITE); if (fileId >= 0) { _write(fileId, data, data_len); _close(fileId); res = true; char *my_sn = getSetting(AIM_KEY_SN); if (!_strcmps(sn, my_sn)) CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0); mir_free(my_sn); } // else // ShowError("Cannot set avatar. File '%s' could not be created/overwritten", file); } else LOG("AIM sent avatar of zero length for %s.(Usually caused by repeated request for the same icon)", sn); sendBroadcast(AI.hContact, ACKTYPE_AVATAR, res ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, &AI, 0); }