]> andersk Git - libfaim.git/blame - aim_misc.c
- Wed Dec 13 02:26:39 UTC 2000
[libfaim.git] / aim_misc.c
CommitLineData
9de3ca7e 1
2/*
3 * aim_misc.c
4 *
5 * TODO: Seperate a lot of this into an aim_bos.c.
6 *
7 * Other things...
8 *
9 * - Idle setting
10 *
11 *
12 */
13
a25832e6 14#include <faim/aim.h>
9de3ca7e 15
16/*
17 * aim_bos_setidle()
18 *
19 * Should set your current idle time in seconds. Idealy, OSCAR should
20 * do this for us. But, it doesn't. The client must call this to set idle
21 * time.
22 *
23 */
5ac21963 24faim_export unsigned long aim_bos_setidle(struct aim_session_t *sess,
25 struct aim_conn_t *conn,
26 u_long idletime)
9de3ca7e 27{
a25832e6 28 return aim_genericreq_l(sess, conn, 0x0001, 0x0011, &idletime);
9de3ca7e 29}
30
31
32/*
33 * aim_bos_changevisibility(conn, changtype, namelist)
34 *
35 * Changes your visibility depending on changetype:
36 *
37 * AIM_VISIBILITYCHANGE_PERMITADD: Lets provided list of names see you
38 * AIM_VISIBILITYCHANGE_PERMIDREMOVE: Removes listed names from permit list
39 * AIM_VISIBILITYCHANGE_DENYADD: Hides you from provided list of names
40 * AIM_VISIBILITYCHANGE_DENYREMOVE: Lets list see you again
41 *
42 * list should be a list of
43 * screen names in the form "Screen Name One&ScreenNameTwo&" etc.
44 *
45 * Equivelents to options in WinAIM:
46 * - Allow all users to contact me: Send an AIM_VISIBILITYCHANGE_DENYADD
47 * with only your name on it.
48 * - Allow only users on my Buddy List: Send an
49 * AIM_VISIBILITYCHANGE_PERMITADD with the list the same as your
50 * buddy list
51 * - Allow only the uesrs below: Send an AIM_VISIBILITYCHANGE_PERMITADD
52 * with everyone listed that you want to see you.
53 * - Block all users: Send an AIM_VISIBILITYCHANGE_PERMITADD with only
54 * yourself in the list
55 * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with
56 * the list of users to be blocked
57 *
58 *
59 */
5ac21963 60faim_export unsigned long aim_bos_changevisibility(struct aim_session_t *sess,
61 struct aim_conn_t *conn,
62 int changetype,
63 char *denylist)
9de3ca7e 64{
5b79dc93 65 struct command_tx_struct *newpacket;
66 int packlen = 0;
9de3ca7e 67 u_short subtype;
68
69 char *localcpy = NULL;
70 char *tmpptr = NULL;
71 int i,j;
72 int listcount;
73
74 if (!denylist)
75 return 0;
76
9de3ca7e 77 localcpy = (char *) malloc(strlen(denylist)+1);
78 memcpy(localcpy, denylist, strlen(denylist)+1);
79
80 listcount = aimutil_itemcnt(localcpy, '&');
5b79dc93 81 packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
9de3ca7e 82
b69540e3 83 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen)))
5b79dc93 84 return -1;
9de3ca7e 85
5b79dc93 86 newpacket->lock = 1;
9de3ca7e 87
88 switch(changetype)
89 {
90 case AIM_VISIBILITYCHANGE_PERMITADD: subtype = 0x05; break;
91 case AIM_VISIBILITYCHANGE_PERMITREMOVE: subtype = 0x06; break;
92 case AIM_VISIBILITYCHANGE_DENYADD: subtype = 0x07; break;
93 case AIM_VISIBILITYCHANGE_DENYREMOVE: subtype = 0x08; break;
94 default:
5b79dc93 95 free(newpacket->data);
96 free(newpacket);
9de3ca7e 97 return 0;
98 }
99
100 /* We actually DO NOT send a SNAC ID with this one! */
5b79dc93 101 aim_putsnac(newpacket->data, 0x0009, subtype, 0x00, 0);
9de3ca7e 102
103 j = 10; /* the next byte */
104
105 for (i=0; (i < (listcount - 1)) && (i < 99); i++)
106 {
107 tmpptr = aimutil_itemidx(localcpy, i, '&');
108
5b79dc93 109 newpacket->data[j] = strlen(tmpptr);
110 memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
9de3ca7e 111 j += strlen(tmpptr)+1;
112 free(tmpptr);
113 }
114 free(localcpy);
115
5b79dc93 116 newpacket->lock = 0;
9de3ca7e 117
5b79dc93 118 aim_tx_enqueue(sess, newpacket);
9de3ca7e 119
a25832e6 120 return (sess->snac_nextid); /* dont increment */
9de3ca7e 121
122}
123
124
125
126/*
127 * aim_bos_setbuddylist(buddylist)
128 *
129 * This just builds the "set buddy list" command then queues it.
130 *
131 * buddy_list = "Screen Name One&ScreenNameTwo&";
132 *
5b79dc93 133 * TODO: Clean this up.
134 *
135 * XXX: I can't stress the TODO enough.
9de3ca7e 136 *
137 */
5ac21963 138faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess,
139 struct aim_conn_t *conn,
140 char *buddy_list)
9de3ca7e 141{
142 int i, j;
143
5b79dc93 144 struct command_tx_struct *newpacket;
9de3ca7e 145
c78446b5 146 int len = 0;
9de3ca7e 147
148 char *localcpy = NULL;
149 char *tmpptr = NULL;
150
c78446b5 151 len = 10; /* 10B SNAC headers */
9de3ca7e 152
c78446b5 153 if (!buddy_list || !(localcpy = (char *) malloc(strlen(buddy_list)+1)))
5b79dc93 154 return -1;
c78446b5 155 strncpy(localcpy, buddy_list, strlen(buddy_list)+1);
9de3ca7e 156
157 i = 0;
158 tmpptr = strtok(localcpy, "&");
c78446b5 159 while ((tmpptr != NULL) && (i < 150)) {
9de3ca7e 160#if debug > 0
c78446b5 161 printf("---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr));
9de3ca7e 162#endif
c78446b5 163 len += 1+strlen(tmpptr);
164 i++;
165 tmpptr = strtok(NULL, "&");
166 }
9de3ca7e 167#if debug > 0
c78446b5 168 printf("*** send buddy list len: %d (%x)\n", len, len);
9de3ca7e 169#endif
9de3ca7e 170
c78446b5 171 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, len)))
5b79dc93 172 return -1;
9de3ca7e 173
5b79dc93 174 newpacket->lock = 1;
175
c78446b5 176 aim_putsnac(newpacket->data, 0x0003, 0x0004, 0x0000, 0);
9de3ca7e 177
178 j = 10; /* the next byte */
179
c78446b5 180 strncpy(localcpy, buddy_list, strlen(buddy_list)+1);
9de3ca7e 181 i = 0;
c78446b5 182 tmpptr = strtok(localcpy, "&");
183 while ((tmpptr != NULL) & (i < 150)) {
9de3ca7e 184#if debug > 0
c78446b5 185 printf("---adding %d: %s (%d)\n", i, tmpptr, strlen(tmpptr));
9de3ca7e 186#endif
c78446b5 187 newpacket->data[j] = strlen(tmpptr);
188 memcpy(&(newpacket->data[j+1]), tmpptr, strlen(tmpptr));
189 j += 1+strlen(tmpptr);
190 i++;
191 tmpptr = strtok(NULL, "&");
192 }
9de3ca7e 193
5b79dc93 194 newpacket->lock = 0;
9de3ca7e 195
5b79dc93 196 aim_tx_enqueue(sess, newpacket);
9de3ca7e 197
c78446b5 198 free(localcpy);
199
200 return (sess->snac_nextid);
9de3ca7e 201}
202
203/*
204 * aim_bos_setprofile(profile)
205 *
206 * Gives BOS your profile.
207 *
26af6789 208 *
9de3ca7e 209 */
5ac21963 210faim_export unsigned long aim_bos_setprofile(struct aim_session_t *sess,
211 struct aim_conn_t *conn,
212 char *profile,
213 char *awaymsg,
214 unsigned short caps)
9de3ca7e 215{
5b79dc93 216 struct command_tx_struct *newpacket;
b69540e3 217 int i = 0, tmp, caplen;
0c20631f 218
b69540e3 219 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0))))
5b79dc93 220 return -1;
9de3ca7e 221
5b79dc93 222 i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
223 i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
224 i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile);
26af6789 225 /* why do we send this twice? */
5b79dc93 226 i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
9de3ca7e 227
0c20631f 228 /* Away message -- we send this no matter what, even if its blank */
229 if (awaymsg)
5b79dc93 230 i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg);
0c20631f 231 else
5b79dc93 232 i += aim_puttlv_str(newpacket->data+i, 0x0004, 0x0000, NULL);
26af6789 233
234 /* Capability information. */
b69540e3 235
236 tmp = (i += aimutil_put16(newpacket->data+i, 0x0005));
237 i += aimutil_put16(newpacket->data+i, 0x0000); /* rewritten later */
238 i += (caplen = aim_putcap(newpacket->data+i, 512, caps));
239 aimutil_put16(newpacket->data+tmp, caplen); /* rewrite TLV size */
240
5b79dc93 241 newpacket->commandlen = i;
242 aim_tx_enqueue(sess, newpacket);
9de3ca7e 243
a25832e6 244 return (sess->snac_nextid++);
9de3ca7e 245}
246
247/*
248 * aim_bos_setgroupperm(mask)
249 *
98c88242 250 * Set group permisson mask. Normally 0x1f (all classes).
251 *
252 * The group permission mask allows you to keep users of a certain
253 * class or classes from talking to you. The mask should be
254 * a bitwise OR of all the user classes you want to see you.
9de3ca7e 255 *
256 */
5ac21963 257faim_export unsigned long aim_bos_setgroupperm(struct aim_session_t *sess,
258 struct aim_conn_t *conn,
259 u_long mask)
9de3ca7e 260{
a25832e6 261 return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask);
9de3ca7e 262}
263
5ac21963 264faim_internal int aim_parse_bosrights(struct aim_session_t *sess,
265 struct command_rx_struct *command, ...)
96f8b1ed 266{
267 rxcallback_t userfunc = NULL;
268 int ret=1;
269 struct aim_tlvlist_t *tlvlist;
96f8b1ed 270 unsigned short maxpermits = 0, maxdenies = 0;
271
272 /*
273 * TLVs follow
274 */
275 if (!(tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10)))
276 return ret;
277
278 /*
279 * TLV type 0x0001: Maximum number of buddies on permit list.
280 */
1ea867e3 281 if (aim_gettlv(tlvlist, 0x0001, 1))
282 maxpermits = aim_gettlv16(tlvlist, 0x0001, 1);
96f8b1ed 283
284 /*
285 * TLV type 0x0002: Maximum number of buddies on deny list.
286 *
287 */
1ea867e3 288 if (aim_gettlv(tlvlist, 0x0002, 1))
289 maxdenies = aim_gettlv16(tlvlist, 0x0002, 1);
96f8b1ed 290
1ea867e3 291 if ((userfunc = aim_callhandler(command->conn, 0x0009, 0x0003)))
292 ret = userfunc(sess, command, maxpermits, maxdenies);
96f8b1ed 293
294 aim_freetlvchain(&tlvlist);
295
296 return ret;
297}
298
9de3ca7e 299/*
300 * aim_bos_clientready()
301 *
302 * Send Client Ready.
303 *
304 * TODO: Dynamisize.
305 *
306 */
5ac21963 307faim_export unsigned long aim_bos_clientready(struct aim_session_t *sess,
308 struct aim_conn_t *conn)
9de3ca7e 309{
310 u_char command_2[] = {
311 /* placeholders for dynamic data */
312 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
313 0xff, 0xff,
314 /* real data */
01b59e1e 315 0x00, 0x01,
316 0x00, 0x03,
317 0x00, 0x04,
5925849b 318 0x06, 0x86, /* the good ones */
319#if 0
320 0x07, 0xda, /* DUPLE OF DEATH! */
321#endif
c78446b5 322
01b59e1e 323 0x00, 0x02,
324 0x00, 0x01,
325 0x00, 0x04,
326 0x00, 0x01,
327
328 0x00, 0x03,
329 0x00, 0x01,
330 0x00, 0x04,
c78446b5 331 0x00, 0x01,
332
01b59e1e 333 0x00, 0x04,
334 0x00, 0x01,
335 0x00, 0x04,
336 0x00, 0x01,
337
338 0x00, 0x06,
339 0x00, 0x01,
340 0x00, 0x04,
341 0x00, 0x01,
342 0x00, 0x08,
343 0x00, 0x01,
344 0x00, 0x04,
345 0x00, 0x01,
346
347 0x00, 0x09,
348 0x00, 0x01,
349 0x00, 0x04,
350 0x00, 0x01,
351 0x00, 0x0a,
352 0x00, 0x01,
353 0x00, 0x04,
354 0x00, 0x01,
355
356 0x00, 0x0b,
357 0x00, 0x01,
358 0x00, 0x04,
9de3ca7e 359 0x00, 0x01
360 };
361 int command_2_len = 0x52;
5b79dc93 362 struct command_tx_struct *newpacket;
9de3ca7e 363
b69540e3 364 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, command_2_len)))
5b79dc93 365 return -1;
366
367 newpacket->lock = 1;
368
369 memcpy(newpacket->data, command_2, command_2_len);
9de3ca7e 370
371 /* This write over the dynamic parts of the byte block */
5b79dc93 372 aim_putsnac(newpacket->data, 0x0001, 0x0002, 0x0000, sess->snac_nextid);
9de3ca7e 373
5b79dc93 374 aim_tx_enqueue(sess, newpacket);
9de3ca7e 375
a25832e6 376 return (sess->snac_nextid++);
9de3ca7e 377}
378
379/*
9de3ca7e 380 * Request Rate Information.
381 *
9de3ca7e 382 */
5ac21963 383faim_export unsigned long aim_bos_reqrate(struct aim_session_t *sess,
384 struct aim_conn_t *conn)
9de3ca7e 385{
a25832e6 386 return aim_genericreq_n(sess, conn, 0x0001, 0x0006);
9de3ca7e 387}
388
389/*
9de3ca7e 390 * Rate Information Response Acknowledge.
391 *
392 */
5ac21963 393faim_export unsigned long aim_bos_ackrateresp(struct aim_session_t *sess,
394 struct aim_conn_t *conn)
9de3ca7e 395{
5b79dc93 396 struct command_tx_struct *newpacket;
c78446b5 397 int packlen = 20, i=0;
9de3ca7e 398
c78446b5 399 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen)))
400 return (sess->snac_nextid);
5b79dc93 401
402 newpacket->lock = 1;
9de3ca7e 403
c78446b5 404 i = aim_putsnac(newpacket->data, 0x0001, 0x0008, 0x0000, 0);
5b79dc93 405 i += aimutil_put16(newpacket->data+i, 0x0001);
406 i += aimutil_put16(newpacket->data+i, 0x0002);
407 i += aimutil_put16(newpacket->data+i, 0x0003);
408 i += aimutil_put16(newpacket->data+i, 0x0004);
c78446b5 409 i += aimutil_put16(newpacket->data+i, 0x0005);
5925849b 410
411 newpacket->commandlen = i;
412 newpacket->lock = 0;
413
5b79dc93 414 aim_tx_enqueue(sess, newpacket);
9de3ca7e 415
c78446b5 416 return (sess->snac_nextid);
9de3ca7e 417}
418
419/*
420 * aim_bos_setprivacyflags()
421 *
422 * Sets privacy flags. Normally 0x03.
423 *
424 * Bit 1: Allows other AIM users to see how long you've been idle.
98c88242 425 * Bit 2: Allows other AIM users to see how long you've been a member.
9de3ca7e 426 *
427 */
5ac21963 428faim_export unsigned long aim_bos_setprivacyflags(struct aim_session_t *sess,
429 struct aim_conn_t *conn,
430 u_long flags)
9de3ca7e 431{
a25832e6 432 return aim_genericreq_l(sess, conn, 0x0001, 0x0014, &flags);
9de3ca7e 433}
434
435/*
436 * aim_bos_reqpersonalinfo()
437 *
438 * Requests the current user's information. Can't go generic on this one
439 * because aparently it uses SNAC flags.
440 *
441 */
5ac21963 442faim_export unsigned long aim_bos_reqpersonalinfo(struct aim_session_t *sess,
443 struct aim_conn_t *conn)
9de3ca7e 444{
c78446b5 445 return aim_genericreq_n(sess, conn, 0x0001, 0x000e);
9de3ca7e 446}
447
5ac21963 448faim_export unsigned long aim_setversions(struct aim_session_t *sess,
449 struct aim_conn_t *conn)
01b59e1e 450{
5b79dc93 451 struct command_tx_struct *newpacket;
0c20631f 452 int i;
01b59e1e 453
c78446b5 454 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + (4*12))))
5b79dc93 455 return -1;
456
457 newpacket->lock = 1;
01b59e1e 458
5b79dc93 459 i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
01b59e1e 460
5b79dc93 461 i += aimutil_put16(newpacket->data+i, 0x0001);
462 i += aimutil_put16(newpacket->data+i, 0x0003);
26af6789 463
5b79dc93 464 i += aimutil_put16(newpacket->data+i, 0x0002);
465 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 466
5b79dc93 467 i += aimutil_put16(newpacket->data+i, 0x0003);
468 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 469
5b79dc93 470 i += aimutil_put16(newpacket->data+i, 0x0004);
471 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 472
5b79dc93 473 i += aimutil_put16(newpacket->data+i, 0x0006);
474 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 475
5b79dc93 476 i += aimutil_put16(newpacket->data+i, 0x0008);
477 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 478
5b79dc93 479 i += aimutil_put16(newpacket->data+i, 0x0009);
480 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 481
5b79dc93 482 i += aimutil_put16(newpacket->data+i, 0x000a);
483 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 484
5b79dc93 485 i += aimutil_put16(newpacket->data+i, 0x000b);
486 i += aimutil_put16(newpacket->data+i, 0x0002);
26af6789 487
5b79dc93 488 i += aimutil_put16(newpacket->data+i, 0x000c);
489 i += aimutil_put16(newpacket->data+i, 0x0001);
26af6789 490
c78446b5 491 i += aimutil_put16(newpacket->data+i, 0x0013);
492 i += aimutil_put16(newpacket->data+i, 0x0001);
493
5b79dc93 494 i += aimutil_put16(newpacket->data+i, 0x0015);
495 i += aimutil_put16(newpacket->data+i, 0x0001);
01b59e1e 496
497#if 0
5b79dc93 498 for (j = 0; j < 0x10; j++) {
499 i += aimutil_put16(newpacket->data+i, j); /* family */
500 i += aimutil_put16(newpacket->data+i, 0x0003); /* version */
501 }
01b59e1e 502#endif
5925849b 503
504 newpacket->commandlen = i;
5b79dc93 505 newpacket->lock = 0;
506 aim_tx_enqueue(sess, newpacket);
01b59e1e 507
508 return (sess->snac_nextid++);
509}
510
511
9de3ca7e 512/*
513 * aim_bos_reqservice(serviceid)
514 *
515 * Service request.
516 *
517 */
5ac21963 518faim_export unsigned long aim_bos_reqservice(struct aim_session_t *sess,
a25832e6 519 struct aim_conn_t *conn,
520 u_short serviceid)
9de3ca7e 521{
a25832e6 522 return aim_genericreq_s(sess, conn, 0x0001, 0x0004, &serviceid);
9de3ca7e 523}
524
f0a7908e 525/*
526 * aim_bos_nop()
527 *
528 * No-op. WinAIM sends these every 4min or so to keep
98c88242 529 * the connection alive. Its not real necessary.
f0a7908e 530 *
531 */
5ac21963 532faim_export unsigned long aim_bos_nop(struct aim_session_t *sess,
533 struct aim_conn_t *conn)
f0a7908e 534{
535 return aim_genericreq_n(sess, conn, 0x0001, 0x0016);
536}
537
44d6f2dc 538/*
539 * aim_flap_nop()
540 *
541 * No-op. WinAIM 4.x sends these _every minute_ to keep
542 * the connection alive.
543 */
544faim_export unsigned long aim_flap_nop(struct aim_session_t *sess,
545 struct aim_conn_t *conn)
546{
547 struct command_tx_struct *newpacket;
548
549 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0005, conn, 0)))
550 return sess->snac_nextid;
551
552 newpacket->lock = 1;
553 newpacket->commandlen = 0;
554 newpacket->lock = 0;
555
556 aim_tx_enqueue(sess, newpacket);
557
558 return (sess->snac_nextid);
559}
560
9de3ca7e 561/*
562 * aim_bos_reqrights()
563 *
564 * Request BOS rights.
565 *
566 */
5ac21963 567faim_export unsigned long aim_bos_reqrights(struct aim_session_t *sess,
568 struct aim_conn_t *conn)
9de3ca7e 569{
a25832e6 570 return aim_genericreq_n(sess, conn, 0x0009, 0x0002);
9de3ca7e 571}
572
573/*
574 * aim_bos_reqbuddyrights()
575 *
576 * Request Buddy List rights.
577 *
578 */
5ac21963 579faim_export unsigned long aim_bos_reqbuddyrights(struct aim_session_t *sess,
580 struct aim_conn_t *conn)
9de3ca7e 581{
a25832e6 582 return aim_genericreq_n(sess, conn, 0x0003, 0x0002);
9de3ca7e 583}
584
98c88242 585/*
586 * aim_send_warning(struct aim_session_t *sess,
587 * struct aim_conn_t *conn, char *destsn, int anon)
588 * send a warning to destsn.
589 * anon is anonymous or not;
590 * AIM_WARN_ANON anonymous
591 *
592 * returns -1 on error (couldn't alloc packet), next snacid on success.
593 *
594 */
5ac21963 595faim_export int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t *conn, char *destsn, int anon)
98c88242 596{
597 struct command_tx_struct *newpacket;
598 int curbyte;
599
600 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, strlen(destsn)+13)))
601 return -1;
602
603 newpacket->lock = 1;
604
605 curbyte = 0;
606 curbyte += aim_putsnac(newpacket->data+curbyte,
607 0x0004, 0x0008, 0x0000, sess->snac_nextid);
608
609 curbyte += aimutil_put16(newpacket->data+curbyte, (anon & AIM_WARN_ANON)?1:0);
610
611 curbyte += aimutil_put8(newpacket->data+curbyte, strlen(destsn));
612
613 curbyte += aimutil_putstr(newpacket->data+curbyte, destsn, strlen(destsn));
614
615 newpacket->commandlen = curbyte;
616 newpacket->lock = 0;
617
618 aim_tx_enqueue(sess, newpacket);
619
620 return (sess->snac_nextid++);
621}
622
e5012450 623/*
624 * aim_debugconn_sendconnect()
625 *
626 * For aimdebugd. If you don't know what it is, you don't want to.
627 */
5ac21963 628faim_export unsigned long aim_debugconn_sendconnect(struct aim_session_t *sess,
629 struct aim_conn_t *conn)
e5012450 630{
631 return aim_genericreq_n(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT);
632}
633
9de3ca7e 634/*
635 * Generic routine for sending commands.
636 *
637 *
638 * I know I can do this in a smarter way...but I'm not thinking straight
639 * right now...
640 *
641 * I had one big function that handled all three cases, but then it broke
642 * and I split it up into three. But then I fixed it. I just never went
643 * back to the single. I don't see any advantage to doing it either way.
644 *
645 */
5ac21963 646faim_internal unsigned long aim_genericreq_n(struct aim_session_t *sess,
647 struct aim_conn_t *conn,
648 u_short family, u_short subtype)
9de3ca7e 649{
5b79dc93 650 struct command_tx_struct *newpacket;
9de3ca7e 651
b69540e3 652 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10)))
5b79dc93 653 return 0;
9de3ca7e 654
5b79dc93 655 newpacket->lock = 1;
9de3ca7e 656
5b79dc93 657 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 658
5b79dc93 659 aim_tx_enqueue(sess, newpacket);
a25832e6 660 return (sess->snac_nextid++);
9de3ca7e 661}
662
663/*
664 *
665 *
666 */
5ac21963 667faim_internal unsigned long aim_genericreq_l(struct aim_session_t *sess,
668 struct aim_conn_t *conn,
669 u_short family, u_short subtype,
670 u_long *longdata)
9de3ca7e 671{
5b79dc93 672 struct command_tx_struct *newpacket;
9de3ca7e 673 u_long newlong;
674
675 /* If we don't have data, there's no reason to use this function */
676 if (!longdata)
a25832e6 677 return aim_genericreq_n(sess, conn, family, subtype);
9de3ca7e 678
b69540e3 679 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_long))))
5b79dc93 680 return -1;
9de3ca7e 681
5b79dc93 682 newpacket->lock = 1;
9de3ca7e 683
5b79dc93 684 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 685
686 /* copy in data */
687 newlong = htonl(*longdata);
5b79dc93 688 memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long));
9de3ca7e 689
5b79dc93 690 aim_tx_enqueue(sess, newpacket);
a25832e6 691 return (sess->snac_nextid++);
9de3ca7e 692}
693
5ac21963 694faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess,
695 struct aim_conn_t *conn,
696 u_short family, u_short subtype,
697 u_short *shortdata)
9de3ca7e 698{
5b79dc93 699 struct command_tx_struct *newpacket;
9de3ca7e 700 u_short newshort;
701
702 /* If we don't have data, there's no reason to use this function */
703 if (!shortdata)
a25832e6 704 return aim_genericreq_n(sess, conn, family, subtype);
9de3ca7e 705
b69540e3 706 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+sizeof(u_short))))
5b79dc93 707 return -1;
9de3ca7e 708
5b79dc93 709 newpacket->lock = 1;
9de3ca7e 710
5b79dc93 711 aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
9de3ca7e 712
713 /* copy in data */
714 newshort = htons(*shortdata);
5b79dc93 715 memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short));
9de3ca7e 716
5b79dc93 717 aim_tx_enqueue(sess, newpacket);
a25832e6 718 return (sess->snac_nextid++);
9de3ca7e 719}
720
721/*
722 * aim_bos_reqlocaterights()
723 *
724 * Request Location services rights.
725 *
726 */
5ac21963 727faim_export unsigned long aim_bos_reqlocaterights(struct aim_session_t *sess,
728 struct aim_conn_t *conn)
9de3ca7e 729{
a25832e6 730 return aim_genericreq_n(sess, conn, 0x0002, 0x0002);
9de3ca7e 731}
732
733/*
e88ba395 734* aim_bos_reqicbmparaminfo()
9de3ca7e 735 *
736 * Request ICBM parameter information.
737 *
738 */
5ac21963 739faim_export unsigned long aim_bos_reqicbmparaminfo(struct aim_session_t *sess,
740 struct aim_conn_t *conn)
9de3ca7e 741{
a25832e6 742 return aim_genericreq_n(sess, conn, 0x0004, 0x0004);
9de3ca7e 743}
e88ba395 744
c78446b5 745/*
746 * Add ICBM parameter? Huh?
747 */
5ac21963 748faim_export unsigned long aim_addicbmparam(struct aim_session_t *sess,
749 struct aim_conn_t *conn)
c78446b5 750{
751 struct command_tx_struct *newpacket;
752 int packlen = 10+16, i=0;
753
754 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen)))
755 return (sess->snac_nextid);
756
757 newpacket->lock = 1;
758
759 i = aim_putsnac(newpacket->data, 0x0004, 0x0002, 0x0000, sess->snac_nextid);
760 i += aimutil_put16(newpacket->data+i, 0x0000);
761 i += aimutil_put16(newpacket->data+i, 0x0000);
762 i += aimutil_put16(newpacket->data+i, 0x0003);
763 i += aimutil_put16(newpacket->data+i, 0x1f40);
764 i += aimutil_put16(newpacket->data+i, 0x03e7);
765 i += aimutil_put16(newpacket->data+i, 0x03e7);
766 i += aimutil_put16(newpacket->data+i, 0x0000);
767 i += aimutil_put16(newpacket->data+i, 0x0000);
768
769 aim_tx_enqueue(sess, newpacket);
770
771 return (sess->snac_nextid);
772}
f2d214f9 773
774/*
775 * Set directory profile data (not the same as aim_bos_setprofile!)
776 */
777faim_export unsigned long aim_setdirectoryinfo(struct aim_session_t *sess, struct aim_conn_t *conn, char *first, char *middle, char *last, char *maiden, char *nickname, char *street, char *city, char *state, char *zip, int country, unsigned short privacy)
778{
779 struct command_tx_struct *newpacket;
780 int packlen = 0, i = 0;
781
782 packlen += 2+2+2;
783
784 if(first) /* TLV 0001 */
785 packlen += (strlen(first) + 4);
786 if(middle)
787 packlen += (strlen(middle) + 4);
788 if(last)
789 packlen += (strlen(last) + 4);
790 if(maiden)
791 packlen += (strlen(maiden) + 4);
792 if(nickname)
793 packlen += (strlen(nickname) + 4);
794 if(street)
795 packlen += (strlen(street) + 4);
796 if(state)
797 packlen += (strlen(state) + 4);
798 if(city)
799 packlen += (strlen(city) + 4);
800 if(zip)
801 packlen += (strlen(zip) + 4);
802
803 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen+10)))
804 return -1;
805
806 newpacket->lock = 1;
807
808 i = aim_putsnac(newpacket->data, 0x0002, 0x0009, 0x0000, 0);
809
810 /* 000a/0002: privacy: 1 to allow search/disp, 0 to disallow */
811 i += aim_puttlv_16(newpacket->data+i, 0x000a, privacy);
812
813
814 if (first)
815 i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen(first), first);
816 if (middle)
817 i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen(middle), middle);
818 if (last)
819 i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(last), last);
820 if (maiden)
821 i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(maiden), maiden);
822 if (nickname)
823 i += aim_puttlv_str(newpacket->data+i, 0x000c, strlen(nickname), nickname);
824 if (street)
825 i += aim_puttlv_str(newpacket->data+i, 0x0021, strlen(street), street);
826 if (city)
827 i += aim_puttlv_str(newpacket->data+i, 0x0008, strlen(city), city);
828 if (state)
829 i += aim_puttlv_str(newpacket->data+i, 0x0007, strlen(state), state);
830 if (zip)
831 i += aim_puttlv_str(newpacket->data+i, 0x000d, strlen(zip), zip);
832
833 newpacket->commandlen = i;
834 newpacket->lock = 0;
835
836 aim_tx_enqueue(sess, newpacket);
837
838 return(sess->snac_nextid);
839}
840
841faim_export unsigned long aim_setuserinterests(struct aim_session_t *sess, struct aim_conn_t *conn, char *interest1, char *interest2, char *interest3, char *interest4, char *interest5, unsigned short privacy)
842{
843 struct command_tx_struct *newpacket;
844 int packlen = 0, i = 0;
845
846 packlen += 2+2+2;
847
848 if(interest1)
849 packlen += (strlen(interest1) + 4);
850 if(interest2)
851 packlen += (strlen(interest2) + 4);
852 if(interest3)
853 packlen += (strlen(interest3) + 4);
854 if(interest4)
855 packlen += (strlen(interest4) + 4);
856 if(interest5)
857 packlen += (strlen(interest5) + 4) ;
858
859
860 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen+10)))
861 return -1;
862
863 newpacket->lock = 1;
864
865 i = aim_putsnac(newpacket->data, 0x0002, 0x000f, 0x0000, 0);
866
867 /* 000a/0002: 0000 ?? ?privacy? */
868 i += aim_puttlv_16(newpacket->data+i, 0x000a, privacy);
869
870 if(interest1)
871 i += aim_puttlv_str(newpacket->data+i, 0x000b, strlen(interest1), interest1);
872 if(interest2)
873 i += aim_puttlv_str(newpacket->data+i, 0x000b, strlen(interest2), interest2);
874 if(interest3)
875 i += aim_puttlv_str(newpacket->data+i, 0x000b, strlen(interest3), interest3);
876 if(interest4)
877 i += aim_puttlv_str(newpacket->data+i, 0x000b, strlen(interest4), interest4);
878 if(interest5)
879 i += aim_puttlv_str(newpacket->data+i, 0x000b, strlen(interest1), interest5);
880
881 newpacket->commandlen = i;
882 newpacket->lock = 0;
883
884 aim_tx_enqueue(sess, newpacket);
885
886 return(sess->snac_nextid);
887}
ec6b8da8 888
889faim_export unsigned long aim_icq_setstatus(struct aim_session_t *sess,
890 struct aim_conn_t *conn,
891 unsigned long status)
892{
893 struct command_tx_struct *newpacket;
894 int i;
895 unsigned long data;
896
897 data = 0x00030000 | status; /* yay for error checking ;^) */
898
899 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + 4)))
900 return -1;
901
902 newpacket->lock = 1;
903
904 i = aim_putsnac(newpacket->data, 0x0001, 0x001e, 0x0000, 0x0000001e);
905 i += aim_puttlv_32(newpacket->data+i, 0x0006, data);
906
907 newpacket->commandlen = i;
908 newpacket->lock = 0;
909
910 aim_tx_enqueue(sess, newpacket);
911
912 return(sess->snac_nextid);
913}
This page took 3.035944 seconds and 5 git commands to generate.