/**
 * @file libimobiledevice/bt_packet_logger.h
 * @brief Capture the Bluetooth HCI trace from a device
 * \internal
 *
 * Copyright (c) 2021 Geoffrey Kruse, All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef IBT_PACKET_LOGGER_H
#define IBT_PACKET_LOGGER_H

#ifdef __cplusplus
extern "C" {
#endif

#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>

#define BT_PACKETLOGGER_SERVICE_NAME "com.apple.bluetooth.BTPacketLogger"
#define BT_MAX_PACKET_SIZE 65535

/** Error Codes */
typedef enum {
	BT_PACKET_LOGGER_E_SUCCESS         =  0,
	BT_PACKET_LOGGER_E_INVALID_ARG     = -1,
	BT_PACKET_LOGGER_E_MUX_ERROR       = -2,
	BT_PACKET_LOGGER_E_SSL_ERROR       = -3,
	BT_PACKET_LOGGER_E_NOT_ENOUGH_DATA = -4,
	BT_PACKET_LOGGER_E_TIMEOUT         = -5,
	BT_PACKET_LOGGER_E_UNKNOWN_ERROR   = -256
} bt_packet_logger_error_t;

typedef struct {
	uint32_t length;
	uint32_t ts_secs;
	uint32_t ts_usecs;
} bt_packet_logger_header_t;

typedef struct bt_packet_logger_client_private bt_packet_logger_client_private;
typedef bt_packet_logger_client_private *bt_packet_logger_client_t; /**< The client handle. */

/** Receives each hci packet received from the device. */
typedef void (*bt_packet_logger_receive_cb_t)(uint8_t * data, uint16_t len, void *user_data);

/* Interface */

/**
 * Connects to the bt_packet_logger service on the specified device.
 *
 * @param device The device to connect to.
 * @param service The service descriptor returned by lockdownd_start_service.
 * @param client Pointer that will point to a newly allocated
 *     bt_packet_logger_client_t upon successful return. Must be freed using
 *     bt_packet_logger_client_free() after use.
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success, BT_PACKET_LOGGER_E_INVALID_ARG when
 *     client is NULL, or an BT_PACKET_LOGGER_E_* error code otherwise.
 */
bt_packet_logger_error_t bt_packet_logger_client_new(idevice_t device, lockdownd_service_descriptor_t service, bt_packet_logger_client_t * client);

/**
 * Starts a new bt_packet_logger service on the specified device and connects to it.
 *
 * @param device The device to connect to.
 * @param client Pointer that will point to a newly allocated
 *     bt_packet_logger_client_t upon successful return. Must be freed using
 *     bt_packet_logger_client_free() after use.
 * @param label The label to use for communication. Usually the program name.
 *  Pass NULL to disable sending the label in requests to lockdownd.
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success, or an BT_PACKET_LOGGER_E_* error
 *     code otherwise.
 */
bt_packet_logger_error_t bt_packet_logger_client_start_service(idevice_t device, bt_packet_logger_client_t * client, const char* label);

/**
 * Disconnects a bt_packet_logger client from the device and frees up the
 * bt_packet_logger client data.
 *
 * @param client The bt_packet_logger client to disconnect and free.
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success, BT_PACKET_LOGGER_E_INVALID_ARG when
 *     client is NULL, or an BT_PACKET_LOGGER_E_* error code otherwise.
 */
bt_packet_logger_error_t bt_packet_logger_client_free(bt_packet_logger_client_t client);


/**
 * Starts capturing the hci interface from the device using a callback.
 *
 * Use bt_packet_logger_stop_capture() to stop receiving hci data.
 *
 * @param client The bt_packet_logger client to use
 * @param callback Callback to receive each packet from the hci interface.
 * @param user_data Custom pointer passed to the callback function.
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success,
 *      BT_PACKET_LOGGER_E_INVALID_ARG when one or more parameters are
 *      invalid or BT_PACKET_LOGGER_E_UNKNOWN_ERROR when an unspecified
 *      error occurs or an hci capture has already been started.
 */
bt_packet_logger_error_t bt_packet_logger_start_capture(bt_packet_logger_client_t client, bt_packet_logger_receive_cb_t callback, void* user_data);

/**
 * Stops capturing the hci interface from the device.
 *
 * Use bt_packet_logger_start_capture() to start receiving the hci data.
 *
 * @param client The bt_packet_logger client to use
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success,
 *      BT_PACKET_LOGGER_E_INVALID_ARG when one or more parameters are
 *      invalid or BT_PACKET_LOGGER_E_UNKNOWN_ERROR when an unspecified
 *      error occurs or an hci capture has already been started.
 */
bt_packet_logger_error_t bt_packet_logger_stop_capture(bt_packet_logger_client_t client);

/* Receiving */

/**
 * Receives data using the given bt_packet_logger client with specified timeout.
 *
 * @param client The bt_packet_logger client to use for receiving
 * @param data Buffer that will be filled with the data received
 * @param size Number of bytes to receive
 * @param received Number of bytes received (can be NULL to ignore)
 * @param timeout Maximum time in milliseconds to wait for data.
 *
 * @return BT_PACKET_LOGGER_E_SUCCESS on success,
 *      BT_PACKET_LOGGER_E_INVALID_ARG when one or more parameters are
 *      invalid, BT_PACKET_LOGGER_E_MUX_ERROR when a communication error
 *      occurs, or BT_PACKET_LOGGER_E_UNKNOWN_ERROR when an unspecified
 *      error occurs.
 */
bt_packet_logger_error_t bt_packet_logger_receive_with_timeout(bt_packet_logger_client_t client, char *data, uint32_t size, uint32_t *received, unsigned int timeout);


#ifdef __cplusplus
}
#endif

#endif
