1 /*!
2  * \file        pbx_impl.h
3  * \brief       SCCP PBX Asterisk Wrapper Header
4  * \author      Diederik de Groot <ddegroot [at] users.sourceforge.net>
5  * \note        Reworked, but based on chan_sccp code.
6  *              The original chan_sccp driver that was made by Zozo which itself was derived from the chan_skinny driver.
7  *              Modified by Jan Czmok and Julien Goodwin
8  * \note        This program is free software and may be modified and distributed under the terms of the GNU Public License.
9  *              See the LICENSE file at the top of the source tree.
10  *
11  */
12 #pragma once
13 
14 #include "config.h"
15 #include "common.h"
16 
17 #ifdef HAVE_ASTERISK
18 #include "ast/ast.h"
19 #endif
20 
21 __BEGIN_C_EXTERN__
22 #define PBX_BRIDGE_TYPE struct ast_bridge
23 
24 /*!
25  * \brief SCCP PBX Callback function
26  *
27  * Register Callback_Functions for a particular PBX Implementation and PBX Version. This will make it possible to make
28  * chan-sccp agnostic to the PBX Software we are connected to. And provides a way to cope with multiple different versions
29  * of these PBX Implementation. There Callback functions are implemented under the pbx_impl directory
30  */
31 typedef struct _PbxInterface {
32 	/* *INDENT-OFF* */
33 	/* channels */
34 	boolean_t(*const alloc_pbxChannel) (sccp_channel_t * channel, const void * ids, const PBX_CHANNEL_TYPE * pbxSrcChannel, PBX_CHANNEL_TYPE ** pbxDstChannel);	/* returns a new channel with pbx_channel_ref and ast_module_info_ref*/
35 	int (*const set_callstate) (constChannelPtr pbx_channel, enum ast_channel_state state);
36 	boolean_t(*const checkhangup) (constChannelPtr channel);
37 	int (*const hangup) (PBX_CHANNEL_TYPE * channel);
38 	sccp_extension_status_t(*const extension_status) (constChannelPtr channel);
39 
40 	void (*const setPBXChannelLinkedId) (PBX_CHANNEL_TYPE *pbxchannel, const char *linkedid);
41 
42 	const char *(*const getChannelName) (const sccp_channel_t *channel);
43 	void (*const setChannelName) (const sccp_channel_t *channel, const char *name);
44 	const char *(*const getChannelUniqueID) (const sccp_channel_t *channel);
45 	const char *(*const getChannelAppl) (const sccp_channel_t *channel);
46 	const char *(*const getChannelExten) (const sccp_channel_t *channel);
47 	void (*const setChannelExten) (const sccp_channel_t *channel, const char *exten);
48 	const char *(*const getChannelLinkedId) (constChannelPtr channel);
49 	void (*const setChannelLinkedId) (const sccp_channel_t *channel, const char *linkedid);
50 	enum ast_channel_state (*const getChannelState) (const sccp_channel_t *channel);
51 	const struct ast_pbx *(*const getChannelPbx) (const sccp_channel_t *channel);
52 	const char *(*const getChannelContext) (constChannelPtr channel);
53 	void (*const setChannelContext) (const sccp_channel_t *channel, const char *context);
54 	const char *(*const getChannelMacroExten) (constChannelPtr channel);
55 	void (*const setChannelMacroExten) (const sccp_channel_t *channel, const char *exten);
56 	const char *(*const getChannelMacroContext) (constChannelPtr channel);
57 	void (*const setChannelMacroContext) (const sccp_channel_t *channel, const char *context);
58 	const char *(*const getChannelCallForward) (constChannelPtr channel);
59 	void (*const setChannelCallForward) (const sccp_channel_t *channel, const char *fwdnum);
60 
61 	/** get channel by name */
62 	boolean_t(*const getChannelByName) (const char *name, PBX_CHANNEL_TYPE **pbx_channel);
63 	boolean_t(*const getRemoteChannel) (const sccp_channel_t *channel, PBX_CHANNEL_TYPE **pbx_channel);
64 	void *(*const getChannelByCallback) (int (*is_match)(PBX_CHANNEL_TYPE *, void *),void *data);
65 
66 	int (*const set_nativeAudioFormats) (constChannelPtr channel, skinny_codec_t codecs[]);
67 	int (*const set_nativeVideoFormats) (constChannelPtr channel, skinny_codec_t codecs[]);
68 	int (*const getPeerCodecCapabilities) (constChannelPtr channel, void **capabilities);
69 	int (*const send_digit) (constChannelPtr channel, const char digit);
70 	int (*const send_digits) (constChannelPtr channel, const char *digits);
71 
72 	int (*const sched_add) (int when, sccp_sched_cb callback, const void *data);
73 	int (*const sched_del) (int id);
74 	int (*const sched_add_ref) (int *id, int when, sccp_sched_cb callback, sccp_channel_t *channel);
75 	int (*const sched_del_ref) (int *id, sccp_channel_t *channel);
76 	int (*const sched_replace_ref) (int *id, int when, ast_sched_cb callback, sccp_channel_t *channel);
77 	long (*const sched_when) (int id);
78 	int (*const sched_wait) (int id);
79 
80 	/* rtp */
81 //	int (*const rtp_getPeer) (constChannelPtr channel, struct sockaddr_in * address);
82 	boolean_t(*const rtp_getPeer) (PBX_RTP_TYPE * rtp, struct sockaddr_storage *address);
83 	boolean_t(*const rtp_getUs) (PBX_RTP_TYPE * rtp, struct sockaddr_storage *address);
84 	int (*const rtp_setPhoneAddress) (const struct sccp_rtp * rtp, const struct sockaddr_storage * new_peer, int nat_active);
85 	boolean_t(*const rtp_setWriteFormat) (constChannelPtr channel, skinny_codec_t codec);
86 	boolean_t(*const rtp_setReadFormat) (constChannelPtr channel, skinny_codec_t codec);
87 	boolean_t(*const rtp_destroy) (PBX_RTP_TYPE * rtp);
88 	void (*const rtp_stop) (PBX_RTP_TYPE *rtp);
89 	int (*const rtp_codec) (sccp_channel_t * channel);
90 	boolean_t(*const rtp_create_instance) (constDevicePtr d, constChannelPtr c, sccp_rtp_t *rtp);
91 	uint8_t(*const rtp_get_payloadType) (const struct sccp_rtp * rtp, skinny_codec_t codec);
92 	int(*const rtp_get_sampleRate) (skinny_codec_t codec);
93 	uint8_t(*const rtp_bridgePeers) (PBX_CHANNEL_TYPE * c0, PBX_CHANNEL_TYPE * c1, int flags, struct ast_frame ** fo, PBX_CHANNEL_TYPE ** rc, int timeoutms);
94 
95 	/* callerid */
96 	int (*const get_callerid_name) (PBX_CHANNEL_TYPE * pbxChannel, char **cid_name);
97 	int (*const get_callerid_number) (PBX_CHANNEL_TYPE * pbxChannel, char **cid_number);
98 	int (*const get_callerid_ton) (PBX_CHANNEL_TYPE * pbxChannel, int *ton);
99 	int (*const get_callerid_ani) (PBX_CHANNEL_TYPE * pbxChannel, char **ani);
100 	int (*const get_callerid_subaddr) (PBX_CHANNEL_TYPE * pbxChannel, char **subaddr);
101 	int (*const get_callerid_dnid) (PBX_CHANNEL_TYPE * pbxChannel, char **dnid);
102 	int (*const get_callerid_rdnis) (PBX_CHANNEL_TYPE * pbxChannel, char **rdnis);
103 	sccp_callerid_presentation_t (*const get_callerid_presentation) (PBX_CHANNEL_TYPE * pbxChannel);
104 
105 	void (*const set_callerid_name) (PBX_CHANNEL_TYPE * pbxChannel, const char *name);
106 	void (*const set_callerid_number) (PBX_CHANNEL_TYPE * pbxChannel, const char *number);
107 	void (*const set_callerid_ani) (PBX_CHANNEL_TYPE * pbxChannel, const char *ani);
108 	void (*const set_callerid_dnid) (PBX_CHANNEL_TYPE * pbxChannel, const char *dnid);
109 	void (*const set_callerid_redirectingParty) (PBX_CHANNEL_TYPE * pbxChannel, const char *number, const char *name);
110 	void (*const set_callerid_redirectedParty) (PBX_CHANNEL_TYPE * pbxChannel, const char *number, const char *name);
111 	void (*const set_callerid_presentation) (PBX_CHANNEL_TYPE * pbxChannel, sccp_callerid_presentation_t presentation);
112 
113 	void (*const set_dialed_number) (const sccp_channel_t *channel, const char *number);
114 	void (*const set_connected_line) (constChannelPtr channel, const char *number, const char *name, uint8_t reason);
115 	void (*const sendRedirectedUpdate) (constChannelPtr channel, const char *fromNumber, const char *fromName, const char *toNumber, const char *toName, uint8_t reason);
116 
117 	/* feature section */
118 	sccp_parkresult_t(*const feature_park) (constChannelPtr hostChannel);
119 	boolean_t(*const feature_stopMusicOnHold) (constChannelPtr channel);
120 	boolean_t(*const feature_addToDatabase) (const char *family, const char *key, const char *value);
121 	boolean_t(*const feature_getFromDatabase) (const char *family, const char *key, char *out, int outlen);
122 	boolean_t(*const feature_removeFromDatabase) (const char *family, const char *key);
123 	boolean_t(*const feature_removeTreeFromDatabase) (const char *family, const char *key);
124 	boolean_t(*const feature_monitor) (const sccp_channel_t *channel);
125 	boolean_t(*const getFeatureExtension) (constChannelPtr channel, const char *featureName, char featureExtension[SCCP_MAX_EXTENSION]);
126 	boolean_t(*const getPickupExtension) (constChannelPtr channel, char pickupExtension[SCCP_MAX_EXTENSION]);
127 
128 	void *(*const eventSubscribe)(constChannelPtr channel, char **featureExtension);
129 	PBX_CHANNEL_TYPE *(*const findChannelByCallback)(int(*const found_cb)(PBX_CHANNEL_TYPE *c, void *data), void *data, boolean_t lock);
130 
131 	int(*const moh_start) (PBX_CHANNEL_TYPE * pbx_channel, const char *mclass, const char* interpclass);
132 	void(*const moh_stop) (PBX_CHANNEL_TYPE * pbx_channel);
133 	int(*const queue_control) (const PBX_CHANNEL_TYPE * pbx_channel, enum ast_control_frame_type control);
134 	int(*const queue_control_data) (const PBX_CHANNEL_TYPE * pbx_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
135 
136 	/* conference */
137 	boolean_t(*const allocTempPBXChannel) (PBX_CHANNEL_TYPE * pbxSrcChannel, PBX_CHANNEL_TYPE ** pbxDstChannel);
138 	boolean_t(*const masqueradeHelper) (PBX_CHANNEL_TYPE *pbxChannel, PBX_CHANNEL_TYPE *pbxTmpchannel);
139 	PBX_CHANNEL_TYPE *(*const requestAnnouncementChannel) (pbx_format_enum_type format, const PBX_CHANNEL_TYPE * requestor, void *data);
140 
141 	boolean_t(*const set_language)(PBX_CHANNEL_TYPE *pbxChannel, const char *language);
142 
143 	/* devicestate / extension state */
144 	skinny_busylampfield_state_t (*const getExtensionState)(const char *extension, const char *context);
145 
146 	PBX_CHANNEL_TYPE *(*const findPickupChannelByExtenLocked)(PBX_CHANNEL_TYPE *chan, const char *exten, const char *context);
147 	PBX_CHANNEL_TYPE *(*const findPickupChannelByGroupLocked)(PBX_CHANNEL_TYPE *chan);
148 
149  	PBX_ENDPOINT_TYPE *(*const endpoint_create)(const char *tech, const char *resource);
150 	void (*const endpoint_online)(PBX_ENDPOINT_TYPE *endpoint, const char *address);
151 	void (*const endpoint_offline)(PBX_ENDPOINT_TYPE *endpoint, const char *cause);
152 	void (*const endpoint_shutdown)(PBX_ENDPOINT_TYPE **endpoint);
153 
154         void (*const set_owner)(sccp_channel_t *channel, PBX_CHANNEL_TYPE *pbx_channel);
155         void (*const removeTimingFD)(PBX_CHANNEL_TYPE *pbx_channel);
156 	int (*const dumpchan)(PBX_CHANNEL_TYPE * const pbx_channel, char * const buf, size_t size);
157 	boolean_t (*const channel_is_bridged) (sccp_channel_t *channel);
158 	PBX_CHANNEL_TYPE *(*const get_bridged_channel) (PBX_CHANNEL_TYPE *pbx_channel);					/* takes pbx_channel_ref */
159 	PBX_CHANNEL_TYPE *(*const get_underlying_channel) (PBX_CHANNEL_TYPE *pbx_channel);				/* takes pbx_channel_ref */
160 	boolean_t (*const attended_transfer) (sccp_channel_t *destination_channel, sccp_channel_t *source_channel);	/* takes pbx_channel_ref on source_channel */
161 
162 	void (*const set_callgroup)(sccp_channel_t * channel, ast_group_t value);
163 	void (*const set_pickupgroup)(sccp_channel_t * channel, ast_group_t value);
164 #if CS_AST_HAS_NAMEDGROUP && ASTERISK_VERSION_GROUP >= 111
165 	void (*const set_named_callgroups)(sccp_channel_t * channel, struct ast_namedgroups * value);
166 	void (*const set_named_pickupgroups)(sccp_channel_t * channel, struct ast_namedgroups * value);
167 #else
168 	void (*const set_named_callgroups)(sccp_channel_t * channel, void * value);
169 	void (*const set_named_pickupgroups)(sccp_channel_t * channel, void * value);
170 #endif
171 	int (*register_manager)(const char * action, int authority, int (*func)(struct mansession * s, const struct message * m), const char * synopsis, const char * description);
172 #if ASTERISK_VERSION_GROUP >= 108
173 	int (*const register_application)(const char * app_name, int (*execute_cb)(struct ast_channel *, const char *));
174 #else
175 	int (*const register_application)(const char * app_name, int (*execute_cb)(struct ast_channel *, void *));
176 #endif
177 	int (*const unregister_application)(const char * app_name);
178 	int (*const register_function)(struct pbx_custom_function * custom_function);
179 	int (*const unregister_function)(struct pbx_custom_function * custom_function);
180 
181 	uint (*const get_codec_framing)(constChannelPtr c);
182 	uint (*const get_dtmf_payload_code)(constChannelPtr c);
183 
184 	void (*const retrieve_remote_capabilities)(channelPtr c);
185 	/* *INDENT-ON* */
186 } PbxInterface;
187 
188 extern const PbxInterface iPbx;
189 __END_C_EXTERN__
190 // kate: indent-width 8; replace-tabs off; indent-mode cstyle; auto-insert-doxygen on; line-numbers on; tab-indents on; keep-extra-spaces off; auto-brackets off;
191