X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/96f8b1edd2c6bb991cb4fec0a5bef6570ceb502f..fd0b7da6fe45e0a7a9f81621cfa4293b79f17d86:/aim_info.c diff --git a/aim_info.c b/aim_info.c index fcf1195..0abbcf5 100644 --- a/aim_info.c +++ b/aim_info.c @@ -14,10 +14,10 @@ struct aim_priv_inforeq { unsigned short infotype; }; -u_long aim_getinfo(struct aim_session_t *sess, - struct aim_conn_t *conn, - const char *sn, - unsigned short infotype) +faim_export unsigned long aim_getinfo(struct aim_session_t *sess, + struct aim_conn_t *conn, + const char *sn, + unsigned short infotype) { struct command_tx_struct *newpacket; int i = 0; @@ -57,8 +57,8 @@ u_long aim_getinfo(struct aim_session_t *sess, return (sess->snac_nextid++); } -int aim_parse_locateerr(struct aim_session_t *sess, - struct command_rx_struct *command) +faim_internal int aim_parse_locateerr(struct aim_session_t *sess, + struct command_rx_struct *command) { u_long snacid = 0x000000000; struct aim_snac_t *snac = NULL; @@ -131,7 +131,7 @@ u_char aim_caps[6][16] = { 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} }; -u_short aim_getcap(unsigned char *capblock, int buflen) +faim_internal unsigned short aim_getcap(unsigned char *capblock, int buflen) { u_short ret = 0; int y; @@ -156,7 +156,7 @@ u_short aim_getcap(unsigned char *capblock, int buflen) return ret; } -int aim_putcap(unsigned char *capblock, int buflen, u_short caps) +faim_internal int aim_putcap(unsigned char *capblock, int buflen, u_short caps) { int offset = 0; @@ -195,7 +195,7 @@ int aim_putcap(unsigned char *capblock, int buflen, u_short caps) * AIM is fairly regular about providing user info. This * is a generic routine to extract it in its standard form. */ -int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) +faim_internal int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) { int i = 0; int tlvcnt = 0; @@ -259,7 +259,7 @@ int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) break; /* - * Type = 0x0001: Member Class. + * Type = 0x0001: User flags * * Specified as any of the following bitwise ORed together: * 0x0001 Trial (user less than 60days) @@ -277,7 +277,7 @@ int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) case 0x0001: if (tlv1) /* use only the first */ break; - outinfo->class = aimutil_get16(&buf[i+4]); + outinfo->flags = aimutil_get16(&buf[i+4]); tlv1++; break; @@ -313,6 +313,37 @@ int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) outinfo->idletime = aimutil_get16(&buf[i+4]); break; + /* + * Type = 0x0006: ICQ Online Status + * + * ICQ's Away/DND/etc "enriched" status + * Some decoding of values done by Scott + */ + case 0x0006: + outinfo->icqinfo.status = aimutil_get16(buf+i+2+2+2); + break; + + + /* + * Type = 0x000a + * + * ICQ User IP Address. + * Ahh, the joy of ICQ security. + */ + case 0x000a: + outinfo->icqinfo.ipaddr = aimutil_get32(&buf[i+4]); + break; + + /* Type = 0x000c + * + * random crap containing the IP address, + * apparently a port number, and some Other Stuff. + * + */ + case 0x000c: + memcpy(outinfo->icqinfo.crap, &buf[i+4], 0x25); + break; + /* * Type = 0x000d * @@ -421,8 +452,8 @@ int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinfo) * through aim_extractuserinfo() however. * */ -int aim_parse_oncoming_middle(struct aim_session_t *sess, - struct command_rx_struct *command) +faim_internal int aim_parse_oncoming_middle(struct aim_session_t *sess, + struct command_rx_struct *command) { struct aim_userinfo_s userinfo; u_int i = 0; @@ -443,14 +474,14 @@ int aim_parse_oncoming_middle(struct aim_session_t *sess, * information other than the name it applies to. * */ -int aim_parse_offgoing_middle(struct aim_session_t *sess, - struct command_rx_struct *command) +faim_internal int aim_parse_offgoing_middle(struct aim_session_t *sess, + struct command_rx_struct *command) { char sn[MAXSNLEN+1]; u_int i = 0; rxcallback_t userfunc=NULL; - strncpy(sn, command->data+11, (int)command->data[10]); + strncpy(sn, (char *)command->data+11, (int)command->data[10]); sn[(int)command->data[10]] = '\0'; userfunc = aim_callhandler(command->conn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING); @@ -465,8 +496,8 @@ int aim_parse_offgoing_middle(struct aim_session_t *sess, * the higher-level callback (in the user app). * */ -int aim_parse_userinfo_middle(struct aim_session_t *sess, - struct command_rx_struct *command) +faim_internal int aim_parse_userinfo_middle(struct aim_session_t *sess, + struct command_rx_struct *command) { struct aim_userinfo_s userinfo; char *text_encoding = NULL; @@ -548,9 +579,9 @@ int aim_parse_userinfo_middle(struct aim_session_t *sess, /* * Inverse of aim_extractuserinfo() */ -int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info) +faim_internal int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info) { - int i = 0; + int i = 0, numtlv = 0; struct aim_tlvlist_t *tlvlist = NULL; if (!buf || !info) @@ -561,22 +592,40 @@ int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info) i += aimutil_put16(buf+i, info->warnlevel); - /* XXX: we only put down five */ - i += aimutil_put16(buf+i, 5); - aim_addtlvtochain16(&tlvlist, 0x0001, info->class); + + aim_addtlvtochain16(&tlvlist, 0x0001, info->flags); + numtlv++; + aim_addtlvtochain32(&tlvlist, 0x0002, info->membersince); + numtlv++; + aim_addtlvtochain32(&tlvlist, 0x0003, info->onlinesince); + numtlv++; + aim_addtlvtochain16(&tlvlist, 0x0004, info->idletime); - /* XXX: should put caps here */ - aim_addtlvtochain32(&tlvlist, (info->class)&AIM_CLASS_AOL?0x0010:0x000f, info->sessionlen); - - i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); + numtlv++; + +#if ICQ_OSCAR_SUPPORT + if(atoi(info->sn) != 0) { + aim_addtlvtochain16(&tlvlist, 0x0006, info->icqinfo.status); + aim_addtlvtochain32(&tlvlist, 0x000a, info->icqinfo.ipaddr); + } +#endif + + aim_addtlvtochain_caps(&tlvlist, 0x000d, info->capabilities); + numtlv++; + + aim_addtlvtochain32(&tlvlist, (unsigned short)((info->flags)&AIM_FLAG_AOL?0x0010:0x000f), info->sessionlen); + numtlv++; + + i += aimutil_put16(buf+i, numtlv); /* tlvcount */ + i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); /* tlvs */ aim_freetlvchain(&tlvlist); - + return i; } -int aim_sendbuddyoncoming(struct aim_session_t *sess, struct aim_conn_t *conn, struct aim_userinfo_s *info) +faim_export int aim_sendbuddyoncoming(struct aim_session_t *sess, struct aim_conn_t *conn, struct aim_userinfo_s *info) { struct command_tx_struct *tx; int i = 0; @@ -604,7 +653,7 @@ int aim_sendbuddyoncoming(struct aim_session_t *sess, struct aim_conn_t *conn, s return 0; } -int aim_sendbuddyoffgoing(struct aim_session_t *sess, struct aim_conn_t *conn, char *sn) +faim_export int aim_sendbuddyoffgoing(struct aim_session_t *sess, struct aim_conn_t *conn, char *sn) { struct command_tx_struct *tx; int i = 0;