mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	One more major refactoring to go. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@395367 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			194 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Asterisk -- An open source telephony toolkit.
 | |
|  *
 | |
|  * Copyright (C) 2013 Digium, Inc.
 | |
|  *
 | |
|  * Matt Jordan <mjordan@digium.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 _ASTERISK_PRIVATE_BRIDGING_CHANNEL_H
 | |
| #define _ASTERISK_PRIVATE_BRIDGING_CHANNEL_H
 | |
| 
 | |
| /*!
 | |
|  * \file
 | |
|  * \brief Private Bridging Channel API
 | |
|  *
 | |
|  * \author Matt Jordan <mjordan@digium.com>
 | |
|  *
 | |
|  * A private API to manipulate channels in a bridge. These can be called on a channel in
 | |
|  * a bridge by \ref bridging.c. These functions should not be called elsewhere, including
 | |
|  * by other members of the Bridging API.
 | |
|  *
 | |
|  * See Also:
 | |
|  * \arg \ref AstCREDITS
 | |
|  * \arg \ref Ast
 | |
|  */
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Actions that can be taken on a channel in a bridge
 | |
|  */
 | |
| enum bridge_channel_action_type {
 | |
| 	/*! Bridged channel is to detect a feature hook */
 | |
| 	BRIDGE_CHANNEL_ACTION_FEATURE,
 | |
| 	/*! Bridged channel is to send a DTMF stream out */
 | |
| 	BRIDGE_CHANNEL_ACTION_DTMF_STREAM,
 | |
| 	/*! Bridged channel is to indicate talking start */
 | |
| 	BRIDGE_CHANNEL_ACTION_TALKING_START,
 | |
| 	/*! Bridged channel is to indicate talking stop */
 | |
| 	BRIDGE_CHANNEL_ACTION_TALKING_STOP,
 | |
| 	/*! Bridge channel is to play the indicated sound file. */
 | |
| 	BRIDGE_CHANNEL_ACTION_PLAY_FILE,
 | |
| 	/*! Bridge channel is to run the indicated application. */
 | |
| 	BRIDGE_CHANNEL_ACTION_RUN_APP,
 | |
| 	/*! Bridge channel is to run the custom callback routine. */
 | |
| 	BRIDGE_CHANNEL_ACTION_CALLBACK,
 | |
| 	/*! Bridge channel is to get parked. */
 | |
| 	BRIDGE_CHANNEL_ACTION_PARK,
 | |
| 	/*! Bridge channel is to execute a blind transfer. */
 | |
| 	BRIDGE_CHANNEL_ACTION_BLIND_TRANSFER,
 | |
| 	/*! Bridge channel is to execute an attended transfer */
 | |
| 	BRIDGE_CHANNEL_ACTION_ATTENDED_TRANSFER,
 | |
| 
 | |
| 	/*
 | |
| 	 * Bridge actions put after this comment must never be put onto
 | |
| 	 * the bridge_channel wr_queue because they have other resources
 | |
| 	 * that must be freed.
 | |
| 	 */
 | |
| 
 | |
| 	/*! Bridge reconfiguration deferred technology destruction. */
 | |
| 	BRIDGE_CHANNEL_ACTION_DEFERRED_TECH_DESTROY = 1000,
 | |
| 	/*! Bridge deferred dissolving. */
 | |
| 	BRIDGE_CHANNEL_ACTION_DEFERRED_DISSOLVING,
 | |
| };
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Allocate a new ao2 ref counted bridge_channel
 | |
|  * \since 12.0.0
 | |
|  *
 | |
|  * \param bridge The bridge to make the bridge_channel for
 | |
|  *
 | |
|  * \retval NULL on error
 | |
|  * \retval ao2 ref counted object on success
 | |
|  */
 | |
| struct ast_bridge_channel *bridge_channel_internal_alloc(struct ast_bridge *bridge);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Push the bridge channel into its specified bridge.
 | |
