diff options
-rw-r--r-- | protocols/Icq10/src/proto.h | 1 | ||||
-rw-r--r-- | protocols/Icq10/src/server.cpp | 43 | ||||
-rw-r--r-- | protocols/Icq10/src/utils.cpp | 47 |
3 files changed, 67 insertions, 24 deletions
diff --git a/protocols/Icq10/src/proto.h b/protocols/Icq10/src/proto.h index 2f34bdc739..b8bf2304b6 100644 --- a/protocols/Icq10/src/proto.h +++ b/protocols/Icq10/src/proto.h @@ -65,6 +65,7 @@ struct IcqOwnMessage class CIcqProto : public PROTO<CIcqProto> { bool m_bOnline = false, m_bTerminated = false; + void CheckAvatarChange(MCONTACT hContact, const JSONNode&); void CheckPassword(void); void ConnectionFailed(int iReason); void OnLoggedIn(void); diff --git a/protocols/Icq10/src/server.cpp b/protocols/Icq10/src/server.cpp index 39a74bdfd1..1889f56a94 100644 --- a/protocols/Icq10/src/server.cpp +++ b/protocols/Icq10/src/server.cpp @@ -22,6 +22,20 @@ #pragma comment(lib, "libeay32.lib") +void CIcqProto::CheckAvatarChange(MCONTACT hContact, const JSONNode &ev) +{ + CMStringW wszIconId(ev["iconId"].as_mstring()); + CMStringW oldIconID(getMStringW(hContact, "IconId")); + if (wszIconId != oldIconID) { + setWString(hContact, "IconId", wszIconId); + + CMStringA szUrl(ev["buddyIcon"].as_mstring()); + auto *p = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnReceiveAvatar); + p->pUserInfo = (void*)hContact; + Push(p); + } +} + void CIcqProto::CheckPassword() { char mirVer[100]; @@ -102,17 +116,7 @@ MCONTACT CIcqProto::ParseBuddyInfo(const JSONNode &buddy) else db_set_ws(hContact, "CList", "StatusMsg", str); - CMStringW wszIconId(buddy["iconId"].as_mstring()); - CMStringW oldIconID(getMStringW(hContact, "IconId")); - if (wszIconId != oldIconID) { - setWString(hContact, "IconId", wszIconId); - - CMStringA szUrl(buddy["buddyIcon"].as_mstring()); - auto *p = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnReceiveAvatar); - p->pUserInfo = (void*)hContact; - Push(p); - } - + CheckAvatarChange(hContact, buddy); return hContact; } @@ -520,24 +524,19 @@ void CIcqProto::ProcessMyInfo(const JSONNode &ev) if (!wszNick.IsEmpty()) setWString("Nick", wszNick); - CMStringW wszIconId(ev["iconId"].as_mstring()); - CMStringW oldIconID(getMStringW("IconId")); - if (wszIconId != oldIconID) { - setWString("IconId", wszIconId); - - CMStringA szUrl(ev["buddyIcon"].as_mstring()); - Push(new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnReceiveAvatar)); - } + CheckAvatarChange(0, ev); } void CIcqProto::ProcessPresence(const JSONNode &ev) { DWORD dwUin = _wtol(ev["aimId"].as_mstring()); - int iStatus = StatusFromString(ev["state"].as_mstring()); IcqCacheItem *pCache = FindContactByUIN(dwUin); - if (pCache) - setDword(pCache->m_hContact, "Status", iStatus); + if (pCache) { + setDword(pCache->m_hContact, "Status", StatusFromString(ev["state"].as_mstring())); + + CheckAvatarChange(pCache->m_hContact, ev); + } } void CIcqProto::ProcessTyping(const JSONNode &ev) diff --git a/protocols/Icq10/src/utils.cpp b/protocols/Icq10/src/utils.cpp index d3364dd58c..49c9ad0d03 100644 --- a/protocols/Icq10/src/utils.cpp +++ b/protocols/Icq10/src/utils.cpp @@ -137,9 +137,52 @@ INT_PTR __cdecl CIcqProto::GetAvatarInfo(WPARAM, LPARAM lParam) return GAIR_NOAVATAR; } -INT_PTR __cdecl CIcqProto::SetAvatar(WPARAM, LPARAM) +INT_PTR __cdecl CIcqProto::SetAvatar(WPARAM, LPARAM lParam) { - return 1; // TODO + wchar_t* pwszFileName = (wchar_t*)lParam; + + wchar_t wszOldName[MAX_PATH]; + GetAvatarFileName(0, wszOldName, _countof(wszOldName)); + _wremove(wszOldName); + + auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, ICQ_API_SERVER "/expressions/upload"); + pReq->m_szUrl.AppendFormat("?f=json&aimsid=%s&r=%s&type=largeBuddyIcon", ptrA(mir_urlEncode(m_aimsid.c_str())), pReq->m_reqId); + + if (pwszFileName == nullptr) + delSetting("AvatarHash"); + else { + int fileId = _wopen(pwszFileName, _O_RDONLY | _O_BINARY, _S_IREAD); + if (fileId < 0) { + delete pReq; + return 1; + } + + unsigned dwSize = (unsigned)_filelengthi64(fileId); + char* pData = (char*)mir_alloc(dwSize); + if (pData == nullptr) { + _close(fileId); + delete pReq; + return 2; + } + + _read(fileId, pData, dwSize); + _close(fileId); + + pReq->pData = pData; + pReq->dataLength = dwSize; + + int iAvatarType = ProtoGetBufferFormat(pData); + if (iAvatarType == PA_FORMAT_UNKNOWN) { + delete pReq; + delete pData; + return 3; + } + + pReq->AddHeader("Content-Type", _T2A(ProtoGetAvatarMimeType(iAvatarType))); + } + Push(pReq); + + return 0; // TODO } ///////////////////////////////////////////////////////////////////////////////////////// |