/*
 * Copyright (c) 2019 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef SHELL_TELNET_H__
#define SHELL_TELNET_H__

#include <shell/shell.h>

#ifdef __cplusplus
extern "C" {
#endif

extern const struct shell_transport_api shell_telnet_transport_api;

/** Line buffer structure. */
struct shell_telnet_line_buf {
	/** Line buffer. */
	char buf[CONFIG_SHELL_TELNET_LINE_BUF_SIZE];

	/** Current line length. */
	uint16_t len;
};

/** TELNET-based shell transport. */
struct shell_telnet {
	/** Handler function registered by shell. */
	shell_transport_handler_t shell_handler;

	/** Context registered by shell. */
	void *shell_context;

	/** Buffer for outgoing line. */
	struct shell_telnet_line_buf line_out;

	/** Network context of TELNET client. */
	struct net_context *client_ctx;

	/** RX packet FIFO. */
	struct k_fifo rx_fifo;

	/** The delayed work is used to send non-lf terminated output that has
	 *  been around for "too long". This will prove to be useful
	 *  to send the shell prompt for instance.
	 */
	struct k_work_delayable send_work;
	struct k_work_sync work_sync;

	/** If set, no output is sent to the TELNET client. */
	bool output_lock;
};

#define SHELL_TELNET_DEFINE(_name)					\
	static struct shell_telnet _name##_shell_telnet;		\
	struct shell_transport _name = {				\
		.api = &shell_telnet_transport_api,			\
		.ctx = (struct shell_telnet *)&_name##_shell_telnet	\
	}

/**
 * @brief This function provides pointer to shell telnet backend instance.
 *
 * Function returns pointer to the shell telnet instance. This instance can be
 * next used with shell_execute_cmd function in order to test commands behavior.
 *
 * @returns Pointer to the shell instance.
 */
const struct shell *shell_backend_telnet_get_ptr(void);

#ifdef __cplusplus
}
#endif

#endif /* SHELL_TELNET_H__ */
