1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
Copyright (C) 2013 Miranda NG Project (http://miranda-ng.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation version 2
of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"
void CVkProto::OnReceiveAvatar(NETLIBHTTPREQUEST *reply, AsyncHttpRequest* hContact)
{
if (reply->resultCode != 200)
return;
PROTO_AVATAR_INFORMATIONT AI = { sizeof(AI) };
GetAvatarFileName(hContact, AI.filename, SIZEOF(AI.filename));
AI.format = ProtoGetBufferFormat(reply->pData);
FILE *out = _tfopen(AI.filename, _T("wb"));
if (out == NULL) {
ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, &AI, 0);
return;
}
fwrite(reply->pData, 1, reply->dataLength, out);
fclose(out);
ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, &AI, 0);
}
INT_PTR CVkProto::SvcGetAvatarCaps(WPARAM wParam, LPARAM lParam)
{
switch (wParam) {
case AF_MAXSIZE:
((POINT*)lParam)->x = 100;
((POINT*)lParam)->y = 100;
return 0;
case AF_PROPORTION:
return PIP_SQUARE;
case AF_FORMATSUPPORTED:
case AF_ENABLED:
case AF_DONTNEEDDELAYS:
case AF_FETCHALWAYS:
return 1;
}
return 0;
}
INT_PTR CVkProto::SvcGetAvatarInfo(WPARAM wParam, LPARAM lParam)
{
PROTO_AVATAR_INFORMATIONT* AI = (PROTO_AVATAR_INFORMATIONT*)lParam;
ptrA szUrl( getStringA(AI->hContact, "AvatarUrl"));
if (szUrl == NULL)
return GAIR_NOAVATAR;
TCHAR tszFileName[MAX_PATH];
GetAvatarFileName(AI->hContact, tszFileName, SIZEOF(tszFileName));
_tcsncpy(AI->filename, tszFileName, SIZEOF(AI->filename));
AI->format = ProtoGetAvatarFormat(AI->filename);
if (::_taccess(AI->filename, 0) == 0)
return GAIR_SUCCESS;
if ( IsOnline()) {
AsyncHttpRequest *pReq = new AsyncHttpRequest();
pReq->szUrl = mir_strdup(szUrl);
pReq->pUserInfo = (char*)AI->hContact;
pReq->m_pFunc = &CVkProto::OnReceiveAvatar;
pReq->requestType = REQUEST_GET;
PushAsyncHttpRequest(pReq);
debugLogA("Requested to read an avatar from '%s'", szUrl);
return GAIR_WAITFOR;
}
debugLogA("No avatar");
return GAIR_NOAVATAR;
}
void CVkProto::GetAvatarFileName(HANDLE hContact, TCHAR* pszDest, size_t cbLen)
{
int tPathLen = mir_sntprintf(pszDest, cbLen, _T("%s\\%S"), VARST(_T("%miranda_avatarcache%")), m_szModuleName);
DWORD dwAttributes = GetFileAttributes(pszDest);
if (dwAttributes == 0xffffffff || (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
CreateDirectoryTreeT(pszDest);
pszDest[ tPathLen++ ] = '\\';
const TCHAR* szFileType = _T(".jpg");
ptrT szUrl( getTStringA(hContact, "AvatarUrl"));
if (szUrl) {
TCHAR *p = _tcsrchr(szUrl, '.');
if (p != NULL)
szFileType = p;
}
LONG id = getDword(hContact, "ID", -1);
mir_sntprintf(pszDest + tPathLen, MAX_PATH - tPathLen, _T("%d%s"), id, szFileType);
}
|