From e1a932b1b5c6aaf73425dcf9a8312ecf6cff7d6c Mon Sep 17 00:00:00 2001 From: Szymon Tokarz Date: Fri, 23 Nov 2012 01:00:25 +0000 Subject: Gadu-Gadu protocol - GG changed avatar API at http://api.gadu-gadu.pl/avatars/%d/0.xml file. Adapting our avatar code to that change. git-svn-id: http://svn.miranda-ng.org/main/trunk@2437 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Gadu-Gadu/src/avatar.cpp | 69 +++++++++++++++++++++--------------- protocols/Gadu-Gadu/src/gg.h | 2 ++ protocols/Gadu-Gadu/src/gg_proto.h | 2 +- protocols/Gadu-Gadu/src/services.cpp | 12 +++++-- 4 files changed, 52 insertions(+), 33 deletions(-) (limited to 'protocols') diff --git a/protocols/Gadu-Gadu/src/avatar.cpp b/protocols/Gadu-Gadu/src/avatar.cpp index bd41b80b10..c5c889e369 100644 --- a/protocols/Gadu-Gadu/src/avatar.cpp +++ b/protocols/Gadu-Gadu/src/avatar.cpp @@ -34,8 +34,7 @@ void GGPROTO::getAvatarFilename(HANDLE hContact, TCHAR *pszDest, int cbLen) if (hAvatarsFolder == NULL || FoldersGetCustomPathT(hAvatarsFolder, path, cbLen, _T(""))) { mir_ptr tmpPath( Utils_ReplaceVarsT( _T("%miranda_avatarcache%"))); tPathLen = mir_sntprintf(pszDest, cbLen, _T("%s\\%s"), (TCHAR*)tmpPath, m_tszUserName); - } - else { + } else { _tcscpy(pszDest, path); tPathLen = (int)_tcslen(pszDest); } @@ -62,13 +61,13 @@ void GGPROTO::getAvatarFilename(HANDLE hContact, TCHAR *pszDest, int cbLen) } } -void GGPROTO::getAvatarFileInfo(uin_t uin, char **avatarurl, int *type) +void GGPROTO::getAvatarFileInfo(uin_t uin, char **avatarurl, char **avatarts) { NETLIBHTTPREQUEST req = {0}; NETLIBHTTPREQUEST *resp; char szUrl[128]; *avatarurl = NULL; - *type = PA_FORMAT_UNKNOWN; + *avatarts = NULL; req.cbSize = sizeof(req); req.requestType = REQUEST_GET; @@ -96,26 +95,18 @@ void GGPROTO::getAvatarFileInfo(uin_t uin, char **avatarurl, int *type) blank = (node != NULL) ? mir_t2a(xi.getAttrValue(node, tag)) : NULL; if (blank != NULL && strcmp(blank, "1")) { - mir_free(tag); tag = mir_a2t("users/user/avatars/avatar/bigAvatar"); + mir_free(tag); tag = mir_a2t("users/user/avatars/avatar/originBigAvatar"); node = xi.getChildByPath(hXml, tag, 0); *avatarurl = node != NULL ? mir_t2a(xi.getText(node)) : NULL; - mir_free(tag); tag = mir_a2t("users/user/avatars/avatar/originBigAvatar"); + mir_free(tag); tag = mir_a2t("users/user/avatars/avatar/timestamp"); node = xi.getChildByPath(hXml, tag, 0); - if (node != NULL) { - char *orgavurl = mir_t2a(xi.getText(node)); - char *avtype = strrchr(orgavurl, '.'); - avtype++; - if (!_stricmp(avtype, "jpg")) - *type = PA_FORMAT_JPEG; - else if (!_stricmp(avtype, "gif")) - *type = PA_FORMAT_GIF; - else if (!_stricmp(avtype, "png")) - *type = PA_FORMAT_PNG; - mir_free(orgavurl); - } + *avatarts = node != NULL ? mir_t2a(xi.getText(node)) : NULL; + + } else { + *avatarurl = mir_strdup(""); + *avatarts = mir_strdup(""); } - else *avatarurl = mir_strdup(""); mir_free(blank); xi.destroyNode(hXml); } @@ -199,19 +190,22 @@ void __cdecl GGPROTO::avatarrequestthread(void*) if (avatar_requests) { GGREQUESTAVATARDATA *data = (GGREQUESTAVATARDATA *)avatar_requests->data; char *AvatarURL; - int AvatarType, iWaitFor = data->iWaitFor; + char *AvatarTs; + int iWaitFor = data->iWaitFor; HANDLE hContact = data->hContact; list_remove(&avatar_requests, data, 0); mir_free(data); gg_LeaveCriticalSection(&avatar_mutex, "avatarrequestthread", 3, 1, "avatar_mutex", 1); - getAvatarFileInfo( db_get_dw(hContact, m_szModuleName, GG_KEY_UIN, 0), &AvatarURL, &AvatarType); - if (AvatarURL != NULL && strlen(AvatarURL) > 0) + getAvatarFileInfo( db_get_dw(hContact, m_szModuleName, GG_KEY_UIN, 0), &AvatarURL, &AvatarTs); + if (AvatarURL != NULL && strlen(AvatarURL) > 0 && AvatarTs != NULL && strlen(AvatarTs) > 0){ db_set_s(hContact, m_szModuleName, GG_KEY_AVATARURL, AvatarURL); - else + db_set_s(hContact, m_szModuleName, GG_KEY_AVATARTS, AvatarTs); + } else { db_unset(hContact, m_szModuleName, GG_KEY_AVATARURL); - db_set_b(hContact, m_szModuleName, GG_KEY_AVATARTYPE, (BYTE)AvatarType); + db_unset(hContact, m_szModuleName, GG_KEY_AVATARTS); + } db_set_b(hContact, m_szModuleName, GG_KEY_AVATARREQUESTED, 1); if (iWaitFor) { @@ -249,6 +243,21 @@ void __cdecl GGPROTO::avatarrequestthread(void*) if (resp->resultCode == 200 && resp->dataLength > 0 && resp->pData) { int file_fd; + int avatarType = PA_FORMAT_UNKNOWN; + for (int i=0; i < resp->headersCount; i++) + { + NETLIBHTTPHEADER& tHeader = resp->headers[i]; + if (!_stricmp(tHeader.szName, "Content-Type")){ + if (!_stricmp(tHeader.szValue, "image/jpeg")) + avatarType = PA_FORMAT_JPEG; + else if (!_stricmp(tHeader.szValue, "image/gif")) + avatarType = PA_FORMAT_GIF; + else if (!_stricmp(tHeader.szValue, "image/png")) + avatarType = PA_FORMAT_PNG; + } + } + db_set_b(data->hContact, m_szModuleName, GG_KEY_AVATARTYPE, (BYTE)avatarType); + getAvatarFilename(pai.hContact, pai.filename, sizeof(pai.filename)); file_fd = _topen(pai.filename, _O_WRONLY | _O_TRUNC | _O_BINARY | _O_CREAT, _S_IREAD | _S_IWRITE); if (file_fd != -1) { @@ -325,16 +334,18 @@ void GGPROTO::uninitavatarrequestthread() void __cdecl GGPROTO::getuseravatarthread(void*) { char *AvatarURL; - int AvatarType; + char *AvatarTs; netlog("getuseravatarthread() started"); - getAvatarFileInfo( db_get_dw(NULL, m_szModuleName, GG_KEY_UIN, 0), &AvatarURL, &AvatarType); - if (AvatarURL != NULL && strlen(AvatarURL) > 0) + getAvatarFileInfo( db_get_dw(NULL, m_szModuleName, GG_KEY_UIN, 0), &AvatarURL, &AvatarTs); + if (AvatarURL != NULL && strlen(AvatarURL) > 0 && AvatarTs != NULL && strlen(AvatarTs) > 0){ db_set_s(NULL, m_szModuleName, GG_KEY_AVATARURL, AvatarURL); - else + db_set_s(NULL, m_szModuleName, GG_KEY_AVATARTS, AvatarTs); + } else { db_unset(NULL, m_szModuleName, GG_KEY_AVATARURL); - db_set_b(NULL, m_szModuleName, GG_KEY_AVATARTYPE, (BYTE)AvatarType); + db_unset(NULL, m_szModuleName, GG_KEY_AVATARTS); + } db_set_b(NULL, m_szModuleName, GG_KEY_AVATARREQUESTED, 1); mir_free(AvatarURL); diff --git a/protocols/Gadu-Gadu/src/gg.h b/protocols/Gadu-Gadu/src/gg.h index df2cc86b58..cb1d44d3a5 100644 --- a/protocols/Gadu-Gadu/src/gg.h +++ b/protocols/Gadu-Gadu/src/gg.h @@ -191,6 +191,8 @@ typedef struct #define GG_KEY_AVATARURL "AvatarURL" // Contact's avatar URL +#define GG_KEY_AVATARTS "AvatarTs" // Contact's avatar Timestamp + #define GG_KEY_AVATARTYPE "AvatarType" // Contact's avatar format #define GG_KEYDEF_AVATARTYPE PA_FORMAT_UNKNOWN diff --git a/protocols/Gadu-Gadu/src/gg_proto.h b/protocols/Gadu-Gadu/src/gg_proto.h index 615fea1976..e1be4c2cff 100644 --- a/protocols/Gadu-Gadu/src/gg_proto.h +++ b/protocols/Gadu-Gadu/src/gg_proto.h @@ -144,7 +144,7 @@ struct GGPROTO : public PROTO_INTERFACE, public MZeroedObject void requestAvatar(HANDLE hContact, int iWaitFor); void getUserAvatar(); void setAvatar(const TCHAR *szFilename); - void getAvatarFileInfo(uin_t uin, char **avatarurl, int *type); + void getAvatarFileInfo(uin_t uin, char **avatarurl, char **avatarts); INT_PTR __cdecl getavatarcaps(WPARAM wParam, LPARAM lParam); INT_PTR __cdecl getavatarinfo(WPARAM wParam, LPARAM lParam); diff --git a/protocols/Gadu-Gadu/src/services.cpp b/protocols/Gadu-Gadu/src/services.cpp index 11c8a25ac1..ce576aa214 100644 --- a/protocols/Gadu-Gadu/src/services.cpp +++ b/protocols/Gadu-Gadu/src/services.cpp @@ -174,6 +174,7 @@ INT_PTR GGPROTO::getavatarinfo(WPARAM wParam, LPARAM lParam) PROTO_AVATAR_INFORMATIONT *pai = (PROTO_AVATAR_INFORMATIONT *)lParam; char *AvatarHash = NULL, *AvatarSavedHash = NULL; char *AvatarURL = NULL; + char *AvatarTs = NULL; INT_PTR result = GAIR_NOAVATAR; DBVARIANT dbv; uin_t uin = (uin_t)db_get_dw(pai->hContact, m_szModuleName, GG_KEY_UIN, 0); @@ -198,11 +199,16 @@ INT_PTR GGPROTO::getavatarinfo(WPARAM wParam, LPARAM lParam) AvatarURL = mir_strdup(dbv.pszVal); DBFreeVariant(&dbv); } - - if (AvatarURL != NULL && strlen(AvatarURL) > 0) { + if (!db_get_s(pai->hContact, m_szModuleName, GG_KEY_AVATARTS, &dbv, DBVT_ASCIIZ)) { + AvatarTs = mir_strdup(dbv.pszVal); + DBFreeVariant(&dbv); + } + if (AvatarURL != NULL && strlen(AvatarURL) > 0 && AvatarTs != NULL && strlen(AvatarTs) > 0) { char *AvatarName = strrchr(AvatarURL, '/'); AvatarName++; - AvatarHash = gg_avatarhash(AvatarName); + char AvatarNameWithTS[128]; + sprintf(AvatarNameWithTS, "%s%s", AvatarName, AvatarTs); + AvatarHash = gg_avatarhash(AvatarNameWithTS); } if (!db_get_s(pai->hContact, m_szModuleName, GG_KEY_AVATARHASH, &dbv, DBVT_ASCIIZ)) { -- cgit v1.2.3