Ejemplo n.º 1
0
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;
	}
}
Ejemplo n.º 2
0
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");
	}
}