| 387 * |
387 * |
| 388 * SNAC 000e/0002 |
388 * SNAC 000e/0002 |
| 389 */ |
389 */ |
| 390 static int infoupdate(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
390 static int infoupdate(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 391 { |
391 { |
| 392 struct aim_userinfo_s *userinfo = NULL; |
392 aim_userinfo_t *userinfo = NULL; |
| 393 aim_rxcallback_t userfunc; |
393 aim_rxcallback_t userfunc; |
| 394 int ret = 0; |
394 int ret = 0; |
| 395 int usercount = 0; |
395 int usercount = 0; |
| 396 fu8_t detaillevel = 0; |
396 fu8_t detaillevel = 0; |
| 397 char *roomname = NULL; |
397 char *roomname = NULL; |
| 441 aim_bstream_t occbs; |
441 aim_bstream_t occbs; |
| 442 |
442 |
| 443 tmptlv = aim_gettlv(tlvlist, 0x0073, 1); |
443 tmptlv = aim_gettlv(tlvlist, 0x0073, 1); |
| 444 |
444 |
| 445 /* Allocate enough userinfo structs for all occupants */ |
445 /* Allocate enough userinfo structs for all occupants */ |
| 446 userinfo = calloc(usercount, sizeof(struct aim_userinfo_s)); |
446 userinfo = calloc(usercount, sizeof(aim_userinfo_t)); |
| 447 |
447 |
| 448 aim_bstream_init(&occbs, tmptlv->value, tmptlv->length); |
448 aim_bstream_init(&occbs, tmptlv->value, tmptlv->length); |
| 449 |
449 |
| 450 while (curoccupant < usercount) |
450 while (curoccupant < usercount) |
| 451 aim_extractuserinfo(sess, &occbs, &userinfo[curoccupant++]); |
451 aim_extractuserinfo(sess, &occbs, &userinfo[curoccupant++]); |
| 549 return ret; |
549 return ret; |
| 550 } |
550 } |
| 551 |
551 |
| 552 static int userlistchange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
552 static int userlistchange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 553 { |
553 { |
| 554 struct aim_userinfo_s *userinfo = NULL; |
554 aim_userinfo_t *userinfo = NULL; |
| 555 aim_rxcallback_t userfunc; |
555 aim_rxcallback_t userfunc; |
| 556 int curcount = 0, ret = 0; |
556 int curcount = 0, ret = 0; |
| 557 |
557 |
| 558 while (aim_bstream_empty(bs)) { |
558 while (aim_bstream_empty(bs)) { |
| 559 curcount++; |
559 curcount++; |
| 560 userinfo = realloc(userinfo, curcount * sizeof(struct aim_userinfo_s)); |
560 userinfo = realloc(userinfo, curcount * sizeof(aim_userinfo_t)); |
| 561 aim_extractuserinfo(sess, bs, &userinfo[curcount-1]); |
561 aim_extractuserinfo(sess, bs, &userinfo[curcount-1]); |
| 562 } |
562 } |
| 563 |
563 |
| 564 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
564 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| 565 ret = userfunc(sess, rx, curcount, userinfo); |
565 ret = userfunc(sess, rx, curcount, userinfo); |
| 592 * possibly others |
592 * possibly others |
| 593 * |
593 * |
| 594 */ |
594 */ |
| 595 static int incomingmsg(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
595 static int incomingmsg(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 596 { |
596 { |
| 597 struct aim_userinfo_s userinfo; |
597 aim_userinfo_t userinfo; |
| 598 aim_rxcallback_t userfunc; |
598 aim_rxcallback_t userfunc; |
| 599 int ret = 0; |
599 int ret = 0; |
| 600 fu8_t *cookie; |
600 fu8_t *cookie; |
| 601 fu16_t channel; |
601 fu16_t channel; |
| 602 aim_tlvlist_t *otl; |
602 aim_tlvlist_t *otl; |
| 603 char *msg = NULL; |
603 char *msg = NULL; |
| 604 aim_msgcookie_t *ck; |
604 aim_msgcookie_t *ck; |
| 605 |
605 |
| 606 memset(&userinfo, 0, sizeof(struct aim_userinfo_s)); |
606 memset(&userinfo, 0, sizeof(aim_userinfo_t)); |
| 607 |
607 |
| 608 /* |
608 /* |
| 609 * ICBM Cookie. Uncache it. |
609 * ICBM Cookie. Uncache it. |
| 610 */ |
610 */ |
| 611 cookie = aimbs_getraw(bs, 8); |
611 cookie = aimbs_getraw(bs, 8); |