static gboolean network_timeout(gpointer data) { PurpleConnection *gc = (PurpleConnection *) data; qq_data *qd; gboolean is_lost_conn; g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, TRUE); qd = (qq_data *) gc->proto_data; is_lost_conn = qq_trans_scan(gc); if (is_lost_conn) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Lost connection with server")); return TRUE; } if ( !qd->is_login ) { return TRUE; } qd->itv_count.keep_alive--; if (qd->itv_count.keep_alive <= 0) { qd->itv_count.keep_alive = qd->itv_config.keep_alive; if (qd->client_version >= 2008) { qq_request_keep_alive_2008(gc); } else if (qd->client_version >= 2007) { qq_request_keep_alive_2007(gc); } else { qq_request_keep_alive(gc); } return TRUE; } if (qd->itv_config.update <= 0) { return TRUE; } qd->itv_count.update--; if (qd->itv_count.update <= 0) { qd->itv_count.update = qd->itv_config.update; qq_update_online(gc, 0); return TRUE; } return TRUE; /* if return FALSE, timeout callback stops */ }
void qq_proc_client_cmds(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len, guint32 update_class, guintptr ship_value) { qq_data *qd; guint8 *data; gint data_len; guint8 ret_8 = 0; guint16 ret_16 = 0; guint32 ret_32 = 0; gboolean not_to_update = FALSE; g_return_if_fail(rcved_len > 0); g_return_if_fail (gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; data = g_newa(guint8, rcved_len); data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); if (data_len < 0) { purple_debug_warning("QQ", "Reply can not be decrypted by session key, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); qq_show_packet("Can not decrypted", rcved, rcved_len); return; } if (data_len <= 0) { purple_debug_warning("QQ", "Reply decrypted is empty, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); return; } switch (cmd) { case QQ_CMD_UPDATE_INFO: qq_process_change_info(gc, data, data_len); break; case QQ_CMD_REMOVE_BUDDY: qq_process_remove_buddy(gc, data, data_len, ship_value); break; case QQ_CMD_REMOVE_ME: qq_process_buddy_remove_me(gc, data, data_len, ship_value); break; case QQ_CMD_GET_BUDDY_INFO: qq_process_get_buddy_info(data, data_len, ship_value, gc); break; case QQ_CMD_CHANGE_STATUS: qq_process_change_status(data, data_len, gc); break; case QQ_CMD_SEND_IM: do_im_ack(data, data_len, gc); break; case QQ_CMD_KEEP_ALIVE: if (qd->client_version >= 2010) { qq_process_keep_alive(data, data_len, gc); } break; case QQ_CMD_GET_BUDDIES_ONLINE: ret_8 = qq_process_get_buddies_online(data, data_len, gc); if (ret_8 > 0 && ret_8 < 0xff) { purple_debug_info("QQ", "Requesting for more online buddies\n"); qq_request_get_buddies_online(gc, ret_8, update_class); return; } purple_debug_info("QQ", "All online buddies received\n"); qq_update_buddies_status(gc); break; case QQ_CMD_GET_LEVEL: qq_process_get_level_reply(data, data_len, gc); if (ship_value) { purple_debug_info("QQ", "Requesting Buddy Level pos: %d\n", ship_value); qq_request_get_buddies_level(gc, 0, ship_value); } break; case QQ_CMD_GET_BUDDIES_SIGN: qq_process_get_buddies_sign(data, data_len, gc); if (ship_value) { purple_debug_info("QQ", "Requesting Buddy Signature pos: %d\n", ship_value); qq_request_get_buddies_sign(gc, 0, ship_value); } break; case QQ_CMD_GET_GROUP_LIST: ret_32 = qq_process_get_group_list(data, data_len, gc); /* if still have remained group name */ if (ret_32) { purple_debug_info("QQ", "Requesting for Group pos: %d\n", ret_32); qq_request_get_group_list(gc, ret_32, 0); not_to_update = TRUE; //not to update else when get_group not finished } break; case QQ_CMD_GET_BUDDIES_LIST: ret_16 = qq_process_get_buddies_list(data, data_len, gc); if (ret_16 > 0 && ret_16 < 0xffff) { purple_debug_info("QQ", "Requesting for more buddies\n"); qq_request_get_buddies_list(gc, ret_16, update_class); return; } purple_debug_info("QQ", "All buddies received. Requesting buddies' levels\n"); break; case QQ_CMD_SEARCH_UID: qq_process_search_uid(gc, data, data_len, ship_value); break; case QQ_CMD_AUTH_TOKEN: qq_process_auth_token(gc, data, data_len, update_class, ship_value); break; case QQ_CMD_BUDDY_QUESTION: qq_process_question(gc, data, data_len, ship_value); break; case QQ_CMD_ADD_BUDDY_TOUCH: qq_process_add_buddy_touch(gc, data, data_len, ship_value); break; case QQ_CMD_ADD_BUDDY_POST: qq_process_add_buddy_post(gc, data, data_len, ship_value); break; /*case QQ_CMD_BUDDY_CHECK_CODE: qq_process_buddy_check_code(gc, data, data_len); break;*/ case QQ_CMD_BUDDY_MEMO: purple_debug_info("QQ", "Receive memo from server!\n"); qq_process_get_buddy_memo(gc, data, data_len, update_class, ship_value); break; default: process_unknown_cmd(gc, _("Unknown CLIENT CMD"), data, data_len, cmd, seq); not_to_update = TRUE; break; } if (not_to_update) return; if (update_class == QQ_CMD_CLASS_NONE) return; purple_debug_info("QQ", "Update class %d\n", update_class); if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { qq_update_all(gc, cmd); return; } if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { qq_update_online(gc, cmd); return; } }