| 499 { |
499 { |
| 500 int ret = 0; |
500 int ret = 0; |
| 501 aim_rxcallback_t userfunc; |
501 aim_rxcallback_t userfunc; |
| 502 aim_userinfo_t userinfo; |
502 aim_userinfo_t userinfo; |
| 503 |
503 |
| 504 aim_extractuserinfo(sess, bs, &userinfo); |
504 aim_info_extract(sess, bs, &userinfo); |
| 505 |
505 |
| 506 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
506 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| 507 ret = userfunc(sess, rx, &userinfo); |
507 ret = userfunc(sess, rx, &userinfo); |
| |
508 |
| |
509 aim_info_free(&userinfo); |
| 508 |
510 |
| 509 return ret; |
511 return ret; |
| 510 } |
512 } |
| 511 |
513 |
| 512 /* Subtype 0x0010 - Evil Notification */ |
514 /* Subtype 0x0010 - Evil Notification */ |
| 520 memset(&userinfo, 0, sizeof(aim_userinfo_t)); |
522 memset(&userinfo, 0, sizeof(aim_userinfo_t)); |
| 521 |
523 |
| 522 newevil = aimbs_get16(bs); |
524 newevil = aimbs_get16(bs); |
| 523 |
525 |
| 524 if (aim_bstream_empty(bs)) |
526 if (aim_bstream_empty(bs)) |
| 525 aim_extractuserinfo(sess, bs, &userinfo); |
527 aim_info_extract(sess, bs, &userinfo); |
| 526 |
528 |
| 527 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
529 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| 528 ret = userfunc(sess, rx, newevil, &userinfo); |
530 ret = userfunc(sess, rx, newevil, &userinfo); |
| |
531 |
| |
532 aim_info_free(&userinfo); |
| 529 |
533 |
| 530 return ret; |
534 return ret; |
| 531 } |
535 } |
| 532 |
536 |
| 533 /* |
537 /* |
| 934 } |
938 } |
| 935 |
939 |
| 936 aim_tx_enqueue(sess, fr); |
940 aim_tx_enqueue(sess, fr); |
| 937 |
941 |
| 938 return 0; |
942 return 0; |
| |
943 } |
| |
944 |
| |
945 /* |
| |
946 * Subtype 0x0021 - Receive our extended status |
| |
947 * |
| |
948 * This is used for MAC non-away "away" messages, and maybe ICQ extended status messages? |
| |
949 */ |
| |
950 static int aim_parse_extstatus(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| |
951 { |
| |
952 int ret = 0; |
| |
953 aim_rxcallback_t userfunc; |
| |
954 char *msg = NULL; |
| |
955 fu16_t id; |
| |
956 |
| |
957 aimbs_get16(bs); /* 0x0002 */ |
| |
958 aimbs_get16(bs); /* 0x0404 or 0x0407? Maybe 0x04 and then a length? */ |
| |
959 msg = aimbs_getstr(bs, aimbs_get16(bs)); |
| |
960 |
| |
961 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| |
962 ret = userfunc(sess, rx, msg); |
| |
963 |
| |
964 free(msg); |
| |
965 |
| |
966 return ret; |
| 939 } |
967 } |
| 940 |
968 |
| 941 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
969 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 942 { |
970 { |
| 943 |
971 |
| 963 return motd(sess, mod, rx, snac, bs); |
991 return motd(sess, mod, rx, snac, bs); |
| 964 else if (snac->subtype == 0x0018) |
992 else if (snac->subtype == 0x0018) |
| 965 return hostversions(sess, mod, rx, snac, bs); |
993 return hostversions(sess, mod, rx, snac, bs); |
| 966 else if (snac->subtype == 0x001f) |
994 else if (snac->subtype == 0x001f) |
| 967 return memrequest(sess, mod, rx, snac, bs); |
995 return memrequest(sess, mod, rx, snac, bs); |
| |
996 else if (snac->subtype == 0x0021) |
| |
997 return aim_parse_extstatus(sess, mod, rx, snac, bs); |
| 968 |
998 |
| 969 return 0; |
999 return 0; |
| 970 } |
1000 } |
| 971 |
1001 |
| 972 faim_internal int general_modfirst(aim_session_t *sess, aim_module_t *mod) |
1002 faim_internal int general_modfirst(aim_session_t *sess, aim_module_t *mod) |