summaryrefslogtreecommitdiff
path: root/protocols/AimOscar/src/proto.h
blob: 160996443f0efb4d849b94771b44c4c45a4824e9 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
/*
Plugin of Miranda IM for communicating with users of the AIM protocol.
Copyright (c) 2008-2012 Boris Krasnovskiy

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, see <http://www.gnu.org/licenses/>.
*/

#ifndef _AIM_PROTO_H_
#define _AIM_PROTO_H_

struct CAimProto : public PROTO<CAimProto>
{
	CAimProto(const char*, const wchar_t*);
	~CAimProto();

	//====================================================================================
	// PROTO_INTERFACE
	//====================================================================================

	virtual	MCONTACT  __cdecl AddToList( int flags, PROTOSEARCHRESULT* psr );

	virtual	int       __cdecl AuthRequest(MCONTACT hContact, const wchar_t* szMessage );

	virtual	HANDLE    __cdecl FileAllow(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szPath );
	virtual	int       __cdecl FileCancel(MCONTACT hContact, HANDLE hTransfer );
	virtual	int       __cdecl FileDeny(MCONTACT hContact, HANDLE hTransfer, const wchar_t* szReason );
	virtual	int       __cdecl FileResume( HANDLE hTransfer, int* action, const wchar_t** szFilename );

	virtual	DWORD_PTR __cdecl GetCaps( int type, MCONTACT hContact = NULL );

	virtual	HANDLE    __cdecl SearchBasic( const wchar_t* id );
	virtual	HANDLE    __cdecl SearchByEmail( const wchar_t* email );

	virtual	int       __cdecl RecvMsg(MCONTACT hContact, PROTORECVEVENT* );

	virtual	HANDLE    __cdecl SendFile(MCONTACT hContact, const wchar_t* szDescription, wchar_t** ppszFiles);
	virtual	int       __cdecl SendMsg(MCONTACT hContact, int flags, const char* msg );

	virtual	int       __cdecl SetStatus( int iNewStatus );

	virtual	HANDLE    __cdecl GetAwayMsg(MCONTACT hContact );
	virtual	int       __cdecl RecvAwayMsg(MCONTACT hContact, int mode, PROTORECVEVENT* evt );
	virtual	int       __cdecl SetAwayMsg( int m_iStatus, const wchar_t* msg );

	virtual	int       __cdecl UserIsTyping(MCONTACT hContact, int type );

	virtual	int       __cdecl OnEvent( PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam );

	//====| Services |====================================================================
	INT_PTR  __cdecl SvcCreateAccMgrUI(WPARAM wParam, LPARAM lParam);

