Mercurial > pidgin.yaz
annotate plugins/icq/udp.c @ 1340:1526caa87138
[gaim-migrate @ 1350]
Grey's out the info button on conversation windows if the protocol doesnt support it.
Probably should add support for the other buttons to. For example: Warn, Block, add/remove, send :-)
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Thu, 21 Dec 2000 02:01:20 +0000 |
parents | 0a766047b4fd |
children | 4c510ca3563f |
rev | line source |
---|---|
1152 | 1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 /* | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
3 $Id: udp.c 1319 2000-12-19 10:08:29Z warmenhoven $ |
1152 | 4 $Log$ |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
5 Revision 1.2 2000/12/19 10:08:29 warmenhoven |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
6 Yay, new icqlib |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
7 |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
8 Revision 1.26 2000/12/19 06:00:07 bills |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
9 moved members from ICQLINK to ICQLINK_private struct |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
10 |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
11 Revision 1.25 2000/11/02 07:29:07 denis |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
12 Ability to disable TCP protocol has been added. |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
13 |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
14 Revision 1.24 2000/08/13 00:59:52 denis |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
15 Patch #101057 have been applied. |
1152 | 16 |
17 Revision 1.23 2000/07/09 22:19:35 bills | |
18 added new *Close functions, use *Close functions instead of *Delete | |
19 where correct, and misc cleanup | |
20 | |
21 Revision 1.22 2000/07/09 18:25:44 denis | |
22 icq_UpdateNewUserInfo() now returns seq1 instead of seq2 since it | |
23 isn't META function. | |
24 | |
25 Revision 1.21 2000/06/25 16:43:19 denis | |
26 icq_SendMetaInfoReq() was added. | |
27 All icq_*Meta*() functions now returns sequence number 2 because their | |
28 replies from the server are synced with it. | |
29 | |
30 Revision 1.20 2000/06/15 01:50:39 bills | |
31 removed *Seq functions | |
32 | |
33 Revision 1.19 2000/05/10 19:06:59 denis | |
34 UDP outgoing packet queue was implemented. | |
35 | |
36 Revision 1.18 2000/05/03 18:34:43 denis | |
37 icq_UpdateNewUserInfo() was added. | |
38 All icq_UpdateMetaInfo*() now return their sequence number. | |
39 | |
40 Revision 1.17 2000/04/10 16:36:04 denis | |
41 Some more Win32 compatibility from Guillaume Rosanis <grs@mail.com> | |
42 | |
43 Revision 1.16 2000/04/06 19:03:07 denis | |
44 return sequence number | |
45 | |
46 Revision 1.15 2000/04/06 16:36:18 denis | |
47 So called "Online List problem" bug with Long Contact List was fixed. | |
48 icq_*Send*Seq() functions with specified sequence number were added. | |
49 | |
50 Revision 1.14 2000/04/05 14:37:02 denis | |
51 Applied patch from "Guillaume R." <grs@mail.com> for basic Win32 | |
52 compatibility. | |
53 | |
54 Revision 1.13 1999/12/27 11:12:35 denis | |
55 icq_UpdateMetaInfoSecurity() added for setting "My authorization is | |
56 required", "Web Aware" and "IP Publishing". | |
57 | |
58 Revision 1.12 1999/10/14 11:43:28 denis | |
59 icq_UpdateMetaInfo* functions added. | |
60 | |
61 Revision 1.11 1999/10/07 18:36:27 denis | |
62 proxy.h file removed. | |
63 | |
64 Revision 1.10 1999/10/04 13:36:17 denis | |
65 Cleanups. | |
66 | |
67 Revision 1.9 1999/09/29 20:15:30 bills | |
68 tcp port wasn't being sent properly in login packet | |
69 | |
70 Revision 1.8 1999/09/29 17:13:45 denis | |
71 Webaware functions enabled without success even with UDP v5 - need more | |
72 investigations. | |
73 | |
74 Revision 1.7 1999/07/18 20:22:16 bills | |
75 changed to use new byte-order functions & contact list functions | |
76 | |
77 Revision 1.6 1999/07/16 15:46:00 denis | |
78 Cleaned up. | |
79 | |
80 Revision 1.5 1999/07/16 12:40:53 denis | |
81 ICQ UDP v5 implemented. | |
82 Encription for ICQ UDP v5 implemented. | |
83 icq_Packet* unified interface for UDP packets implemented. | |
84 Multipacket support of ICQ UDP v5 support added. | |
85 | |
86 Revision 1.4 1999/07/12 15:13:43 cproch | |
87 - added definition of ICQLINK to hold session-specific global variabled | |
88 applications which have more than one connection are now possible | |
89 - changed nearly every function defintion to support ICQLINK parameter | |
90 | |
91 Revision 1.3 1999/04/29 09:40:52 denis | |
92 Unsuccessful attempt to implement web presence (webaware) feature | |
93 | |
94 Revision 1.2 1999/04/14 15:04:13 denis | |
95 Cleanups for "strict" compiling (-ansi -pedantic) | |
96 Switched from icq_Log callback to icq_Fmt function. | |
97 | |
98 Revision 1.1 1999/03/24 11:37:38 denis | |
99 Underscored files with TCP stuff renamed. | |
100 TCP stuff cleaned up | |
101 Function names changed to corresponding names. | |
102 icqlib.c splitted to many small files by subject. | |
103 C++ comments changed to ANSI C comments. | |
104 | |
105 */ | |
106 | |
107 #ifndef _WIN32 | |
108 #include <unistd.h> | |
109 #endif | |
110 | |
111 #ifdef _WIN32 | |
112 #include <winsock.h> | |
113 #endif | |
114 | |
115 #include <stdlib.h> | |
116 | |
117 #include "icqtypes.h" | |
118 #include "icqlib.h" | |
119 #include "udp.h" | |
120 #include "queue.h" | |
121 | |
122 #include "stdpackets.h" | |
123 #include "icqbyteorder.h" | |
124 | |
125 static const BYTE icq_UDPTable[] = { | |
126 0x59, 0x60, 0x37, 0x6B, 0x65, 0x62, 0x46, 0x48, 0x53, 0x61, 0x4C, 0x59, 0x60, 0x57, 0x5B, 0x3D, | |
127 0x5E, 0x34, 0x6D, 0x36, 0x50, 0x3F, 0x6F, 0x67, 0x53, 0x61, 0x4C, 0x59, 0x40, 0x47, 0x63, 0x39, | |
128 0x50, 0x5F, 0x5F, 0x3F, 0x6F, 0x47, 0x43, 0x69, 0x48, 0x33, 0x31, 0x64, 0x35, 0x5A, 0x4A, 0x42, | |
129 0x56, 0x40, 0x67, 0x53, 0x41, 0x07, 0x6C, 0x49, 0x58, 0x3B, 0x4D, 0x46, 0x68, 0x43, 0x69, 0x48, | |
130 0x33, 0x31, 0x44, 0x65, 0x62, 0x46, 0x48, 0x53, 0x41, 0x07, 0x6C, 0x69, 0x48, 0x33, 0x51, 0x54, | |
131 0x5D, 0x4E, 0x6C, 0x49, 0x38, 0x4B, 0x55, 0x4A, 0x62, 0x46, 0x48, 0x33, 0x51, 0x34, 0x6D, 0x36, | |
132 0x50, 0x5F, 0x5F, 0x5F, 0x3F, 0x6F, 0x47, 0x63, 0x59, 0x40, 0x67, 0x33, 0x31, 0x64, 0x35, 0x5A, | |
133 0x6A, 0x52, 0x6E, 0x3C, 0x51, 0x34, 0x6D, 0x36, 0x50, 0x5F, 0x5F, 0x3F, 0x4F, 0x37, 0x4B, 0x35, | |
134 0x5A, 0x4A, 0x62, 0x66, 0x58, 0x3B, 0x4D, 0x66, 0x58, 0x5B, 0x5D, 0x4E, 0x6C, 0x49, 0x58, 0x3B, | |
135 0x4D, 0x66, 0x58, 0x3B, 0x4D, 0x46, 0x48, 0x53, 0x61, 0x4C, 0x59, 0x40, 0x67, 0x33, 0x31, 0x64, | |
136 0x55, 0x6A, 0x32, 0x3E, 0x44, 0x45, 0x52, 0x6E, 0x3C, 0x31, 0x64, 0x55, 0x6A, 0x52, 0x4E, 0x6C, | |
137 0x69, 0x48, 0x53, 0x61, 0x4C, 0x39, 0x30, 0x6F, 0x47, 0x63, 0x59, 0x60, 0x57, 0x5B, 0x3D, 0x3E, | |
138 0x64, 0x35, 0x3A, 0x3A, 0x5A, 0x6A, 0x52, 0x4E, 0x6C, 0x69, 0x48, 0x53, 0x61, 0x6C, 0x49, 0x58, | |
139 0x3B, 0x4D, 0x46, 0x68, 0x63, 0x39, 0x50, 0x5F, 0x5F, 0x3F, 0x6F, 0x67, 0x53, 0x41, 0x25, 0x41, | |
140 0x3C, 0x51, 0x54, 0x3D, 0x5E, 0x54, 0x5D, 0x4E, 0x4C, 0x39, 0x50, 0x5F, 0x5F, 0x5F, 0x3F, 0x6F, | |
141 0x47, 0x43, 0x69, 0x48, 0x33, 0x51, 0x54, 0x5D, 0x6E, 0x3C, 0x31, 0x64, 0x35, 0x5A, 0x00, 0x00, | |
142 }; | |
143 | |
144 void icq_UDPCheckCode(icq_Packet *p) | |
145 { | |
146 DWORD num1, num2; | |
147 DWORD r1,r2; | |
148 | |
149 num1 = p->data[8]; | |
150 num1 <<= 8; | |
151 num1 += p->data[4]; | |
152 num1 <<= 8; | |
153 num1 += p->data[2]; | |
154 num1 <<= 8; | |
155 num1 += p->data[6]; | |
156 | |
157 r1 = 0x18 + (rand() % (p->length - 0x18)); | |
158 r2 = rand() & 0xff; | |
159 | |
160 num2 = r1; | |
161 num2 <<= 8; | |
162 num2 += p->data[r1]; | |
163 num2 <<= 8; | |
164 num2 += r2; | |
165 num2 <<= 8; | |
166 num2 += icq_UDPTable[r2]; | |
167 num2 ^= 0xFF00FF; | |
168 | |
169 icq_PacketGoto(p, 0x14); | |
170 icq_PacketAppend32(p, num1 ^ num2); | |
171 } | |
172 | |
173 DWORD icq_UDPScramble(DWORD cc) | |
174 { | |
175 DWORD a[5]; | |
176 | |
177 a[0] = cc & 0x0000001F; | |
178 a[1] = cc & 0x03E003E0; | |
179 a[2] = cc & 0xF8000400; | |
180 a[3] = cc & 0x0000F800; | |
181 a[4] = cc & 0x041F0000; | |
182 | |
183 a[0] <<= 0x0C; | |
184 a[1] <<= 0x01; | |
185 a[2] >>= 0x0A; | |
186 a[3] <<= 0x10; | |
187 a[4] >>= 0x0F; | |
188 | |
189 return a[0] + a[1] + a[2] + a[3] + a[4]; | |
190 } | |
191 | |
192 void icq_UDPEncode(icq_Packet *p) | |
193 { | |
194 DWORD checkcode; | |
195 DWORD code1, code2, code3; | |
196 DWORD pos; | |
197 DWORD data; | |
198 | |
199 icq_UDPCheckCode(p); | |
200 icq_PacketGoto(p, 20); | |
201 checkcode = icq_PacketRead32(p); | |
202 code1 = p->length * 0x68656c6cL; | |
203 code2 = code1 + checkcode; | |
204 pos = 0x0A; | |
205 | |
206 for(; pos < p->length; pos+=4) | |
207 { | |
208 code3 = code2 + icq_UDPTable[pos & 0xFF]; | |
209 data = icqtohl(*(DWORD *)((p->data)+pos)); | |
210 data ^= code3; | |
211 *(DWORD*)((p->data)+pos)=htoicql(data); | |
212 } | |
213 checkcode = icq_UDPScramble(checkcode); | |
214 *(DWORD *)((p->data)+0x14)=htoicql(checkcode); | |
215 } | |
216 | |
217 /********************************************************* | |
218 icq_UDPSockWrite and icq_UDPSockRead are for _UDP_ packets | |
219 proxy support for TCP sockets is different! | |
220 *********************************************************/ | |
221 int icq_UDPSockWriteDirect(ICQLINK *link, icq_Packet *p) | |
222 { | |
223 char tmpbuf[ICQ_PACKET_DATA_SIZE]; | |
224 | |
225 if(link->icq_UDPSok <= 3) | |
226 { | |
227 icq_FmtLog(link, ICQ_LOG_ERROR, "Bad socket!\n"); | |
228 return -1; | |
229 } | |
230 | |
231 icq_UDPEncode(p); | |
232 if(!link->icq_UseProxy) | |
233 { | |
234 #ifdef _WIN32 | |
235 return send(link->icq_UDPSok, p->data, p->length, 0); | |
236 #else | |
237 return write(link->icq_UDPSok, p->data, p->length); | |
238 #endif | |
239 } | |
240 else | |
241 { | |
242 tmpbuf[0] = 0; /* reserved */ | |
243 tmpbuf[1] = 0; /* reserved */ | |
244 tmpbuf[2] = 0; /* standalone packet */ | |
245 tmpbuf[3] = 1; /* address type IP v4 */ | |
246 *(unsigned long*)&tmpbuf[4] = htonl(link->icq_ProxyDestIP); | |
247 *(unsigned short*)&tmpbuf[8] = htons(link->icq_ProxyDestPort); | |
248 memcpy(&tmpbuf[10], p->data, p->length); | |
249 #ifdef _WIN32 | |
250 return send(link->icq_UDPSok, tmpbuf, p->length+10, 0)-10; | |
251 #else | |
252 return write(link->icq_UDPSok, tmpbuf, p->length+10)-10; | |
253 #endif | |
254 } | |
255 } | |
256 | |
257 int icq_UDPSockWrite(ICQLINK *link, icq_Packet *p) | |
258 { | |
259 icq_Packet *qp; | |
260 WORD cmd = icq_PacketReadUDPOutCmd(p); | |
261 if(cmd != UDP_CMD_ACK && cmd != UDP_CMD_SEND_TEXT_CODE) | |
262 { | |
263 qp = (icq_Packet*)malloc(sizeof(icq_Packet)); | |
264 memcpy(qp, p, sizeof(icq_Packet)); | |
265 icq_UDPQueuePut(link, qp, 1); | |
266 if(link->icq_SetTimeout) | |
267 link->icq_SetTimeout(link, icq_UDPQueueInterval(link)); | |
268 } | |
269 return icq_UDPSockWriteDirect(link, p); | |
270 } | |
271 | |
272 int icq_UDPSockRead(ICQLINK *link, icq_Packet *p) | |
273 { | |
274 int res; | |
275 char tmpbuf[ICQ_PACKET_DATA_SIZE]; | |
276 | |
277 if(!link->icq_UseProxy) | |
278 { | |
279 #ifdef _WIN32 | |
280 res = recv(link->icq_UDPSok, p->data, ICQ_PACKET_DATA_SIZE, 0); | |
281 #else | |
282 res = read(link->icq_UDPSok, p->data, ICQ_PACKET_DATA_SIZE); | |
283 #endif | |
284 p->length = res; | |
285 return res; | |
286 } | |
287 else | |
288 { | |
289 #ifdef _WIN32 | |
290 res = recv(link->icq_UDPSok, tmpbuf, ICQ_PACKET_DATA_SIZE, 0); | |
291 #else | |
292 res = read(link->icq_UDPSok, tmpbuf, ICQ_PACKET_DATA_SIZE); | |
293 #endif | |
294 if(res<0) | |
295 return res; | |
296 memcpy(p->data, &tmpbuf[10], res-10); | |
297 p->length = res-10; | |
298 return res-10; | |
299 } | |
300 } | |
301 | |
302 void icq_HandleTimeout(ICQLINK *link) | |
303 { | |
304 icq_UDPQueueItem *ptr = 0; | |
305 icq_Packet *sp = 0, *pack = 0; | |
306 int attempt; | |
307 while(icq_UDPQueueInterval(link) == 0) | |
308 { | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
309 ptr = (icq_UDPQueueItem*)list_first(link->d->icq_UDPQueue); |
1152 | 310 attempt = ptr->attempts + 1; |
311 if(attempt > 6) | |
312 { | |
313 icq_Disconnect(link); | |
314 if(link->icq_Disconnected) | |
315 link->icq_Disconnected(link); | |
316 return; | |
317 } | |
318 pack = icq_UDPQueueGet(link); | |
319 sp = (icq_Packet*)malloc(sizeof(icq_Packet)); | |
320 memcpy(sp, pack, sizeof(icq_Packet)); | |
321 icq_UDPQueuePut(link, pack, attempt); | |
322 if(link->icq_SetTimeout) | |
323 link->icq_SetTimeout(link, icq_UDPQueueInterval(link)); | |
324 icq_UDPSockWriteDirect(link, sp); | |
325 icq_PacketDelete(sp); | |
326 } | |
327 } | |
328 | |
329 /**************************************** | |
330 This must be called every 2 min. | |
331 so the server knows we're still alive. | |
332 JAVA client sends two different commands | |
333 so we do also :) | |
334 *****************************************/ | |
335 WORD icq_KeepAlive(ICQLINK *link) /* V5 */ | |
336 { | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
337 icq_Packet *p = icq_UDPCreateStdSeqPacket(link, UDP_CMD_KEEP_ALIVE, link->d->icq_UDPSeqNum1++); |
1152 | 338 icq_PacketAppend32(p, rand()); |
339 icq_UDPSockWrite(link, p); | |
340 icq_PacketDelete(p); | |
341 | |
342 /* icq_Packet *p = icq_UDPCreateStdPacket(UDP_CMD_KEEP_ALIVE); | |
343 icq_UDPSockWrite(icq_UDPSok, p); | |
344 icq_PacketDelete(p);*/ | |
345 /* p = icq_UDPCreateStdPacket(UDP_CMD_KEEP_ALIVE2); | |
346 icq_UDPSockWrite(icq_Sok, p); | |
347 icq_PacketDelete(p);*/ | |
348 | |
349 icq_FmtLog(link, ICQ_LOG_MESSAGE, "Send Keep Alive packet to the server\n"); | |
350 | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
351 return link->d->icq_UDPSeqNum1-1; |
1152 | 352 } |
353 | |
354 /********************************** | |
355 This must be called to remove | |
356 messages from the server | |
357 ***********************************/ | |
358 void icq_SendGotMessages(ICQLINK *link) /* V5 */ | |
359 { | |
360 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_ACK_MESSAGES); | |
361 icq_PacketAppend32(p, rand()); | |
362 icq_UDPSockWrite(link, p); | |
363 icq_PacketDelete(p); | |
364 } | |
365 | |
366 /************************************* | |
367 this sends over the contact list | |
368 *************************************/ | |
369 void icq_SendContactList(ICQLINK *link) /* V5 */ | |
370 { | |
371 char num_used; | |
372 icq_ContactItem *ptr = icq_ContactGetFirst(link); | |
373 | |
374 while(ptr) | |
375 { | |
376 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_CONT_LIST); | |
377 | |
378 num_used = 0; | |
379 icq_PacketAdvance(p,1); | |
380 while(ptr && num_used<64) | |
381 { | |
382 icq_PacketAppend32(p, ptr->uin); | |
383 num_used++; | |
384 ptr = icq_ContactGetNext(ptr); | |
385 } | |
386 icq_PacketGotoUDPOutData(p, 0); | |
387 icq_PacketAppend8(p, num_used); | |
388 icq_UDPSockWrite(link, p); | |
389 icq_PacketDelete(p); | |
390 } | |
391 } | |
392 | |
393 void icq_SendNewUser(ICQLINK *link, unsigned long uin) /* V5 */ | |
394 { | |
395 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_ADD_TO_LIST); | |
396 icq_PacketAppend32(p, uin); | |
397 icq_UDPSockWrite(link, p); | |
398 icq_PacketDelete(p); | |
399 } | |
400 | |
401 /************************************* | |
402 this sends over the visible list | |
403 that allows certain users to see you | |
404 if you're invisible. | |
405 *************************************/ | |
406 void icq_SendVisibleList(ICQLINK *link) /* V5 */ | |
407 { | |
408 char num_used; | |
409 icq_ContactItem *ptr = icq_ContactGetFirst(link); | |
410 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_VIS_LIST); | |
411 | |
412 num_used = 0; | |
413 icq_PacketAdvance(p,1); | |
414 while(ptr) | |
415 { | |
416 if(ptr->vis_list) | |
417 { | |
418 icq_PacketAppend32(p, ptr->uin); | |
419 num_used++; | |
420 } | |
421 ptr = icq_ContactGetNext(ptr); | |
422 } | |
423 if(num_used != 0) | |
424 { | |
425 icq_PacketGotoUDPOutData(p, 0); | |
426 icq_PacketAppend8(p, num_used); | |
427 icq_UDPSockWrite(link, p); | |
428 } | |
429 icq_PacketDelete(p); | |
430 } | |
431 | |
432 void icq_SendInvisibleList(ICQLINK *link) /* V5 */ | |
433 { | |
434 char num_used; | |
435 icq_ContactItem *ptr = icq_ContactGetFirst(link); | |
436 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_INVIS_LIST); | |
437 | |
438 num_used = 0; | |
439 icq_PacketAdvance(p,1); | |
440 while(ptr) | |
441 { | |
442 if(ptr->vis_list) | |
443 { | |
444 icq_PacketAppend32(p, ptr->uin); | |
445 num_used++; | |
446 } | |
447 ptr = icq_ContactGetNext(ptr); | |
448 } | |
449 if(num_used != 0) | |
450 { | |
451 icq_PacketGotoUDPOutData(p, 0); | |
452 icq_PacketAppend8(p, num_used); | |
453 icq_UDPSockWrite(link, p); | |
454 } | |
455 icq_PacketDelete(p); | |
456 } | |
457 | |
458 /************************************** | |
459 This sends the second login command | |
460 this is necessary to finish logging in. | |
461 ***************************************/ | |
462 void icq_SendLogin1(ICQLINK *link) /* V5 */ | |
463 { | |
464 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_LOGIN_1); | |
465 icq_PacketAppend32(p, rand()); | |
466 icq_UDPSockWrite(link, p); | |
467 icq_PacketDelete(p); | |
468 } | |
469 | |
470 /************************************ | |
471 This procedure logins into the server with icq_Uin and pass | |
472 on the socket icq_Sok and gives our ip and port. | |
473 It does NOT wait for any kind of a response. | |
474 *************************************/ | |
475 void icq_Login(ICQLINK *link, DWORD status) /* V5 */ | |
476 { | |
477 icq_Packet *p; | |
478 | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
479 memset(link->d->icq_UDPServMess, FALSE, sizeof(link->d->icq_UDPServMess)); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
480 link->d->icq_UDPSession = rand() & 0x3FFFFFFF; |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
481 link->d->icq_UDPSeqNum1 = rand() & 0x7FFF; |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
482 link->d->icq_UDPSeqNum2 = 1; |
1152 | 483 |
484 p = icq_UDPCreateStdPacket(link, UDP_CMD_LOGIN); | |
485 icq_PacketAppend32(p, time(0L)); | |
486 icq_PacketAppend32n(p, link->icq_TCPSrvPort); | |
487 /*icq_PacketAppend16(p, 0); | |
488 icq_PacketAppend16n(p, htons(link->icq_OurPort));*/ | |
489 icq_PacketAppendString(p, link->icq_Password); | |
490 icq_PacketAppend32(p, LOGIN_X1_DEF); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
491 if(link->icq_UseTCP) |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
492 { |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
493 if(link->icq_UseProxy) |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
494 { |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
495 icq_PacketAppend32n(p, htonl(link->icq_ProxyIP)); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
496 icq_PacketAppend8(p, LOGIN_SNDONLY_TCP); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
497 } |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
498 else |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
499 { |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
500 icq_PacketAppend32n(p, htonl(link->icq_OurIP)); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
501 icq_PacketAppend8(p, LOGIN_SNDRCV_TCP); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
502 } |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
503 } |
1152 | 504 else |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
505 { |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
506 icq_PacketAppend32n(p, htonl(link->icq_ProxyIP)); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
507 icq_PacketAppend8(p, LOGIN_NO_TCP); |
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
508 } |
1152 | 509 icq_PacketAppend32(p, status); |
510 icq_PacketAppend32(p, LOGIN_X3_DEF); | |
511 icq_PacketAppend32(p, LOGIN_X4_DEF); | |
512 icq_PacketAppend32(p, LOGIN_X5_DEF); | |
513 | |
514 icq_UDPSockWrite(link, p); | |
515 icq_PacketDelete(p); | |
516 } | |
517 | |
518 /********************** | |
519 Logs off ICQ | |
520 ***********************/ | |
521 void icq_Logout(ICQLINK *link) /* V5 */ | |
522 { | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
523 icq_Packet *p = icq_UDPCreateStdSeqPacket(link, UDP_CMD_SEND_TEXT_CODE, link->d->icq_UDPSeqNum1++); |
1152 | 524 icq_PacketAppendString(p, "B_USER_DISCONNECTED"); |
525 icq_PacketAppend8(p, 5); | |
526 icq_PacketAppend8(p, 0); | |
527 icq_UDPSockWrite(link, p); | |
528 icq_PacketDelete(p); | |
529 } | |
530 | |
531 /******************************* | |
532 This routine sends the aknowlegement cmd to the | |
533 server it appears that this must be done after | |
534 everything the server sends us | |
535 *******************************/ | |
536 void icq_UDPAck(ICQLINK *link, int seq) /* V5 */ | |
537 { | |
538 icq_Packet *p = icq_UDPCreateStdSeqPacket(link, UDP_CMD_ACK, seq); | |
539 icq_PacketAppend32(p, rand()); | |
540 | |
541 icq_FmtLog(link, ICQ_LOG_MESSAGE, "Acking\n"); | |
542 icq_UDPSockWrite(link, p); | |
543 icq_PacketDelete(p); | |
544 } | |
545 | |
546 /*************************************************** | |
547 Sends a message thru the server to uin. Text is the | |
548 message to send. | |
549 ***************************************************/ | |
550 WORD icq_UDPSendMessage(ICQLINK *link, DWORD uin, const char *text) /* V5 */ | |
551 { | |
552 char buf[512]; /* message may be only 450 bytes long */ | |
553 icq_Packet *p; | |
554 | |
555 strncpy(buf, text, 512); | |
556 icq_RusConv("kw", buf); | |
557 | |
558 p = icq_UDPCreateStdPacket(link, UDP_CMD_SEND_THRU_SRV); | |
559 icq_PacketAppend32(p, uin); | |
560 icq_PacketAppend16(p, TYPE_MSG); | |
561 icq_PacketAppendString(p, buf); | |
562 | |
563 icq_UDPSockWrite(link, p); | |
564 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
565 return link->d->icq_UDPSeqNum1-1; |
1152 | 566 } |
567 | |
568 WORD icq_UDPSendURL(ICQLINK *link, DWORD uin, const char *url, const char *descr) /* V5 */ | |
569 { | |
570 char buf1[512], buf2[512]; | |
571 icq_Packet *p; | |
572 | |
573 strncpy(buf1, descr, 512); | |
574 icq_RusConv("kw", buf1); | |
575 strncpy(buf2, url, 512); | |
576 | |
577 p = icq_UDPCreateStdPacket(link, UDP_CMD_SEND_THRU_SRV); | |
578 icq_PacketAppend32(p, uin); | |
579 icq_PacketAppend16(p, TYPE_URL); | |
580 icq_PacketAppend16(p, strlen(buf1)+strlen(buf2)+2); /* length + the NULL + 0xFE delimiter */ | |
581 icq_PacketAppendStringFE(p, buf1); | |
582 icq_PacketAppendString0(p, buf2); | |
583 | |
584 icq_UDPSockWrite(link, p); | |
585 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
586 return link->d->icq_UDPSeqNum1-1; |
1152 | 587 } |
588 | |
589 /************************************************** | |
590 Sends a authorization to the server so the Mirabilis | |
591 client can add the user. | |
592 ***************************************************/ | |
593 WORD icq_SendAuthMsg(ICQLINK *link, DWORD uin) /* V5 */ | |
594 { | |
595 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_SEND_THRU_SRV); | |
596 icq_PacketAppend32(p, uin); | |
597 icq_PacketAppend32(p, TYPE_AUTH); | |
598 icq_PacketAppend16(p, 0); | |
599 icq_UDPSockWrite(link, p); | |
600 icq_PacketDelete(p); | |
601 | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
602 return link->d->icq_UDPSeqNum1-1; |
1152 | 603 } |
604 | |
605 /************************************************** | |
606 Changes the users status on the server | |
607 ***************************************************/ | |
608 void icq_ChangeStatus(ICQLINK *link, DWORD status) /* V5 */ | |
609 { | |
610 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_STATUS_CHANGE); | |
611 icq_PacketAppend32(p, status); | |
612 link->icq_Status = status; | |
613 icq_UDPSockWrite(link, p); | |
614 icq_PacketDelete(p); | |
615 } | |
616 | |
617 /******************************************************** | |
618 Sends a request to the server for info on a specific user | |
619 *********************************************************/ | |
620 WORD icq_SendInfoReq(ICQLINK *link, DWORD uin) /* V5 */ | |
621 { | |
622 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_INFO_REQ); | |
623 icq_PacketAppend32(p, uin); | |
624 icq_UDPSockWrite(link, p); | |
625 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
626 return link->d->icq_UDPSeqNum1-1; |
1152 | 627 } |
628 | |
629 /******************************************************** | |
630 Sends a request to the server for info on a specific user | |
631 *********************************************************/ | |
632 WORD icq_SendExtInfoReq(ICQLINK *link, DWORD uin) /* V5 */ | |
633 { | |
634 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_EXT_INFO_REQ); | |
635 icq_PacketAppend32(p, uin); | |
636 icq_UDPSockWrite(link, p); | |
637 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
638 return link->d->icq_UDPSeqNum1-1; |
1152 | 639 } |
640 | |
641 /************************************************************** | |
642 Initializes a server search for the information specified | |
643 ***************************************************************/ | |
644 void icq_SendSearchReq(ICQLINK *link, const char *email, const char *nick, const char *first, | |
645 const char *last) /* V5 */ | |
646 { | |
647 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_SEARCH_USER); | |
648 icq_PacketAppendString(p, nick); | |
649 icq_PacketAppendString(p, first); | |
650 icq_PacketAppendString(p, last); | |
651 icq_PacketAppendString(p, email); | |
652 icq_UDPSockWrite(link, p); | |
653 icq_PacketDelete(p); | |
654 } | |
655 | |
656 /************************************************************** | |
657 Initializes a server search for the information specified | |
658 ***************************************************************/ | |
659 void icq_SendSearchUINReq(ICQLINK *link, DWORD uin) /* V5 */ | |
660 { | |
661 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_SEARCH_UIN); | |
662 icq_PacketAppend32(p, uin); | |
663 icq_UDPSockWrite(link, p); | |
664 icq_PacketDelete(p); | |
665 } | |
666 | |
667 /************************************************** | |
668 Registers a new uin in the ICQ network | |
669 ***************************************************/ | |
670 void icq_RegNewUser(ICQLINK *link, const char *pass) /* V5 */ | |
671 { | |
672 char pass8[9]; | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
673 icq_Packet *p = icq_UDPCreateStdSeqPacket(link, UDP_CMD_REG_NEW_USER, link->d->icq_UDPSeqNum1++); |
1152 | 674 strncpy(pass8, pass, 8); |
675 icq_PacketAppendString(p, pass8); | |
676 icq_PacketAppend32(p, 0xA0); | |
677 icq_PacketAppend32(p, 0x2461); | |
678 icq_PacketAppend32(p, 0xA00000); | |
679 icq_PacketAppend32(p, 0x00); | |
680 icq_PacketGoto(p, 6); | |
681 icq_PacketAppend32(p, 0); | |
682 icq_PacketAppend32(p, rand()); | |
683 icq_UDPSockWrite(link, p); | |
684 icq_FmtLog(link, ICQ_LOG_MESSAGE, "Send RegNewUser packet to the server\n"); | |
685 icq_PacketDelete(p); | |
686 } | |
687 | |
688 WORD icq_UpdateUserInfo(ICQLINK *link, const char *nick, const char *first, const char *last, | |
689 const char *email) /* V5 */ | |
690 { | |
691 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_UPDATE_INFO); | |
692 icq_PacketAppendString(p, nick); | |
693 icq_PacketAppendString(p, first); | |
694 icq_PacketAppendString(p, last); | |
695 icq_PacketAppendString(p, email); | |
696 /* auth (byte)? */ | |
697 icq_UDPSockWrite(link, p); | |
698 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
699 return link->d->icq_UDPSeqNum1-1; |
1152 | 700 } |
701 | |
702 WORD icq_UpdateAuthInfo(ICQLINK *link, DWORD auth) /* V5 */ | |
703 { | |
704 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_UPDATE_AUTH); | |
705 icq_PacketAppend32(p, auth); /* NOT auth? */ | |
706 icq_UDPSockWrite(link, p); | |
707 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
708 return link->d->icq_UDPSeqNum1-1; |
1152 | 709 } |
710 | |
711 WORD icq_UpdateMetaInfoSet(ICQLINK *link, const char *nick, const char *first, const char *last, | |
712 const char *email, const char *email2, const char *email3, | |
713 const char *city, const char *state, const char *phone, const char *fax, | |
714 const char *street, const char *cellular, unsigned long zip, | |
715 unsigned short cnt_code, unsigned char cnt_stat, unsigned char emailhide) | |
716 { | |
717 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_META_USER); | |
718 icq_PacketAppend16(p, META_CMD_SET_INFO); | |
719 icq_PacketAppendString(p, nick); | |
720 icq_PacketAppendString(p, first); | |
721 icq_PacketAppendString(p, last); | |
722 icq_PacketAppendString(p, email); | |
723 icq_PacketAppendString(p, email2); | |
724 icq_PacketAppendString(p, email3); | |
725 icq_PacketAppendString(p, city); | |
726 icq_PacketAppendString(p, state); | |
727 icq_PacketAppendString(p, phone); | |
728 icq_PacketAppendString(p, fax); | |
729 icq_PacketAppendString(p, street); | |
730 icq_PacketAppendString(p, cellular); | |
731 icq_PacketAppend32(p, zip); | |
732 icq_PacketAppend16(p, cnt_code); | |
733 icq_PacketAppend8(p, cnt_stat); | |
734 icq_PacketAppend8(p, emailhide); | |
735 icq_UDPSockWrite(link, p); | |
736 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
737 return link->d->icq_UDPSeqNum2-1; |
1152 | 738 } |
739 | |
740 WORD icq_UpdateMetaInfoHomepage(ICQLINK *link, unsigned char age, const char *homepage, | |
741 unsigned char year, unsigned char month, unsigned char day, | |
742 unsigned char lang1, unsigned char lang2, unsigned char lang3) | |
743 { | |
744 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_META_USER); | |
745 icq_PacketAppend16(p, META_CMD_SET_HOMEPAGE); | |
746 icq_PacketAppend8(p, age); | |
747 icq_PacketAppend16(p, 0x0200); | |
748 icq_PacketAppendString(p, homepage); | |
749 icq_PacketAppend8(p, year); | |
750 icq_PacketAppend8(p, month); | |
751 icq_PacketAppend8(p, day); | |
752 icq_PacketAppend8(p, 0xFF /* lang1 */); | |
753 icq_PacketAppend8(p, 0xFF /* lang2 */); | |
754 icq_PacketAppend8(p, 0xFF /* lang3 */); | |
755 icq_UDPSockWrite(link, p); | |
756 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
757 return link->d->icq_UDPSeqNum2-1; |
1152 | 758 } |
759 | |
760 WORD icq_UpdateMetaInfoAbout(ICQLINK *link, const char *about) | |
761 { | |
762 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_META_USER); | |
763 icq_PacketAppend16(p, META_CMD_SET_ABOUT); | |
764 icq_PacketAppendString(p, about); | |
765 icq_UDPSockWrite(link, p); | |
766 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
767 return link->d->icq_UDPSeqNum2-1; |
1152 | 768 } |
769 | |
770 WORD icq_UpdateMetaInfoSecurity(ICQLINK *link, unsigned char reqauth, unsigned char webpresence, | |
771 unsigned char pubip) | |
772 { | |
773 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_META_USER); | |
774 icq_PacketAppend16(p, META_CMD_SET_SECURE); | |
775 icq_PacketAppend8(p, !reqauth); | |
776 icq_PacketAppend8(p, webpresence); | |
777 icq_PacketAppend8(p, pubip); | |
778 icq_UDPSockWrite(link, p); | |
779 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
780 return link->d->icq_UDPSeqNum2-1; |
1152 | 781 } |
782 | |
783 WORD icq_UpdateNewUserInfo(ICQLINK *link, const char *nick, const char *first, const char *last, | |
784 const char *email) /* V5 */ | |
785 { | |
786 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_NEW_USER_INFO); | |
787 icq_PacketAppendString(p, nick); | |
788 icq_PacketAppendString(p, first); | |
789 icq_PacketAppendString(p, last); | |
790 icq_PacketAppendString(p, email); | |
791 icq_PacketAppend8(p, 1); | |
792 icq_PacketAppend8(p, 1); | |
793 icq_PacketAppend8(p, 1); | |
794 icq_UDPSockWrite(link, p); | |
795 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
796 return link->d->icq_UDPSeqNum1-1; |
1152 | 797 } |
798 | |
799 WORD icq_SendMetaInfoReq(ICQLINK *link, unsigned long uin) | |
800 { | |
801 icq_Packet *p = icq_UDPCreateStdPacket(link, UDP_CMD_META_USER); | |
802 icq_PacketAppend16(p, META_CMD_REQ_INFO); | |
803 icq_PacketAppend32(p, uin); | |
804 icq_UDPSockWrite(link, p); | |
805 icq_PacketDelete(p); | |
1309
0a766047b4fd
[gaim-migrate @ 1319]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1152
diff
changeset
|
806 return link->d->icq_UDPSeqNum2-1; |
1152 | 807 } |