+ switch(command->conn->type) {
+ case AIM_CONN_TYPE_BOS: {
+ /* this is the new buddy list */
+ char buddies[] = "Buddy1&Buddy2&ThisHereIsAName2&midendian&ewarmenhoven&";
+ /* this is the new profile */
+ char profile[] = "Hello";
+
+ 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_reqbuddyrights(sess, command->conn);
+
+ /* send the buddy list and profile (required, even if empty) */
+ aim_bos_setbuddylist(sess, command->conn, buddies);
+
+ /* dont really know what this does */
+ aim_addicbmparam(sess, command->conn);
+ aim_bos_reqicbmparaminfo(sess, command->conn);
+
+ aim_bos_reqrights(sess, command->conn);
+ /* set group permissions -- all user classes */
+ aim_bos_setgroupperm(sess, command->conn, AIM_FLAG_ALLUSERS);
+ aim_bos_setprivacyflags(sess, command->conn, AIM_PRIVFLAGS_ALLOWIDLE|AIM_PRIVFLAGS_ALLOWMEMBERSINCE);
+
+ break;
+ }
+
+ default:
+ printf("faimtest: got rate response for unhandled connection type %04x\n", command->conn->type);
+ break;
+ }
+
+ return 1;
+}
+
+int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ int vercount, i;
+ unsigned char *versions;
+ va_list ap;
+
+ va_start(ap, command);
+ vercount = va_arg(ap, int); /* number of family/version pairs */
+ versions = va_arg(ap, unsigned char *);
+ va_end(ap);
+
+ printf("faimtest: SNAC versions supported by this host: ");
+ for (i = 0; i < vercount*4; i += 4)
+ printf("0x%04x:0x%04x ",
+ aimutil_get16(versions+i), /* SNAC family */
+ aimutil_get16(versions+i+2) /* Version number */);
+ printf("\n");
+
+ return 1;
+}
+
+int faimtest_serverready(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ int famcount, i;
+ unsigned short *families;
+ va_list ap;
+
+ va_start(ap, command);
+ famcount = va_arg(ap, int);
+ families = va_arg(ap, unsigned short *);
+ va_end(ap);
+
+ printf("faimtest: SNAC families supported by this host (type %d): ", command->conn->type);
+ for (i = 0; i < famcount; i++)
+ printf("0x%04x ", families[i]);
+ printf("\n");
+
+ switch (command->conn->type) {
+ case AIM_CONN_TYPE_BOS:
+
+ aim_setversions(sess, command->conn);
+ aim_bos_reqrate(sess, command->conn); /* request rate info */
+
+ fprintf(stderr, "faimtest: done with BOS ServerReady\n");
+ break;
+
+ case AIM_CONN_TYPE_CHATNAV:
+ fprintf(stderr, "faimtest: chatnav: got server ready\n");
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0);
+ aim_bos_reqrate(sess, command->conn);
+ aim_bos_ackrateresp(sess, command->conn);
+ aim_chatnav_clientready(sess, command->conn);
+ aim_chatnav_reqrights(sess, command->conn);
+
+ break;
+
+ case AIM_CONN_TYPE_CHAT:
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0);
+ aim_bos_reqrate(sess, command->conn);
+ aim_bos_ackrateresp(sess, command->conn);
+ aim_chat_clientready(sess, command->conn);
+ break;
+
+ case AIM_CONN_TYPE_RENDEZVOUS: /* empty */
+ break;
+
+ default:
+ fprintf(stderr, "faimtest: unknown connection type on Server Ready\n");
+ }
+
+ return 1;
+}
+
+int faimtest_parse_buddyrights(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ va_list ap;
+ unsigned short maxbuddies, maxwatchers;
+
+ va_start(ap, command);
+ maxbuddies = va_arg(ap, int);
+ maxwatchers = va_arg(ap, int);
+ va_end(ap);
+
+ printf("faimtest: buddy list rights: Max buddies = %d / Max watchers = %d\n", maxbuddies, maxwatchers);
+
+ return 1;
+}
+
+int faimtest_bosrights(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ unsigned short maxpermits, maxdenies;
+ va_list ap;
+
+ va_start(ap, command);
+ maxpermits = va_arg(ap, int);
+ maxdenies = va_arg(ap, int);
+ va_end(ap);
+
+ printf("faimtest: BOS rights: Max permit = %d / Max deny = %d\n", maxpermits, maxdenies);
+
+ aim_bos_clientready(sess, command->conn);
+
+ printf("faimtest: officially connected to BOS.\n");
+