|  * \since 12.0.0
 | |
|  *
 | |
|  * \param bridge_channel Channel to push.
 | |
|  *
 | |
|  * \note On entry, bridge_channel->bridge is already locked.
 | |
|  *
 | |
|  * \retval 0 on success.
 | |
|  * \retval -1 on failure.  The channel did not get pushed.
 | |
|  */
 | |
| int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Pull the bridge channel out of its current bridge.
 | |
|  * \since 12.0.0
 | |
|  *
 | |
|  * \param bridge_channel Channel to pull.
 | |
|  *
 | |
|  * \note On entry, bridge_channel->bridge is already locked.
 | |
|  *
 | |
|  * \return Nothing
 | |
|  */
 | |
| void bridge_channel_internal_pull(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Join the bridge_channel to the bridge
 | |
|  *
 | |
|  * \param bridge_channel The Channel in the bridge
 | |
|  *
 | |
|  * \note This API call starts the bridge_channel's processing of events while
 | |
|  * it is in the bridge. It will return when the channel has been instructed to
 | |
|  * leave the bridge.
 | |
|  */
 | |
| void bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Temporarily suspend a channel from a bridge, handing control over to some
 | |
|  * other system
 | |
|  *
 | |
|  * \param bridge_channel The channel in the bridge
 | |
|  * \note This function assumes that \ref bridge_channel is already locked
 | |
|  */
 | |
| void bridge_channel_internal_suspend_nolock(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Unsuspend a channel that was previously suspended
 | |
|  *
 | |
|  * \param bridge_channel The channel in the bridge
 | |
|  * \note This function assumes that \ref bridge_channel is already locked
 | |
|  */
 | |
| void bridge_channel_internal_unsuspend_nolock(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Queue a blind transfer action on a transferee bridge channel
 | |
|  *
 | |
|  * This is only relevant for when a blind transfer is performed on a two-party
 | |
|  * bridge. The transferee's bridge channel will have a blind transfer bridge
 | |
|  * action queued onto it, resulting in the party being redirected to a new
 | |
|  * destination
 | |
|  *
 | |
|  * \param transferee The channel to have the action queued on
 | |
|  * \param exten The destination extension for the transferee
 | |
|  * \param context The destination context for the transferee
 | |
|  * \param hook Frame hook to attach to transferee
 | |
|  *
 | |
|  * \retval 0 on success.
 | |
|  * \retval -1 on error.
 | |
|  */
 | |
| int bridge_channel_internal_queue_blind_transfer(struct ast_channel *transferee,
 | |
| 		const char *exten, const char *context,
 | |
| 		transfer_channel_cb new_channel_cb, void *user_data);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Queue an attended transfer action on a transferee bridge channel
 | |
|  *
 | |
|  * This is only relevant for when an attended transfer is performed on a two-party
 | |
|  * bridge. The transferee's bridge channel will have an attended transfer bridge
 | |
|  * action queued onto it.
 | |
|  *
 | |
|  * \param transferee The channel to have the action queued on
 | |
|  * \param unbridged_chan The unbridged channel who is the target of the attended
 | |
|  * transfer
 | |
|  *
 | |
|  * \retval 0 on success.
 | |
|  * \retval -1 on error.
 | |
|  */
 | |
| int bridge_channel_internal_queue_attended_transfer(struct ast_channel *transferee,
 | |
| 		struct ast_channel *unbridged_chan);
 | |
| 
 | |
| /*!
 | |
|  * \internal
 | |
|  * \brief Return whether or not the bridge_channel would allow optimization
 | |
|  *
 | |
|  * \retval 0 if optimization is not allowed
 | |
|  * \retval non-zero if optimization is allowed
 | |
|  */
 | |
| int bridge_channel_internal_allows_optimization(struct ast_bridge_channel *bridge_channel);
 | |
| 
 | |
| #endif /* _ASTERISK_PRIVATE_BRIDGING_H */
 |