X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/b69540e3cf15a403137cb89bbc36ef7450945f83..ee49b735a9cbcb7b15f86e0e3dc69118ba2a4607:/aim_buddylist.c diff --git a/aim_buddylist.c b/aim_buddylist.c index affdb3c..a9b9ef8 100644 --- a/aim_buddylist.c +++ b/aim_buddylist.c @@ -7,9 +7,9 @@ * Adds a single buddy to your buddy list after login. * */ -u_long aim_add_buddy(struct aim_session_t *sess, - struct aim_conn_t *conn, - char *sn ) +faim_export unsigned long aim_add_buddy(struct aim_session_t *sess, + struct aim_conn_t *conn, + char *sn ) { struct command_tx_struct *newpacket; int i; @@ -28,26 +28,14 @@ u_long aim_add_buddy(struct aim_session_t *sess, aim_tx_enqueue(sess, newpacket ); - { - struct aim_snac_t snac; - - snac.id = sess->snac_nextid; - snac.family = 0x0003; - snac.type = 0x0004; - snac.flags = 0x0000; + aim_cachesnac(sess, 0x0003, 0x0004, 0x0000, sn, strlen(sn)+1); - snac.data = malloc( strlen( sn ) + 1 ); - memcpy( snac.data, sn, strlen( sn ) + 1 ); - - aim_newsnac(sess, &snac); - } - - return( sess->snac_nextid++ ); + return sess->snac_nextid; } -u_long aim_remove_buddy(struct aim_session_t *sess, - struct aim_conn_t *conn, - char *sn ) +faim_export unsigned long aim_remove_buddy(struct aim_session_t *sess, + struct aim_conn_t *conn, + char *sn ) { struct command_tx_struct *newpacket; int i; @@ -67,20 +55,44 @@ u_long aim_remove_buddy(struct aim_session_t *sess, aim_tx_enqueue(sess, newpacket); - { - struct aim_snac_t snac; - - snac.id = sess->snac_nextid; - snac.family = 0x0003; - snac.type = 0x0005; - snac.flags = 0x0000; - - snac.data = malloc( strlen( sn ) + 1 ); - memcpy( snac.data, sn, strlen( sn ) + 1 ); + aim_cachesnac(sess, 0x0003, 0x0005, 0x0000, sn, strlen(sn)+1); - aim_newsnac(sess, &snac ); - } - - return( sess->snac_nextid++ ); + return sess->snac_nextid; } +faim_internal int aim_parse_buddyrights(struct aim_session_t *sess, + struct command_rx_struct *command, ...) +{ + rxcallback_t userfunc = NULL; + int ret=1; + struct aim_tlvlist_t *tlvlist; + unsigned short maxbuddies = 0, maxwatchers = 0; + + /* + * TLVs follow + */ + if (!(tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10))) + return ret; + + /* + * TLV type 0x0001: Maximum number of buddies. + */ + if (aim_gettlv(tlvlist, 0x0001, 1)) + maxbuddies = aim_gettlv16(tlvlist, 0x0001, 1); + + /* + * TLV type 0x0002: Maximum number of watchers. + * + * XXX: what the hell is a watcher? + * + */ + if (aim_gettlv(tlvlist, 0x0002, 1)) + maxwatchers = aim_gettlv16(tlvlist, 0x0002, 1); + + if ((userfunc = aim_callhandler(command->conn, 0x0003, 0x0003))) + ret = userfunc(sess, command, maxbuddies, maxwatchers); + + aim_freetlvchain(&tlvlist); + + return ret; +}