summaryrefslogtreecommitdiff
path: root/protocols/IcqOscarJ/icq_avatar.h
blob: e6d140795aa4e375c583333ecced5180153436b6 (plain)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// ---------------------------------------------------------------------------80
//                ICQ plugin for Miranda Instant Messenger
//                ________________________________________
// 
// Copyright © 2000-2001 Richard Hughes, Roland Rabien, Tristan Van de Vreede
// Copyright © 2001-2002 Jon Keating, Richard Hughes
// Copyright © 2002-2004 Martin Öberg, Sam Kothari, Robert Rainwater
// Copyright © 2004-2010 Joe Kucera
// 
// 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; either version 2
// of the License, or (at your option) any later version.
// 
// 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, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// -----------------------------------------------------------------------------
//
// File name      : $URL: http://miranda.googlecode.com/svn/trunk/miranda/protocols/IcqOscarJ/icq_avatar.h $
// Revision       : $Revision: 14141 $
// Last change on : $Date: 2012-03-09 22:52:15 +0200 (Пт, 09 мар 2012) $
// Last change by : $Author: george.hazan $
//
// DESCRIPTION:
//
//  Avatars connection support declarations
//
// -----------------------------------------------------------------------------

#ifndef __ICQ_AVATAR_H
#define __ICQ_AVATAR_H


extern BYTE hashEmptyAvatar[9];

#define AVATAR_HASH_MINI    0x00
#define AVATAR_HASH_STATIC  0x01
#define AVATAR_HASH_FLASH   0x08
#define AVATAR_HASH_PHOTO   0x0C

struct CIcqProto;

struct avatars_server_connection : public lockable_struct
{
protected:
	CIcqProto *ppro;
	HANDLE hConnection;  // handle to the connection
	HANDLE hPacketRecver;
	WORD   wLocalSequence;
	icq_critical_section *localSeqMutex;

  BOOL   isLoggedIn;
  BOOL   isActive;
	BOOL   stopThread; // horrible, but simple - signal for thread to stop

  char  *pCookie;     // auth to server
	WORD   wCookieLen;

	int    sendServerPacket(icq_packet *pPacket);

	int    handleServerPackets(BYTE *buf, int buflen);

	void   handleLoginChannel(BYTE *buf, WORD datalen);
	void   handleDataChannel(BYTE *buf, WORD datalen);

	void   handleServiceFam(BYTE *pBuffer, WORD wBufferLength, snac_header *pSnacHeader);
	void   handleAvatarFam(BYTE *pBuffer, WORD wBufferLength, snac_header *pSnacHeader);

	rates *m_rates;
  icq_critical_section *m_ratesMutex;

	int    NetLog_Server(const char *fmt,...);

	HANDLE runContact[4];
	DWORD  runTime[4];
	int    runCount;
  void   checkRequestQueue();
public:
  avatars_server_connection(CIcqProto *ppro, HANDLE hConnection, char *pCookie, WORD wCookieLen);
  virtual ~avatars_server_connection();

  void connectionThread();
  void closeConnection();
  void shutdownConnection();

  __inline BOOL isPending() { return !isLoggedIn; };
  __inline BOOL isReady() { return isLoggedIn && isActive && !stopThread; };

  DWORD  sendGetAvatarRequest(HANDLE hContact, DWORD dwUin, char *szUid, const BYTE *hash, unsigned int hashlen, const TCHAR *file);
  DWORD  sendUploadAvatarRequest(HANDLE hContact, WORD wRef, const BYTE *data, unsigned int datalen);
};

__inline static void SAFE_DELETE(avatars_server_connection **p) { SAFE_DELETE((lockable_struct**)p); };


struct avatars_request : public void_struct
{
	int    type;
	HANDLE hContact;
	DWORD  dwUin;
	uid_str szUid;
	BYTE  *hash;
	unsigned int hashlen;
	TCHAR  *szFile;
	BYTE   *pData;
	unsigned int cbData;
	WORD   wRef;
	DWORD  timeOut;
	avatars_request *pNext;
public:
  avatars_request(int type);
  virtual ~avatars_request();
};

__inline static void SAFE_DELETE(avatars_request **p) { SAFE_DELETE((void_struct**)p); };

#define ART_GET     1
#define ART_UPLOAD  2
#define ART_BLOCK   4


int  DetectAvatarFormat(const TCHAR *szFile);
void AddAvatarExt(int dwFormat, TCHAR *pszDest);

BYTE* calcMD5HashOfFile(const TCHAR *szFile);

#endif /* __ICQ_AVATAR_H */