Skip to content
Snippets Groups Projects
Commit c1954982 authored by Luigi Rizzo's avatar Luigi Rizzo
Browse files

build the version of sip_tech with no send_digit_begin

at load time instead of duplicating the initializer.
This should remove the risk of forgetting fields in the
initializer.



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@77684 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent e5f3a6cc
Branches
Tags
No related merge requests found
...@@ -1780,31 +1780,12 @@ static const struct ast_channel_tech sip_tech = { ...@@ -1780,31 +1780,12 @@ static const struct ast_channel_tech sip_tech = {
}; };
   
/*! \brief This version of the sip channel tech has no send_digit_begin /*! \brief This version of the sip channel tech has no send_digit_begin
* callback. This is for use with channels using SIP INFO DTMF so that * callback so that the core knows that the channel does not want
* the core knows that the channel doesn't want DTMF BEGIN frames. */ * DTMF BEGIN frames.
static const struct ast_channel_tech sip_tech_info = { * The struct is initialized just before registering the channel driver,
.type = "SIP", * and is for use with channels using SIP INFO DTMF.
.description = "Session Initiation Protocol (SIP)", */
.capabilities = AST_FORMAT_AUDIO_MASK, /* all audio formats */ static struct ast_channel_tech sip_tech_info;
.properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER,
.requester = sip_request_call,
.devicestate = sip_devicestate,
.call = sip_call,
.hangup = sip_hangup,
.answer = sip_answer,
.read = sip_read,
.write = sip_write,
.write_video = sip_write,
.write_text = sip_write,
.indicate = sip_indicate,
.transfer = sip_transfer,
.fixup = sip_fixup,
.send_digit_end = sip_senddigit_end,
.bridge = ast_rtp_bridge,
.early_bridge = ast_rtp_early_bridge,
.send_text = sip_sendtext,
.func_channel_read = acf_channel_read,
};
   
/* wrapper macro to tell whether t points to one of the sip_tech descriptors */ /* wrapper macro to tell whether t points to one of the sip_tech descriptors */
#define IS_SIP_TECH(t) ((t) == &sip_tech || (t) == &sip_tech_info) #define IS_SIP_TECH(t) ((t) == &sip_tech || (t) == &sip_tech_info)
...@@ -18651,6 +18632,13 @@ static int load_module(void) ...@@ -18651,6 +18632,13 @@ static int load_module(void)
if(reload_config(sip_reloadreason)) /* Load the configuration from sip.conf */ if(reload_config(sip_reloadreason)) /* Load the configuration from sip.conf */
return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_DECLINE;
   
/* Prepare the version that does not require DTMF BEGIN frames.
* We need to use tricks such as memcopy and casts because the variable
* has const fields.
*/
memcpy(&sip_tech_info, &sip_tech, sizeof(sip_tech));
*((void **)&sip_tech_info.send_digit_begin) = NULL;
/* Make sure we can register our sip channel type */ /* Make sure we can register our sip channel type */
if (ast_channel_register(&sip_tech)) { if (ast_channel_register(&sip_tech)) {
ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n"); ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment