| 213 |
213 |
| 214 if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0)))) |
214 if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0)))) |
| 215 return -1; |
215 return -1; |
| 216 |
216 |
| 217 i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid); |
217 i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid); |
| 218 i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); |
218 i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); |
| 219 i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile); |
219 i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile); |
| 220 /* why do we send this twice? */ |
220 /* why do we send this twice? */ |
| 221 i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/x-aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); |
221 i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\""); |
| 222 |
222 |
| 223 /* Away message -- we send this no matter what, even if its blank */ |
223 /* Away message -- we send this no matter what, even if its blank */ |
| 224 if (awaymsg) |
224 if (awaymsg) |
| 225 i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg); |
225 i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg); |
| 226 else |
226 else |
| 235 |
235 |
| 236 newpacket->commandlen = i; |
236 newpacket->commandlen = i; |
| 237 aim_tx_enqueue(sess, newpacket); |
237 aim_tx_enqueue(sess, newpacket); |
| 238 |
238 |
| 239 return (sess->snac_nextid++); |
239 return (sess->snac_nextid++); |
| 240 } |
|
| 241 |
|
| 242 /* |
|
| 243 * aim_bos_setgroupperm(mask) |
|
| 244 * |
|
| 245 * Set group permisson mask. Normally 0x1f (all classes). |
|
| 246 * |
|
| 247 * The group permission mask allows you to keep users of a certain |
|
| 248 * class or classes from talking to you. The mask should be |
|
| 249 * a bitwise OR of all the user classes you want to see you. |
|
| 250 * |
|
| 251 */ |
|
| 252 faim_export unsigned long aim_bos_setgroupperm(struct aim_session_t *sess, |
|
| 253 struct aim_conn_t *conn, |
|
| 254 u_long mask) |
|
| 255 { |
|
| 256 return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask); |
|
| 257 } |
|
| 258 |
|
| 259 faim_internal int aim_parse_bosrights(struct aim_session_t *sess, |
|
| 260 struct command_rx_struct *command, ...) |
|
| 261 { |
|
| 262 rxcallback_t userfunc = NULL; |
|
| 263 int ret=1; |
|
| 264 struct aim_tlvlist_t *tlvlist; |
|
| 265 unsigned short maxpermits = 0, maxdenies = 0; |
|
| 266 |
|
| 267 /* |
|
| 268 * TLVs follow |
|
| 269 */ |
|
| 270 if (!(tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10))) |
|
| 271 return ret; |
|
| 272 |
|
| 273 /* |
|
| 274 * TLV type 0x0001: Maximum number of buddies on permit list. |
|
| 275 */ |
|
| 276 if (aim_gettlv(tlvlist, 0x0001, 1)) |
|
| 277 maxpermits = aim_gettlv16(tlvlist, 0x0001, 1); |
|
| 278 |
|
| 279 /* |
|
| 280 * TLV type 0x0002: Maximum number of buddies on deny list. |
|
| 281 * |
|
| 282 */ |
|
| 283 if (aim_gettlv(tlvlist, 0x0002, 1)) |
|
| 284 maxdenies = aim_gettlv16(tlvlist, 0x0002, 1); |
|
| 285 |
|
| 286 if ((userfunc = aim_callhandler(sess, command->conn, 0x0009, 0x0003))) |
|
| 287 ret = userfunc(sess, command, maxpermits, maxdenies); |
|
| 288 |
|
| 289 aim_freetlvchain(&tlvlist); |
|
| 290 |
|
| 291 return ret; |
|
| 292 } |
240 } |
| 293 |
241 |
| 294 /* |
242 /* |
| 295 * aim_bos_clientready() |
243 * aim_bos_clientready() |
| 296 * |
244 * |
| 411 struct aim_conn_t *conn) |
359 struct aim_conn_t *conn) |
| 412 { |
360 { |
| 413 struct command_tx_struct *newpacket; |
361 struct command_tx_struct *newpacket; |
| 414 int i; |
362 int i; |
| 415 |
363 |
| 416 if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10 + (4*12)))) |
364 if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 10 + (4*16)))) |
| 417 return -1; |
365 return -1; |
| 418 |
366 |
| 419 newpacket->lock = 1; |
367 newpacket->lock = 1; |
| 420 |
368 |
| 421 i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid); |
369 i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid); |
| 422 aim_cachesnac(sess, 0x0001, 0x0017, 0x0000, NULL, 0); |
370 aim_cachesnac(sess, 0x0001, 0x0017, 0x0000, NULL, 0); |
| 423 |
371 |
| 424 i += aimutil_put16(newpacket->data+i, 0x0001); |
372 i += aimutil_put16(newpacket->data+i, 0x0001); |
| 425 i += aimutil_put16(newpacket->data+i, 0x0003); |
373 i += aimutil_put16(newpacket->data+i, 0x0003); |
| 426 |
374 |
| |
375 i += aimutil_put16(newpacket->data+i, 0x0002); |
| |
376 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
377 |
| |
378 i += aimutil_put16(newpacket->data+i, 0x0003); |
| |
379 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
380 |
| |
381 i += aimutil_put16(newpacket->data+i, 0x0004); |
| |
382 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
383 |
| |
384 i += aimutil_put16(newpacket->data+i, 0x0006); |
| |
385 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
386 |
| |
387 i += aimutil_put16(newpacket->data+i, 0x0008); |
| |
388 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
389 |
| |
390 i += aimutil_put16(newpacket->data+i, 0x0009); |
| |
391 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
392 |
| |
393 i += aimutil_put16(newpacket->data+i, 0x000a); |
| |
394 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
395 |
| |
396 i += aimutil_put16(newpacket->data+i, 0x000b); |
| |
397 i += aimutil_put16(newpacket->data+i, 0x0002); |
| |
398 |
| |
399 i += aimutil_put16(newpacket->data+i, 0x000c); |
| |
400 i += aimutil_put16(newpacket->data+i, 0x0001); |
| |
401 |
| 427 i += aimutil_put16(newpacket->data+i, 0x0013); |
402 i += aimutil_put16(newpacket->data+i, 0x0013); |
| 428 i += aimutil_put16(newpacket->data+i, 0x0001); |
403 i += aimutil_put16(newpacket->data+i, 0x0001); |
| 429 |
404 |
| 430 i += aimutil_put16(newpacket->data+i, 0x0002); |
405 i += aimutil_put16(newpacket->data+i, 0x0015); |
| 431 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 432 |
|
| 433 i += aimutil_put16(newpacket->data+i, 0x0003); |
|
| 434 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 435 |
|
| 436 i += aimutil_put16(newpacket->data+i, 0x0004); |
|
| 437 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 438 |
|
| 439 i += aimutil_put16(newpacket->data+i, 0x0006); |
|
| 440 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 441 |
|
| 442 i += aimutil_put16(newpacket->data+i, 0x0008); |
|
| 443 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 444 |
|
| 445 i += aimutil_put16(newpacket->data+i, 0x0009); |
|
| 446 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 447 |
|
| 448 i += aimutil_put16(newpacket->data+i, 0x000a); |
|
| 449 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 450 |
|
| 451 i += aimutil_put16(newpacket->data+i, 0x000b); |
|
| 452 i += aimutil_put16(newpacket->data+i, 0x0001); |
|
| 453 |
|
| 454 i += aimutil_put16(newpacket->data+i, 0x000c); |
|
| 455 i += aimutil_put16(newpacket->data+i, 0x0001); |
406 i += aimutil_put16(newpacket->data+i, 0x0001); |
| 456 |
407 |
| 457 newpacket->commandlen = i; |
408 newpacket->commandlen = i; |
| 458 newpacket->lock = 0; |
409 newpacket->lock = 0; |
| 459 aim_tx_enqueue(sess, newpacket); |
410 aim_tx_enqueue(sess, newpacket); |
| 868 |
819 |
| 869 aim_tx_enqueue(sess, newpacket); |
820 aim_tx_enqueue(sess, newpacket); |
| 870 |
821 |
| 871 return(sess->snac_nextid); |
822 return(sess->snac_nextid); |
| 872 } |
823 } |
| |
824 |
| |
825 /* |
| |
826 * Should be generic enough to handle the errors for all families... |
| |
827 * |
| |
828 */ |
| |
829 static int generror(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen) |
| |
830 { |
| |
831 int ret = 0; |
| |
832 int error = 0; |
| |
833 rxcallback_t userfunc; |
| |
834 struct aim_snac_t *snac2; |
| |
835 |
| |
836 snac2 = aim_remsnac(sess, snac->id); |
| |
837 |
| |
838 if (datalen) |
| |
839 error = aimutil_get16(data); |
| |
840 |
| |
841 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| |
842 ret = userfunc(sess, rx, error, snac2?snac2->data:NULL); |
| |
843 |
| |
844 if (snac2) |
| |
845 free(snac2->data); |
| |
846 free(snac2); |
| |
847 |
| |
848 return ret; |
| |
849 } |
| |
850 |
| |
851 static int snachandler(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen) |
| |
852 { |
| |
853 |
| |
854 if (snac->subtype == 0x0001) |
| |
855 return generror(sess, mod, rx, snac, data, datalen); |
| |
856 else if ((snac->family == 0xffff) && (snac->subtype == 0xffff)) { |
| |
857 rxcallback_t userfunc; |
| |
858 |
| |
859 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| |
860 return userfunc(sess, rx); |
| |
861 } |
| |
862 |
| |
863 return 0; |
| |
864 } |
| |
865 |
| |
866 faim_internal int misc_modfirst(struct aim_session_t *sess, aim_module_t *mod) |
| |
867 { |
| |
868 |
| |
869 mod->family = 0xffff; |
| |
870 mod->version = 0x0000; |
| |
871 mod->flags = AIM_MODFLAG_MULTIFAMILY; |
| |
872 strncpy(mod->name, "misc", sizeof(mod->name)); |
| |
873 mod->snachandler = snachandler; |
| |
874 |
| |
875 return 0; |
| |
876 } |