/*
* Capability blocks.
*/
-u_char aim_caps[6][16] = {
+u_char aim_caps[8][16] = {
/* Buddy icon */
{0x09, 0x46, 0x13, 0x46, 0x4c, 0x7f, 0x11, 0xd1,
/* 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)
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;
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;
}
aim_bos_ackrateresp(sess, command->conn); /* ack rate info response */
aim_bos_reqpersonalinfo(sess, command->conn);
aim_bos_reqlocaterights(sess, command->conn);
- aim_bos_setprofile(sess, command->conn, profile, NULL, AIM_CAPS_BUDDYICON | AIM_CAPS_CHAT | AIM_CAPS_VOICE | AIM_CAPS_GETFILE | AIM_CAPS_SENDFILE | AIM_CAPS_IMIMAGE);
+ aim_bos_setprofile(sess, command->conn, profile, NULL, AIM_CAPS_BUDDYICON | AIM_CAPS_CHAT | AIM_CAPS_VOICE | AIM_CAPS_GETFILE | AIM_CAPS_SENDFILE | AIM_CAPS_IMIMAGE | AIM_CAPS_GAMES | AIM_CAPS_SAVESTOCKS);
aim_bos_reqbuddyrights(sess, command->conn);
/* send the buddy list and profile (required, even if empty) */