	INT_PTR  __cdecl GetAvatarInfo(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl GetMyAwayMsg(WPARAM wParam,LPARAM lParam);

	INT_PTR  __cdecl GetAvatar(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl SetAvatar(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl GetAvatarCaps(WPARAM wParam, LPARAM lParam);

	INT_PTR  __cdecl ManageAccount(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl InstantIdle(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl JoinChatUI(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl GetHTMLAwayMsg(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl GetProfile(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl EditProfile(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl AddToServerList(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl BlockBuddy(WPARAM wParam, LPARAM lParam);

	INT_PTR  __cdecl OnJoinChat(WPARAM wParam, LPARAM lParam);
	INT_PTR  __cdecl OnLeaveChat(WPARAM wParam, LPARAM lParam);

	//====| Events |======================================================================
	int  __cdecl OnContactDeleted(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnGroupChange(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnIdleChanged(WPARAM wParam, LPARAM lParam);
	int  __cdecl OnWindowEvent(WPARAM wParam, LPARAM lParam);
	int  __cdecl OnModulesLoaded( WPARAM wParam, LPARAM lParam );
	int  __cdecl OnOptionsInit(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnPreBuildContactMenu(WPARAM wParam,LPARAM lParam);
//    int  __cdecl OnPreShutdown(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnDbSettingChanged(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnUserInfoInit(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnGCEvent(WPARAM wParam,LPARAM lParam);
	int  __cdecl OnGCMenuHook(WPARAM wParam,LPARAM lParam);

	//====| Data |========================================================================
	mir_cs SendingMutex;
	mir_cs connMutex;

	char* COOKIE;
	int COOKIE_LENGTH;
	char* MAIL_COOKIE;
	int MAIL_COOKIE_LENGTH;
	char* AVATAR_COOKIE;
	int AVATAR_COOKIE_LENGTH;
	char* CHATNAV_COOKIE;
	int CHATNAV_COOKIE_LENGTH;
	char* ADMIN_COOKIE;
	int ADMIN_COOKIE_LENGTH;

	char *m_username;
	unsigned short m_seqno;//main connection sequence number
	int m_state;//m_iStatus of the connection; e.g. whether connected or not
	unsigned short m_port;

	//Some bools to keep track of different things
	bool m_request_HTML_profile;
	bool m_request_away_message;
	bool m_extra_icons_loaded;
	bool m_idle;
	bool m_instantidle;
	bool m_list_received;

	//Some main connection stuff
	HNETLIBCONN m_hServerConn; // handle to the main connection

	unsigned long m_internal_ip;  // our ip
	unsigned long m_detected_ip;  // our ip
	unsigned short m_local_port;  // our port

	//Peer connection stuff
	HNETLIBUSER m_hNetlibPeer;//handle to the peer netlib
	HANDLE m_hDirectBoundPort;//direct connection listening port

	//Handles for the context menu items
	HGENMENU m_hHTMLAwayContextMenuItem;
	HGENMENU m_hAddToServerListContextMenuItem;
	HGENMENU m_hBlockContextMenuItem;
	HGENMENU m_hMainMenu[3];

	//Some mail connection stuff
	HNETLIBCONN m_hMailConn;
	unsigned short m_mail_seqno;

	//avatar connection stuff
	unsigned short m_avatar_seqno;
	unsigned short m_avatar_id_sm;
	unsigned short m_avatar_id_lg;
	HNETLIBCONN m_hAvatarConn;
	HANDLE m_hAvatarEvent;

	ft_list_type m_ft_list;

	//chatnav connection stuff
	unsigned short m_chatnav_seqno;
	HNETLIBCONN m_hChatNavConn;
	HANDLE m_hChatNavEvent;
	char MAX_ROOMS;

	OBJLIST<chat_list_item> m_chat_rooms;

	//admin connection stuff
	unsigned short m_admin_seqno;
	HNETLIBCONN m_hAdminConn;
	HANDLE m_hAdminEvent;

	// privacy settings
	unsigned long m_pd_flags;
	unsigned short m_pd_info_id;
	char m_pd_mode;

	// prefernces
	unsigned short m_pref1_id;
	unsigned long m_pref1_flags;
	unsigned long m_pref1_set_flags;
	unsigned long m_pref2_len;
	unsigned long m_pref2_set_len;
	char *m_pref2_flags;
	char *m_pref2_set_flags;

	BdList m_allow_list;
	BdList m_block_list;
	BdList m_group_list;

	//away message retrieval stuff
	char *m_modeMsgs[9];
	char *m_last_status_msg;

	//////////////////////////////////////////////////////////////////////////////////////
	// avatars.cpp

	char *m_hash_sm, *m_hash_lg;

	void   __cdecl avatar_request_thread( void* param );
	void   __cdecl avatar_upload_thread( void* param );

	void   avatar_request_handler(MCONTACT hContact, char* hash, unsigned char type);
	void   avatar_retrieval_handler(const char* sn, const char* hash, const char* data, int data_len);
	int    get_avatar_filename(MCONTACT hContact, wchar_t* pszDest, size_t cbLen, const wchar_t *ext);

	//////////////////////////////////////////////////////////////////////////////////////
	// away.cpp

	void   __cdecl get_online_msg_thread( void* arg );

	int    aim_set_away(HNETLIBCONN hServerConn, unsigned short &seqno, const char *msg, bool set);//user info
	int    aim_set_statusmsg(HNETLIBCONN hServerConn,unsigned short &seqno,const char *msg);//user info
	int    aim_set_status(HNETLIBCONN hServerConn,unsigned short &seqno,unsigned long status_type);
	int    aim_query_away_message(HNETLIBCONN hServerConn,unsigned short &seqno,const char* sn);

	char**  get_status_msg_loc(int status);

	//////////////////////////////////////////////////////////////////////////////////////
	// chat.cpp

	void   __cdecl chatnav_request_thread( void* param );

	void chat_register(void);
	void chat_start(const char* id, unsigned short exchange);
	void chat_event(const char* id, const char* sn, int evt, const wchar_t* msg = NULL);
	void chat_leave(const char* id);

	chat_list_item* find_chat_by_cid(unsigned short cid);
	chat_list_item* find_chat_by_id(char* id);
	chat_list_item* find_chat_by_conn(HANDLE conn);
	void remove_chat_by_ptr(chat_list_item* item);
	void shutdown_chat_conn(void);
	void close_chat_conn(void);

	//////////////////////////////////////////////////////////////////////////////////////
	// client.cpp

	int    aim_send_connection_packet(HNETLIBCONN hServerConn, unsigned short &seqno, char *buf);
	int    aim_authkey_request(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_auth_request(HNETLIBCONN hServerConn, unsigned short &seqno, const char* key, const char* language, const char* country, const char* username, const char* password);
	int    aim_send_cookie(HNETLIBCONN hServerConn, unsigned short &seqno, int cookie_size, char * cookie);
	int    aim_send_service_request(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_new_service_request(HNETLIBCONN hServerConn, unsigned short &seqno, unsigned short service);
	int    aim_request_rates(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_request_icbm(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_request_offline_msgs(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_set_icbm(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_set_profile(HNETLIBCONN hServerConn, unsigned short &seqno, char* amsg);//user info
	int    aim_request_list(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_activate_list(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_accept_rates(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_set_caps(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_client_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_mail_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_avatar_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_chatnav_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_chat_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_send_message(HNETLIBCONN hServerConn, unsigned short &seqno, const char* sn, char* amsg, bool auto_response, bool blast);
	int    aim_query_profile(HNETLIBCONN hServerConn, unsigned short &seqno, char* sn);
	int    aim_delete_contact(HNETLIBCONN hServerConn, unsigned short &seqno, char* sn, unsigned short item_id, unsigned short group_id, unsigned short list, bool nil);
	int    aim_add_contact(HNETLIBCONN hServerConn, unsigned short &seqno, const char* sn, unsigned short item_id, unsigned short group_id, unsigned short list, char* nick = NULL, char* note = NULL);
	int    aim_mod_group(HNETLIBCONN hServerConn, unsigned short &seqno, const char* name, unsigned short group_id, char* members, unsigned short members_length);
	int    aim_mod_buddy(HNETLIBCONN hServerConn, unsigned short &seqno, const char* sn, unsigned short buddy_id, unsigned short group_id, char* nick, char* note);
	int    aim_ssi_update(HNETLIBCONN hServerConn, unsigned short &seqno, bool start);
	int    aim_ssi_update_preferences(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_keepalive(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_send_file(HNETLIBCONN hServerConn, unsigned short &seqno, unsigned long ip, unsigned short port, bool force_proxy, file_transfer *ft);//used when requesting a regular file transfer
	int    aim_file_ad(HNETLIBCONN hServerConn, unsigned short &seqno, char* sn, char* icbm_cookie, bool deny, unsigned short max_ver);
	int    aim_typing_notification(HNETLIBCONN hServerConn, unsigned short &seqno, char* sn, unsigned short type);
	int    aim_set_idle(HNETLIBCONN hServerConn, unsigned short &seqno, unsigned long seconds);
	int    aim_request_mail(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_activate_mail(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_request_avatar(HNETLIBCONN hServerConn, unsigned short &seqno, const char* sn, unsigned short bart_type, const char* hash, unsigned short hash_size);//family 0x0010
	int    aim_set_avatar_hash(HNETLIBCONN hServerConn, unsigned short &seqno, char flags, unsigned short bart_type, unsigned short &id, char size, const char* hash);
	int    aim_delete_avatar_hash(HNETLIBCONN hServerConn, unsigned short &seqno, char flags, unsigned short bart_type, unsigned short &id);
	int    aim_upload_avatar(HNETLIBCONN hServerConn, unsigned short &seqno, unsigned short bart_type, const char* avatar, unsigned short avatar_size);
	int    aim_search_by_email(HNETLIBCONN hServerConn, unsigned short &seqno, const char* email);
	int    aim_set_pd_info(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_block_buddy(HNETLIBCONN hServerConn, unsigned short &seqno, bool remove, const char* sn, unsigned short item_id);
	int    aim_chatnav_request_limits(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_chatnav_create(HNETLIBCONN hServerConn, unsigned short &seqno, char* room, unsigned short exchage);
	int    aim_chatnav_room_info(HNETLIBCONN hServerConn, unsigned short &seqno, char* chat_cookie, unsigned short exchange, unsigned short instance);
	int    aim_chat_join_room(HNETLIBCONN hServerConn, unsigned short &seqno, char* chat_cookie, unsigned short exchange, unsigned short instance, unsigned short id);
	int    aim_chat_send_message(HNETLIBCONN hServerConn, unsigned short &seqno, char *amsg);
	int    aim_chat_invite(HNETLIBCONN hServerConn, unsigned short &seqno, char* chat_cookie, unsigned short exchange, unsigned short instance, char* sn, char* msg);
	int    aim_chat_deny(HNETLIBCONN hServerConn, unsigned short &seqno, char* sn, char* icbm_cookie);
	int    aim_admin_ready(HNETLIBCONN hServerConn, unsigned short &seqno);
	int    aim_admin_format_name(HNETLIBCONN hServerConn, unsigned short &seqno, const char* sn);
	int    aim_admin_change_password(HNETLIBCONN hServerConn, unsigned short &seqno, const char* cur_pw, const char* new_pw);
	int    aim_admin_change_email(HNETLIBCONN hServerConn, unsigned short &seqno, const char* email);
	int    aim_admin_request_info(HNETLIBCONN hServerConn, unsigned short &seqno, const unsigned short &type);
	int    aim_admin_account_confirm(HNETLIBCONN hServerConn, unsigned short &seqno);

	//////////////////////////////////////////////////////////////////////////////////////
	// connection.cpp

	void    aim_connection_authorization(void);
	void    aim_connection_clientlogin(void);

	void   __cdecl aim_protocol_negotiation(void*);
	void   __cdecl aim_mail_negotiation(void*);
	void   __cdecl aim_avatar_negotiation(void*);
	void   __cdecl aim_chatnav_negotiation(void*);
	void   __cdecl aim_chat_negotiation(void*);
	void   __cdecl aim_admin_negotiation(void*);

	HNETLIBCONN aim_connect(const char* server, unsigned short port, bool use_ssl, const char* host = NULL);
	HNETLIBCONN aim_peer_connect(const char* ip, unsigned short port);
	HNETLIBCONN aim_peer_connect(unsigned long ip, unsigned short port);

	//////////////////////////////////////////////////////////////////////////////////////
	// direct_connect.cpp

	void   __cdecl aim_dc_helper( void* );

	//////////////////////////////////////////////////////////////////////////////////////
	// error.cpp

	void   login_error(unsigned short error);
	void   get_error(unsigned short error);
	void   admin_error(unsigned short error);

	//////////////////////////////////////////////////////////////////////////////////////
	// file.cpp

	int    sending_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLIBPACKETRECVER &packetRecv);
	int    receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLIBPACKETRECVER &packetRecv);
	void   report_file_error(wchar_t* fname);
	void   shutdown_file_transfers(void);

	//////////////////////////////////////////////////////////////////////////////////////
	// packets.cpp

	int    aim_sendflap(HNETLIBCONN conn, char type, unsigned short length, const char *buf, unsigned short &seqno);

	//////////////////////////////////////////////////////////////////////////////////////
	// proto.cpp

	void   __cdecl basic_search_ack_success( void* p );
	void   __cdecl email_search_ack_success( void* p );

	//////////////////////////////////////////////////////////////////////////////////////
	// proxy.cpp

	void   __cdecl aim_proxy_helper( void* );

	//////////////////////////////////////////////////////////////////////////////////////
	// server.cpp

	void   snac_md5_authkey(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno, const char* username, const char* password);
	int    snac_authorization_reply(SNAC &snac);
	void   snac_supported_families(SNAC &snac, HNETLIBCONN hServerConn,unsigned short &seqno);
	void   snac_supported_family_versions(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);//family 0x0001
	void   snac_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);//family 0x0001
	void   snac_mail_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);// family 0x0001
	void   snac_avatar_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);// family 0x0001
	void   snac_chatnav_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);// family 0x0001
	void   snac_chat_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);// family 0x0001
	void   snac_admin_rate_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);// family 0x0001
	void   snac_service_redirect(SNAC &snac);// family 0x0001
	void   snac_self_info(SNAC &snac);//family 0x0001
	void   snac_icbm_limitations(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);//family 0x0004
	void   snac_user_online(SNAC &snac);
	void   snac_user_offline(SNAC &snac);
	void   snac_error(SNAC &snac);//family 0x0003 or x0004
	void   snac_contact_list(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);
	void   snac_message_accepted(SNAC &snac);//family 0x004
	void   snac_received_message(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);//family 0x0004
	void   snac_file_decline(SNAC &snac);//family 0x0004
	void   snac_received_info(SNAC &snac);//family 0x0002
	void   snac_typing_notification(SNAC &snac);//family 0x004
	void   snac_list_modification_ack(SNAC &snac);//family 0x0013
	void   snac_mail_response(SNAC &snac);//family 0x0018
	void   snac_retrieve_avatar(SNAC &snac);//family 0x0010
	void   snac_upload_reply_avatar(SNAC &snac);//family 0x0010
	void   snac_email_search_results(SNAC &snac);//family 0x000A
	void   snac_chatnav_info_response(SNAC &snac,HNETLIBCONN hServerConn,unsigned short &seqno);//family 0x000D
	void   snac_chat_joined_left_users(SNAC &snac,chat_list_item* item);//family 0x000E
	void   snac_chat_received_message(SNAC &snac,chat_list_item* item);//family 0x000E
	void   snac_admin_account_infomod(SNAC &snac);//family 0x0007
	void   snac_admin_account_confirm(SNAC &snac);//family 0x0007

	void process_ssi_list(SNAC &snac, int &offset);
	void modify_ssi_list(SNAC &snac, int &offset);
	void delete_ssi_list(SNAC &snac, int &offset);

	//////////////////////////////////////////////////////////////////////////////////////
	// themes.cpp

	void   InitMainMenus(void);
	void   InitContactMenus(void);
	
	//////////////////////////////////////////////////////////////////////////////////////
	// thread.cpp

	void   __cdecl accept_file_thread( void* );

	//////////////////////////////////////////////////////////////////////////////////////
	// utilities.cpp

	struct msg_ack_param { MCONTACT hContact; const char *msg; int id; bool success; };

	void   __cdecl msg_ack_success(void*);
	void   __cdecl start_connection(void*);

	MCONTACT find_chat_contact(const char * room);
	MCONTACT contact_from_sn(const char* sn, bool addIfNeeded = false, bool temporary = false);

	void   broadcast_status(int status);
	bool   wait_conn(HNETLIBCONN& hConn, HANDLE& hEvent, unsigned short service);
	bool   is_my_contact(MCONTACT hContact);
	void   add_contact_to_group(MCONTACT hContact, const char* group);
	void   set_local_nick(MCONTACT hContact, char* nick, char* note);
	void   upload_nicks(void);
	void   update_server_group(const char* group, unsigned short group_id);
	void   offline_contacts(void);
	void   offline_contact(MCONTACT hContact, bool remove_settings);
	unsigned short get_default_port(void);

	int    open_contact_file(const char* sn, const wchar_t* file, const char* mode, wchar_t* &path, bool contact_dir);
	void   write_away_message(const char* sn, const char* msg, bool utf);
	void   write_profile(const char* sn, const char* msg, bool utf);

	unsigned short getBuddyId(MCONTACT hContact, int i);
	unsigned short getGroupId(MCONTACT hContact, int i);
	void setBuddyId(MCONTACT hContact, int i, unsigned short id);
	void setGroupId(MCONTACT hContact, int i, unsigned short id);
	int deleteBuddyId(MCONTACT hContact, int i);
	int deleteGroupId(MCONTACT hContact, int i);

	unsigned short search_for_free_item_id(MCONTACT hbuddy);
	unsigned short* get_members_of_group(unsigned short group_id, unsigned short& size);

	void   ShowPopup( const char* msg, int flags, char* url = 0 );
};

#endif