- if (aim_queue_incoming == NULL)
- /* this shouldn't really happen, unless the main loop's select is broke */
- printf("parse_generic: incoming packet queue empty.\n");
- else
- {
- workingPtr = aim_queue_incoming;
- for (i = 0; workingPtr != NULL; i++)
- {
- switch(workingPtr->conn->type)
- {
- case AIM_CONN_TYPE_AUTH:
- if ( (workingPtr->data[0] == 0x00) &&
- (workingPtr->data[1] == 0x00) &&
- (workingPtr->data[2] == 0x00) &&
- (workingPtr->data[3] == 0x01) )
- {
-#if debug > 0
- printf("got connection ack on auth line\n");
-#endif
- workingPtr->handled = 1;
- }
- else
- {
- /* any user callbacks will be called from here */
- workingPtr->handled = aim_authparse(workingPtr);
- }
- break;
- case AIM_CONN_TYPE_BOS:
- {
- u_short family;
- u_short subtype;
- family = (workingPtr->data[0] << 8) + workingPtr->data[1];
- subtype = (workingPtr->data[2] << 8) + workingPtr->data[3];
- switch (family)
- {
- case 0x0000: /* not really a family, but it works */
- if (subtype == 0x0001)
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0000, 0x0001, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
- break;
- case 0x0001: /* Family: General */
- switch (subtype)
- {
- case 0x0001:
- workingPtr->handled = aim_parse_generalerrs(workingPtr);
- break;
- case 0x0003:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0001, 0x0003, workingPtr);
- break;
- case 0x0005:
- workingPtr->handled = aim_handleredirect_middle(workingPtr);
- break;
- case 0x0007:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0001, 0x0007, workingPtr);
- break;
- case 0x000a:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0001, 0x000a, workingPtr);
- break;
- case 0x000f:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0001, 0x000f, workingPtr);
- break;
- case 0x0013:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0001, 0x0013, workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_GEN, AIM_CB_GEN_DEFAULT, workingPtr);
- }
- break;
- case 0x0002: /* Family: Location */
- switch (subtype)
- {
- case 0x0001:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0002, 0x0001, workingPtr);
- break;
- case 0x0003:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0002, 0x0003, workingPtr);
- break;
- case 0x0006:
- workingPtr->handled = aim_parse_userinfo_middle(workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_LOC, AIM_CB_LOC_DEFAULT, workingPtr);
- }
- break;
- case 0x0003: /* Family: Buddy List */
- switch (subtype)
- {
- case 0x0001:
- workingPtr->handled = aim_parse_generalerrs(workingPtr);
- break;
- case 0x0003:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0003, 0x0003, workingPtr);
- break;
- case 0x000b: /* oncoming buddy */
- workingPtr->handled = aim_parse_oncoming_middle(workingPtr);
- break;
- case 0x000c: /* offgoing buddy */
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0003, 0x000c, workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_BUD, AIM_CB_BUD_DEFAULT, workingPtr);
- }
- break;
- case 0x0004: /* Family: Messeging */
- switch (subtype)
- {
- case 0x0001:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0004, 0x0001, workingPtr);
- break;
- case 0x0005:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0004, 0x0005, workingPtr);
- break;
- case 0x0007:
- workingPtr->handled = aim_parse_incoming_im_middle(workingPtr);
- break;
- case 0x000a:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0004, 0x000a, workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_DEFAULT, workingPtr);
- }
- break;
- case 0x0009:
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(workingPtr);
- else if (subtype == 0x0003)
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x0009, 0x0003, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_BOS, AIM_CB_BOS_DEFAULT, workingPtr);
- break;
- case 0x000a: /* Family: User lookup */
- switch (subtype)
- {
- case 0x0001:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x000a, 0x0001, workingPtr);
- break;
- case 0x0003:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x000a, 0x0003, workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_LOK, AIM_CB_LOK_DEFAULT, workingPtr);
- }
- break;
- case 0x000b:
- if (subtype == 0x0001)
- workingPtr->handled = aim_parse_generalerrs(workingPtr);
- else if (subtype == 0x0002)
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, 0x000b, 0x0002, workingPtr);
- else
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_STS, AIM_CB_STS_DEFAULT, workingPtr);
- break;
- default:
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
- break;
- }
- }
- break;
- case AIM_CONN_TYPE_CHATNAV:
- {
- u_short family;
- u_short subtype;
- family = (workingPtr->data[0] << 8) + workingPtr->data[1];
- subtype = (workingPtr->data[2] << 8) + workingPtr->data[3];
- if ( (workingPtr->data[0] == 0x00) &&
- (workingPtr->data[1] == 0x02) &&
- (workingPtr->data[2] == 0x00) &&
- (workingPtr->data[3] == 0x06) )
- {
- workingPtr->handled = 1;
- aim_conn_setstatus(workingPtr->conn, AIM_CONN_STATUS_READY);
- }
- else
- {
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, family, subtype, workingPtr);
- }
- }
- break;
- case AIM_CONN_TYPE_CHAT:
- printf("\nAHH! Dont know what to do with CHAT stuff yet!\n");
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_DEFAULT, workingPtr);
- break;
- default:
- printf("\nAHHHHH! UNKNOWN CONNECTION TYPE! (0x%02x)\n\n", workingPtr->conn->type);
- workingPtr->handled = aim_callhandler_noparam(workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
- break;
- }
- /* move to next command */
- workingPtr = workingPtr->next;
- }
- }
-
- aim_queue_incoming = aim_purge_rxqueue(aim_queue_incoming);
-
- return 0;
-}
-
-/*
- * TODO: check and cure memory leakage in this function.
- */
-int aim_authparse(struct command_rx_struct *command)
-{
- rxcallback_t userfunc = NULL;
- int iserror = 0;
- struct aim_tlv_t *tlv = NULL;
- char *errorurl = NULL;
- short errorcode = 0x00;
- u_int z = 0;
-
- if ( (command->data[0] == 0x00) &&
- (command->data[1] == 0x01) &&
- (command->data[2] == 0x00) &&
- (command->data[3] == 0x03) )
- {
- /* "server ready" -- can be ignored */
- userfunc = aim_callhandler(command->conn, AIM_CB_FAM_GEN, AIM_CB_GEN_SERVERREADY);
- }
- else if ( (command->data[0] == 0x00) &&
- (command->data[1] == 0x07) &&
- (command->data[2] == 0x00) &&
- (command->data[3] == 0x05) )
- {
- /* "information change reply" */
- userfunc = aim_callhandler(command->conn, AIM_CB_FAM_ADM, AIM_CB_ADM_INFOCHANGE_REPLY);
- }
- else
- {
- /* anything else -- usually used for login; just parse as pure TLVs */