void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) { qq_data *qd; guint8 *data; gint data_len; 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", "Can not decrypt server cmd 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", "Server cmd decrypted is empty, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); return; } /* now process the packet */ switch (cmd) { case QQ_CMD_RECV_IM_CE: case QQ_CMD_RECV_IM: process_private_msg(data, data_len, cmd, seq, gc); break; case QQ_CMD_RECV_MSG_SYS: process_server_msg(gc, data, data_len, seq); break; case QQ_CMD_BUDDY_CHANGE_STATUS: qq_process_buddy_change_status(data, data_len, gc); break; default: process_unknown_cmd(gc, _("Unknown SERVER CMD"), data, data_len, cmd, seq); break; } }
void process_received_message(message_header *mh, char msg[], int i) { if (mh->type == PRIVATE) { puts("\n\n\t receive private message ... \n"); process_private_msg(msg, i); } else if (mh->type == BROADCAST) { puts("\n\n\t Receive BROADCAST message ... \n"); if (is_new_msg(mh->id)) { add_msg_to_container(mh->id); process_broadcast_msg(mh, msg, i); // check if broadcast bag have n citizen's peer token if (is_salute == 0) { int curr_peer_token = count_peer_token(); int curr_init_token = count_init_token(); if (curr_peer_token >= (max_citizen_number*2) && curr_init_token == max_citizen_number) { is_salute = 1; find_leader(); printf("\t leader(%s) is from %s:%d\n", leader.peer_token, leader.remote_ip, ntohs(leader.udp_port)); send_salute_message(); } } } else { // check if broadcast bag have n citizen's peer token if (is_salute == 0) { int curr_peer_token = count_peer_token(); int curr_init_token = count_init_token(); if (curr_peer_token >= (max_citizen_number*2) && curr_init_token == max_citizen_number) { is_salute = 1; find_leader(); printf("\t leader(%s) is from %s:%d\n", leader.peer_token, leader.remote_ip, ntohs(leader.udp_port)); send_salute_message(); } } throw_exception(NOTE, "\t drop duplicate message"); return; } } else { throw_exception(NOTE, "\t wrong type: message ignored"); } }