[asterisk-commits] rizzo: trunk r77684 - /trunk/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sun Jul 29 05:13:14 CDT 2007


Author: rizzo
Date: Sun Jul 29 05:13:14 2007
New Revision: 77684

URL: http://svn.digium.com/view/asterisk?view=rev&rev=77684
Log:
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.


Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?view=diff&rev=77684&r1=77683&r2=77684
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Sun Jul 29 05:13:14 2007
@@ -1780,31 +1780,12 @@
 };
 
 /*! \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
- *  the core knows that the channel doesn't want DTMF BEGIN frames. */
-static const struct ast_channel_tech sip_tech_info = {
-	.type = "SIP",
-	.description = "Session Initiation Protocol (SIP)",
-	.capabilities = AST_FORMAT_AUDIO_MASK,	/* all audio formats */
-	.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,
-};
+ * callback so that the core knows that the channel does not want
+ * DTMF BEGIN frames.
+ * The struct is initialized just before registering the channel driver,
+ * and is for use with channels using SIP INFO DTMF.
+ */
+static struct ast_channel_tech sip_tech_info;
 
 /* 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)
@@ -18651,6 +18632,13 @@
 	if(reload_config(sip_reloadreason))	/* Load the configuration from sip.conf */
 		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 */
 	if (ast_channel_register(&sip_tech)) {
 		ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n");




More information about the asterisk-commits mailing list