X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/9c38f1a7229568e6845e93d50a499bcb8fd560c0..b8c79ca7b4152e23512fe24eeef52ae3d4cda417:/aim_info.c diff --git a/aim_info.c b/aim_info.c index 0abbcf5..1eb31b1 100644 --- a/aim_info.c +++ b/aim_info.c @@ -6,11 +6,11 @@ * */ - +#define FAIM_INTERNAL #include struct aim_priv_inforeq { - char sn[MAXSNLEN]; + char sn[MAXSNLEN+1]; unsigned short infotype; }; @@ -20,6 +20,7 @@ faim_export unsigned long aim_getinfo(struct aim_session_t *sess, unsigned short infotype) { struct command_tx_struct *newpacket; + struct aim_priv_inforeq privdata; int i = 0; if (!sess || !conn || !sn) @@ -39,22 +40,11 @@ faim_export unsigned long aim_getinfo(struct aim_session_t *sess, newpacket->lock = 0; aim_tx_enqueue(sess, newpacket); - { - struct aim_snac_t snac; - - snac.id = sess->snac_nextid; - snac.family = 0x0002; - snac.type = 0x0005; - snac.flags = 0x0000; + strncpy(privdata.sn, sn, sizeof(privdata.sn)); + privdata.infotype = infotype; + aim_cachesnac(sess, 0x0002, 0x0005, 0x0000, &privdata, sizeof(struct aim_priv_inforeq)); - snac.data = malloc(sizeof(struct aim_priv_inforeq)); - strcpy(((struct aim_priv_inforeq *)snac.data)->sn, sn); - ((struct aim_priv_inforeq *)snac.data)->infotype = infotype; - - aim_newsnac(sess, &snac); - } - - return (sess->snac_nextid++); + return sess->snac_nextid; } faim_internal int aim_parse_locateerr(struct aim_session_t *sess, @@ -104,7 +94,7 @@ faim_internal int aim_parse_locateerr(struct aim_session_t *sess, /* * Capability blocks. */ -u_char aim_caps[6][16] = { +u_char aim_caps[8][16] = { /* Buddy icon */ {0x09, 0x46, 0x13, 0x46, 0x4c, 0x7f, 0x11, 0xd1, @@ -128,7 +118,15 @@ u_char aim_caps[6][16] = { /* Send file */ {0x09, 0x46, 0x13, 0x43, 0x4c, 0x7f, 0x11, 0xd1, - 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}, + + /* Saves stock portfolios */ + {0x09, 0x46, 0x13, 0x47, 0x4c, 0x7f, 0x11, 0xd1, + 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}, + + /* Games */ + {0x09, 0x46, 0x13, 0x4a, 0x4c, 0x7f, 0x11, 0xd1, + 0x22, 0x82, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}, }; faim_internal unsigned short aim_getcap(unsigned char *capblock, int buflen) @@ -136,21 +134,29 @@ faim_internal unsigned short aim_getcap(unsigned char *capblock, int buflen) u_short ret = 0; int y; int offset = 0; + int identified; while (offset < buflen) { + identified = 0; for(y=0; y < (sizeof(aim_caps)/0x10); y++) { if (memcmp(&aim_caps[y], capblock+offset, 0x10) == 0) { switch(y) { - case 0: ret |= AIM_CAPS_BUDDYICON; break; - case 1: ret |= AIM_CAPS_VOICE; break; - case 2: ret |= AIM_CAPS_IMIMAGE; break; - case 3: ret |= AIM_CAPS_CHAT; break; - case 4: ret |= AIM_CAPS_GETFILE; break; - case 5: ret |= AIM_CAPS_SENDFILE; break; - default: ret |= 0xff00; break; + case 0: ret |= AIM_CAPS_BUDDYICON; identified++; break; + case 1: ret |= AIM_CAPS_VOICE; identified++; break; + case 2: ret |= AIM_CAPS_IMIMAGE; identified++; break; + case 3: ret |= AIM_CAPS_CHAT; identified++; break; + case 4: ret |= AIM_CAPS_GETFILE; identified++; break; + case 5: ret |= AIM_CAPS_SENDFILE; identified++; break; + case 6: ret |= AIM_CAPS_GAMES; identified++; break; + case 7: ret |= AIM_CAPS_SAVESTOCKS; identified++; break; } } } + if (!identified) { + printf("faim: unknown capability!\n"); + ret |= 0xff00; + } + offset += 0x10; } return ret; @@ -187,6 +193,14 @@ faim_internal int aim_putcap(unsigned char *capblock, int buflen, u_short caps) memcpy(capblock+offset, aim_caps[5], sizeof(aim_caps[5])); offset += sizeof(aim_caps[5]); } + if ((caps & AIM_CAPS_GAMES) && (offset < buflen)) { + memcpy(capblock+offset, aim_caps[6], sizeof(aim_caps[6])); + offset += sizeof(aim_caps[6]); + } + if ((caps & AIM_CAPS_SAVESTOCKS) && (offset < buflen)) { + memcpy(capblock+offset, aim_caps[7], sizeof(aim_caps[7])); + offset += sizeof(aim_caps[7]); + } return offset; }