libfaim/misc.c

changeset 1649
f1e75c7ad28c
parent 1535
b118fbab0556
child 1839
8ccb8f83aaab
equal deleted inserted replaced
1648:f33239360f10 1649:f1e75c7ad28c
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 }

mercurial