#include <stdint.h>
#include <stdio.h>

#include <libqmi-glib.h>

#include "diag_log.h"
#include "protocol/diag_log_qmi.h"

/* A small wrapper around libqmi-glib to give us a human-readable string
 * representation of QMI messages that we receive from DIAG */
static int dump_qmi_msg(const uint8_t *data, unsigned int len)
{
	GByteArray *buffer;
	GError *error = NULL;
	QmiMessage *message;
	gchar *printable;

	buffer = g_byte_array_sized_new(len);
	g_byte_array_append(buffer, data, len);

	message = qmi_message_new_from_raw(buffer, &error);
	if (!message) {
		fprintf(stderr, "qmi_message_new_from_raw() returned NULL\n");
		return -1;
	}

	printable = qmi_message_get_printable(message, "QMI ");
	fputs(printable, stdout);
	g_free(printable);

	return 0;
}

static void handle_qmi_msg(struct log_hdr *lh, struct msgb *msg)
{
	dump_qmi_msg(lh->data, lh->len);
}

#define CORE(x)	(0x1000 + x)

/* Tx and Rx might be switched */
#define LOG_QMI_PORT_RX(i)	CORE(LOG_QMI_RESERVED_CODES_BASE_C+(i*2))
#define LOG_QMI_PORT_TX(i)	CORE(LOG_QMI_RESERVED_CODES_BASE_C+(i*2)+1)

static const struct diag_log_dispatch_tbl log_tbl[] = {
	{ CORE(LOG_QMI_CALL_FLOW_C), handle_qmi_msg },
	{ CORE(LOG_QMI_SUPPORTED_INTERFACES_C), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(0), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(1), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(2), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(3), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(4), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(5), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(6), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(7), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(8), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(9), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(10), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(11), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(12), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(13), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(14), handle_qmi_msg },
	{ LOG_QMI_PORT_RX(15), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(0), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(1), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(2), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(3), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(4), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(5), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(6), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(7), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(8), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(9), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(10), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(11), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(12), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(13), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(14), handle_qmi_msg },
	{ LOG_QMI_PORT_TX(15), handle_qmi_msg },
};

static __attribute__((constructor)) void on_dso_load_qmi(void)
{
	diag_log_reg_dispatch(log_tbl, ARRAY_SIZE(log_tbl));
}
