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