- continue;
- }
-
- if (workingPtr->conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
- /* not possible */
- faimdprintf(sess, 0, "rxdispatch called on RENDEZVOUS_OUT connection!\n");
- workingPtr->handled = 1;
- continue;
- }
-
- if ((workingPtr->commandlen == 4) &&
- (aimutil_get32(workingPtr->data) == 0x00000001)) {
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
- continue;
- }
-
- if (workingPtr->hdr.oscar.type == 0x04) {
- workingPtr->handled = aim_negchan_middle(sess, workingPtr);
- continue;
- }
-
- family = aimutil_get16(workingPtr->data);
- subtype = aimutil_get16(workingPtr->data+2);
-
- if (family == 0x0001) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
- else if (subtype == 0x0005)
- workingPtr->handled = aim_handleredirect_middle(sess, workingPtr);
- else if (subtype == 0x0007)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
- else if (subtype == 0x000a)
- workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr);
- else if (subtype == 0x000f)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x000f, workingPtr);
- else if (subtype == 0x0010)
- workingPtr->handled = aim_parse_evilnotify_middle(sess, workingPtr);
- else if (subtype == 0x0013)
- workingPtr->handled = aim_parsemotd_middle(sess, workingPtr);
- else if (subtype == 0x0018)
- workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0xffff, workingPtr);
-
- } else if (family == 0x0002) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_locateerr(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0002, 0x0003, workingPtr);
- else if (subtype == 0x0006)
- workingPtr->handled = aim_parse_userinfo_middle(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOC, AIM_CB_LOC_DEFAULT, workingPtr);
-
- } else if (family == 0x0003) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_parse_buddyrights(sess, workingPtr);
- else if (subtype == 0x000b)
- workingPtr->handled = aim_parse_oncoming_middle(sess, workingPtr);
- else if (subtype == 0x000c)
- workingPtr->handled = aim_parse_offgoing_middle(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BUD, AIM_CB_BUD_DEFAULT, workingPtr);
-
- } else if (family == 0x0004) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_msgerror_middle(sess, workingPtr);
- else if (subtype == 0x0005)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0004, 0x0005, workingPtr);
- else if (subtype == 0x0006)
- workingPtr->handled = aim_parse_outgoing_im_middle(sess, workingPtr);
- else if (subtype == 0x0007)
- workingPtr->handled = aim_parse_incoming_im_middle(sess, workingPtr);
- else if (subtype == 0x000a)
- workingPtr->handled = aim_parse_missedcall(sess, workingPtr);
- else if (subtype == 0x000c)
- workingPtr->handled = aim_parse_msgack_middle(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_DEFAULT, workingPtr);
-
- } else if (family == 0x0007) {
-
- if (subtype == 0x0003)
- workingPtr->handled = aim_parse_infochange(sess, workingPtr);
- else if (subtype == 0x0005)
- workingPtr->handled = aim_parse_infochange(sess, workingPtr);
- else if (subtype == 0x0007)
- workingPtr->handled = aim_parse_accountconfirm(sess, workingPtr);
- break;
-
- } else if (family == 0x0009) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_parse_bosrights(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BOS, AIM_CB_BOS_DEFAULT, workingPtr);
-
- } else if (family == 0x000a) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_searcherror(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_parse_searchreply(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOK, AIM_CB_LOK_DEFAULT, workingPtr);
-
- } else if (family == 0x000b) {
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
- else if (subtype == 0x0002)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x000b, 0x0002, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_STS, AIM_CB_STS_DEFAULT, workingPtr);
-
- } else if (family == 0x000d) {
-
- if (subtype == 0x0009)
- workingPtr->handled = aim_chatnav_parse_info(sess, workingPtr);
-
- } else if (family == 0x000e) {
-
- if (subtype == 0x0002)
- workingPtr->handled = aim_chat_parse_infoupdate(sess, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_chat_parse_joined(sess, workingPtr);
- else if (subtype == 0x0004)
- workingPtr->handled = aim_chat_parse_leave(sess, workingPtr);
- else if (subtype == 0x0006)
- workingPtr->handled = aim_chat_parse_incoming(sess, workingPtr);
-
- } else if (family == 0x0013) {
-
- faimdprintf(sess, 0, "lalala: 0x%04x/0x%04x\n", family, subtype);
-
- } else if (family == 0x0017) { /* New login protocol */
-
- if (subtype == 0x0001)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0x0001, workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_authparse(sess, workingPtr);
- else if (subtype == 0x0007)
- workingPtr->handled = aim_authkeyparse(sess, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
-
- } else if (family == AIM_CB_FAM_SPECIAL) {
-
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
-
- }
-
- /* Try it raw and see if we can get it to happen... */
- if (!workingPtr->handled) /* XXX this is probably bad. */
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
-
- }
- }
-
- /*
- * This doesn't have to be called here. It could easily be done
- * by a seperate thread or something. It's an administrative operation,
- * and can take a while. Though the less you call it the less memory
- * you'll have :)
- */
- aim_purge_rxqueue(sess);
-
- return 0;