void read_server_msg(Client* client)
{
    int valread = read(client->maintainer_fd, client->server_msg.buffer+client->server_msg.offset, BUFFER_SIZE-client->server_msg.offset);
    if(valread == 0)
        exit(1);
    client->server_msg.offset += valread;
    if(client->server_msg.offset == client->server_msg.total_len) {
        if(ENCRYPTION_ENABLED)
            decrypt_msg(client->server_msg.buffer, client->keypair);
        client->server_msg.offset=0;
        logger("<Client><read_server_msg>got message from server\n");
        process_server_msg(client);
    }
}
Exemple #2
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;
	}
}
int Message_Unit::process_server_buffer(Block_Buffer &buf) {
	msg_tick_ = Time_Value::gettimeofday();

	int cid = 0;
	uint32_t len = 0;
	uint32_t msg_id = 0;

	if (buf.read_int32(cid) ||
		buf.read_uint32(len) ||
		buf.read_uint32(msg_id)) {

		LOG_USER("deserialize error, cid:%d len:%d msg_id:%d", len, msg_id);
		return -1;
	}

	process_server_msg(msg_id, cid, buf);

	count_process_time(msg_id);

	return 0;
}