mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	
		
			
	
	
		
			208 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			208 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Asterisk -- An open source telephony toolkit. | ||
|  |  * | ||
|  |  * Copyright (C) 2021, Sangoma Technologies Corporation | ||
|  |  * | ||
|  |  * Kevin Harwell <kharwell@sangoma.com> | ||
|  |  * | ||
|  |  * See http://www.asterisk.org for more information about
 | ||
|  |  * the Asterisk project. Please do not directly contact | ||
|  |  * any of the maintainers of this project for assistance; | ||
|  |  * the project provides a web site, mailing lists and IRC | ||
|  |  * channels for your use. | ||
|  |  * | ||
|  |  * This program is free software, distributed under the terms of | ||
|  |  * the GNU General Public License Version 2. See the LICENSE file | ||
|  |  * at the top of the source tree. | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef RES_AEAP_TRANSPORT_H
 | ||
|  | #define RES_AEAP_TRANSPORT_H
 | ||
|  | 
 | ||
|  | #include <stdint.h>
 | ||
|  | 
 | ||
|  | #include "asterisk/res_aeap.h"
 | ||
|  | 
 | ||
|  | struct aeap_transport; | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Asterisk external application transport virtual table | ||
|  |  * | ||
|  |  * Callbacks to be implemented by "derived" transports | ||
|  |  */ | ||
|  | struct aeap_transport_vtable { | ||
|  | 	/*!
 | ||
|  | 	 * \brief Connect a transport | ||
|  | 	 * | ||
|  | 	 * \param self The transport object | ||
|  | 	 * \param url The URL to connect to | ||
|  | 	 * \param protocol The connection protocol to use if applicable | ||
|  | 	 * \param timeout How long (in milliseconds) to attempt to connect (-1 equals infinite) | ||
|  | 	 * | ||
|  | 	 * \returns 0 on success, or -1 on error | ||
|  | 	 */ | ||
|  | 	int (*connect)(struct aeap_transport *self, const char *url, const char *protocol, int timeout); | ||
|  | 
 | ||
|  | 	/*!
 | ||
|  | 	 * \brief Disconnect a transport | ||
|  | 	 * | ||
|  | 	 * \param self The transport object | ||
|  | 	 * | ||
|  | 	 * \returns 0 on success, or -1 on error | ||
|  | 	 */ | ||
|  | 	int (*disconnect)(struct aeap_transport *self); | ||
|  | 
 | ||
|  | 	/*!
 | ||
|  | 	 * \brief Destroy a transport | ||
|  | 	 * | ||
|  | 	 * \param self The transport object | ||
|  | 	 */ | ||
|  | 	void (*destroy)(struct aeap_transport *self); | ||
|  | 
 | ||
|  | 	/*!
 | ||
|  | 	 * \brief Read data from a transport | ||
|  | 	 * | ||
|  | 	 * \param self The transport object | ||
|  | 	 * \param buf The buffer data is read read into | ||
|  | 	 * \param size The size of the given data buffer | ||
|  | 	 * \param rtype [out] The type of data read | ||
|  | 	 * | ||
|  | 	 * \returns Total number of bytes read, or less than zero on error | ||
|  | 	 */ | ||
|  | 	intmax_t (*read)(struct aeap_transport *self, void *buf, intmax_t size, | ||
|  | 		enum AST_AEAP_DATA_TYPE *rtype); | ||
|  | 
 | ||
|  | 	/*!
 | ||
|  | 	 * \brief Write data to a transport | ||
|  | 	 * | ||
|  | 	 * \param self The transport object | ||
|  | 	 * \param buf The data to write | ||
|  | 	 * \param size The size of data to write | ||
|  | 	 * \param wtype The type of data to write | ||
|  | 	 * | ||
|  | 	 * \returns Total number of bytes written, or less than zero on error | ||
|  | 	 */ | ||
|  | 	intmax_t (*write)(struct aeap_transport *self, const void *buf, intmax_t size, | ||
|  | 		enum AST_AEAP_DATA_TYPE wtype); | ||
|  | }; | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Asterisk external application transport structure to be | ||
|  |  *        "derived" by specific transport implementation types | ||
|  |  * | ||
|  |  * Transports are assumed to support simultaneous reading and writing, | ||
|  |  * thus separate read and write locks. A transport type not supporting | ||
|  |  * such can simply apply the opposing lock during a read or write, i.e. | ||
|  |  * lock the write lock during a read and vice versa. | ||
|  |  */ | ||
|  | struct aeap_transport { | ||
|  | 	/*! Transport virtual table */ | ||
|  | 	struct aeap_transport_vtable *vtable; | ||
|  | 	/*! Whether or not the transport is connected */ | ||
|  | 	unsigned int connected; | ||
|  | 	/*! Lock used when reading */ | ||
|  | 	ast_mutex_t read_lock; | ||
|  | 	/*! Lock used when writing */ | ||
|  | 	ast_mutex_t write_lock; | ||
|  | }; | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Create an Asterisk external application transport | ||
|  |  * | ||
|  |  * \param type The type of transport to create | ||
|  |  * | ||
|  |  * \returns An Asterisk external application transport, or NULL on error | ||
|  |  */ | ||
|  | struct aeap_transport *aeap_transport_create(const char *type); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Connect a transport | ||
|  |  * | ||
|  |  * \param transport The transport to connect | ||
|  |  * \param url The URL to connect to | ||
|  |  * \param protocol The connection protocol to use if applicable | ||
|  |  * \param timeout How long (in milliseconds) to attempt to connect (-1 equals infinite) | ||
|  |  * | ||
|  |  * \returns 0 on success, or -1 on error | ||
|  |  */ | ||
|  | int aeap_transport_connect(struct aeap_transport *transport, const char *url, | ||
|  | 	const char *protocol, int timeout); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Create an Asterisk external application transport, and connect it | ||
|  |  * | ||
|  |  * \param type The type of transport to create | ||
|  |  * \param url The URL to connect to | ||
|  |  * \param protocol The connection protocol to use if applicable | ||
|  |  * \param timeout How long (in milliseconds) to attempt to connect (-1 equals infinite) | ||
|  |  * | ||
|  |  * \returns An Asterisk external application transport, or NULL on error | ||
|  |  */ | ||
|  | struct aeap_transport *aeap_transport_create_and_connect(const char* type, | ||
|  | 	const char *url, const char *protocol, int timeout); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Disconnect a transport | ||
|  |  * | ||
|  |  * \note Locks both the transport's read and write locks before calling transport | ||
|  |  *       instance's disconnect, and unlocks both before returning. | ||
|  |  * | ||
|  |  * \param transport The transport to disconnect | ||
|  |  * | ||
|  |  * \returns 0 on success, or -1 on error | ||
|  |  */ | ||
|  | int aeap_transport_disconnect(struct aeap_transport *transport); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Whether or not the transport is in a connected state | ||
|  |  * | ||
|  |  * \param transport The transport object | ||
|  |  * | ||
|  |  * \returns True if connected, false otherwise | ||
|  |  */ | ||
|  | int aeap_transport_is_connected(struct aeap_transport *transport); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Destroy a transport | ||
|  |  * | ||
|  |  * \param transport The transport to destroy | ||
|  |  */ | ||
|  | void aeap_transport_destroy(struct aeap_transport *transport); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Read data from the transport | ||
|  |  * | ||
|  |  * This is a blocking read, and will not return until the transport | ||
|  |  * implementation returns. | ||
|  |  * | ||
|  |  * \note Locks transport's read lock before calling transport instance's | ||
|  |  *       read, and unlocks it before returning. | ||
|  |  * | ||
|  |  * \param transport The transport to read from | ||
|  |  * \param buf The buffer data is read into | ||
|  |  * \param size The size of data given data buffer | ||
|  |  * \param rtype [out] The type of data read | ||
|  |  * | ||
|  |  * \returns Total number of bytes read, or less than zero on error | ||
|  |  */ | ||
|  | intmax_t aeap_transport_read(struct aeap_transport *transport, void *buf, intmax_t size, | ||
|  | 	enum AST_AEAP_DATA_TYPE *rtype); | ||
|  | 
 | ||
|  | /*!
 | ||
|  |  * \brief Write data to the transport | ||
|  |  * | ||
|  |  * \note Locks transport's write lock before calling transport instance's | ||
|  |  *       write, and unlocks it before returning. | ||
|  |  * | ||
|  |  * \param transport The transport to write to | ||
|  |  * \param buf The data to write | ||
|  |  * \param size The size of data to write | ||
|  |  * \param wtype The type of data to write | ||
|  |  * | ||
|  |  * \returns Total number of bytes written, or less than zero on error | ||
|  |  */ | ||
|  | intmax_t aeap_transport_write(struct aeap_transport *transport, const void *buf, intmax_t size, | ||
|  | 	enum AST_AEAP_DATA_TYPE wtype); | ||
|  | 
 | ||
|  | #endif /* RES_AEAP_TRANSPORT_H */
 |