void CMsnProto::MSN_GetAvatarFileName(MCONTACT hContact, TCHAR* pszDest, size_t cbLen, const TCHAR *ext) { size_t tPathLen = mir_sntprintf(pszDest, cbLen, _T("%s\\%S"), VARST(_T("%miranda_avatarcache%")), m_szModuleName); if (_taccess(pszDest, 0)) CreateDirectoryTreeT(pszDest); size_t tPathLen2 = tPathLen; if (hContact != NULL) { DBVARIANT dbv; if (getString(hContact, "PictContext", &dbv) == 0) { char* szAvatarHash = MSN_GetAvatarHash(dbv.pszVal); if (szAvatarHash != NULL) { TCHAR *sztAvatarHash = mir_a2t(szAvatarHash); tPathLen += mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("\\%s."), sztAvatarHash); mir_free(sztAvatarHash); mir_free(szAvatarHash); } else { delSetting(hContact, "PictContext"); if (cbLen) pszDest[0] = 0; } db_free(&dbv); } else if (cbLen) pszDest[0] = 0; } else { TCHAR *sztModuleName = mir_a2t(m_szModuleName); tPathLen += mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("\\%s avatar."), sztModuleName); mir_free(sztModuleName); } if (ext == NULL) { mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, _T("*")); bool found = false; _tfinddata_t c_file; long hFile = _tfindfirst(pszDest, &c_file); if (hFile > -1L) { do { if (_tcsrchr(c_file.name, '.')) { mir_sntprintf(pszDest + tPathLen2, cbLen - tPathLen2, _T("\\%s"), c_file.name); found = true; } } while(_tfindnext(hFile, &c_file) == 0); _findclose( hFile ); } if (!found) pszDest[0] = 0; } else { tPathLen--; mir_sntprintf(pszDest + tPathLen, cbLen - tPathLen, ext); } }
INT_PTR CMsnProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) { PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; TCHAR filename[MAX_PATH]; MsnContact *cont = NULL; if (pai->hContact) { cont = Lists_Get(pai->hContact); if (cont == NULL) return GAIR_NOAVATAR; /* if ((cont->cap1 & 0xf0000000) == 0) return GAIR_NOAVATAR; */ } if (pai->hContact == NULL || _stricmp(cont->email, MyOptions.szEmail) == 0) { MSN_GetAvatarFileName(NULL, filename, _countof(filename), NULL); pai->format = ProtoGetAvatarFormat(filename); if (pai->format != PA_FORMAT_UNKNOWN) mir_tstrcpy(pai->filename, filename); return pai->format == PA_FORMAT_UNKNOWN ? GAIR_NOAVATAR : GAIR_SUCCESS; } char *szContext; DBVARIANT dbv; if (getString(pai->hContact, pai->hContact ? "PictContext" : "PictObject", &dbv) == 0) { szContext = (char*)NEWSTR_ALLOCA(dbv.pszVal); db_free(&dbv); } else return GAIR_NOAVATAR; MSN_GetAvatarFileName(pai->hContact, filename, _countof(filename), NULL); pai->format = ProtoGetAvatarFormat(filename); if (pai->format != PA_FORMAT_UNKNOWN) { bool needupdate = true; if (getString(pai->hContact, "PictSavedContext", &dbv) == 0) { needupdate = mir_strcmp(dbv.pszVal, szContext) != 0; db_free(&dbv); } if (needupdate) { setString(pai->hContact, "PictSavedContext", szContext); // Store also avatar hash char* szAvatarHash = MSN_GetAvatarHash(szContext); if (szAvatarHash != NULL) { setString(pai->hContact, "AvatarSavedHash", szAvatarHash); mir_free(szAvatarHash); } } mir_tstrcpy(pai->filename, filename); return GAIR_SUCCESS; } if ((wParam & GAIF_FORCE) != 0 && pai->hContact != NULL) { if (avsPresent < 0) avsPresent = ServiceExists(MS_AV_SETMYAVATAR) != 0; if (!avsPresent) return GAIR_NOAVATAR; WORD wStatus = getWord(pai->hContact, "Status", ID_STATUS_OFFLINE); if (wStatus == ID_STATUS_OFFLINE) { delSetting(pai->hContact, "AvatarHash"); PROTO_AVATAR_INFORMATION *fakeAI = new PROTO_AVATAR_INFORMATION; *fakeAI = *pai; ForkThread(&CMsnProto::sttFakeAvatarAck, fakeAI); } else if (!getString(pai->hContact, "AvatarUrl", &dbv)) { pushAvatarRequest(pai->hContact, dbv.pszVal); db_free(&dbv); } #ifdef OBSOLETE else if (p2p_getAvatarSession(pai->hContact) == NULL) { filetransfer* ft = new filetransfer(this); ft->std.hContact = pai->hContact; ft->p2p_object = mir_strdup(szContext); MSN_GetAvatarFileName(pai->hContact, filename, _countof(filename), _T("unk")); ft->std.tszCurrentFile = mir_tstrdup(filename); p2p_invite(MSN_APPID_AVATAR, ft, NULL); } #endif return GAIR_WAITFOR; } return GAIR_NOAVATAR; }