Author: rizzo
Date: Fri Jul 20 20:25:13 2007
New Revision: 76224

URL: http://svn.digium.com/view/asterisk?view=rev&rev=76224
Log:
We have two 'technology' descriptors for a SIP channel, so
define and use a macro to determine whether we are pointing to
one of them, so when one goes away (or a new one appears) we don't
have to touch all the code.


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=76224&r1=76223&r2=76224
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Fri Jul 20 20:25:13 2007
@@ -1655,24 +1655,24 @@
        .description = "Session Initiation Protocol (SIP)",
        .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1),
        .properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER,
-       .requester = sip_request_call,
-       .devicestate = sip_devicestate,
-       .call = sip_call,
+       .requester = sip_request_call,                  /* called with chan 
unlocked */
+       .devicestate = sip_devicestate,                 /* called with chan 
unlocked (not chan-specific) */
+       .call = sip_call,                       /* called with chan locked */
        .send_html = sip_sendhtml,
-       .hangup = sip_hangup,
-       .answer = sip_answer,
-       .read = sip_read,
-       .write = sip_write,
-       .write_video = sip_write,
+       .hangup = sip_hangup,                   /* called with chan locked */
+       .answer = sip_answer,                   /* called with chan locked */
+       .read = sip_read,                       /* called with chan locked */
+       .write = sip_write,                     /* called with chan locked */
+       .write_video = sip_write,               /* called with chan locked */
        .write_text = sip_write,
-       .indicate = sip_indicate,
-       .transfer = sip_transfer,
-       .fixup = sip_fixup,
-       .send_digit_begin = sip_senddigit_begin,
+       .indicate = sip_indicate,               /* called with chan locked */
+       .transfer = sip_transfer,               /* called with chan locked */
+       .fixup = sip_fixup,                     /* called with chan locked */
+       .send_digit_begin = sip_senddigit_begin,        /* called with chan 
unlocked */
        .send_digit_end = sip_senddigit_end,
-       .bridge = ast_rtp_bridge,
+       .bridge = ast_rtp_bridge,                       /* XXX chan unlocked ? 
*/
        .early_bridge = ast_rtp_early_bridge,
-       .send_text = sip_sendtext,
+       .send_text = sip_sendtext,              /* called with chan locked */
        .func_channel_read = acf_channel_read,
 };
 
@@ -1700,6 +1700,9 @@
        .send_text = sip_sendtext,
        .func_channel_read = acf_channel_read,
 };
+
+/* 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)
 
 /**--- some list management macros. **/
  
@@ -4270,10 +4273,7 @@
        }
        sip_pvt_lock(i);
 
-       if (ast_test_flag(&i->flags[0], SIP_DTMF) == SIP_DTMF_INFO)
-               tmp->tech = &sip_tech_info;
-       else
-               tmp->tech = &sip_tech;
+       tmp->tech = ast_test_flag(&i->flags[0], SIP_DTMF) == SIP_DTMF_INFO ?  
&sip_tech_info : &sip_tech;
 
        /* Select our native format based on codec preference until we receive
           something from another device to the contrary. */
@@ -12338,7 +12338,7 @@
        }
 
        ast_channel_lock(chan);
-       if (chan->tech != &sip_tech && chan->tech != &sip_tech_info) {
+       if (!IS_SIP_TECH(chan->tech)) {
                ast_log(LOG_WARNING, "This function can only be used on SIP 
channels.\n");
                ast_channel_unlock(chan);
                return -1;
@@ -12522,7 +12522,7 @@
        }
 
        ast_channel_lock(chan);
-       if (chan->tech != &sip_tech && chan->tech != &sip_tech_info) {
+       if (!IS_SIP_TECH(chan->tech)) {
                ast_log(LOG_WARNING, "This function can only be used on SIP 
channels.\n");
                ast_channel_unlock(chan);
                return -1;
@@ -12770,7 +12770,7 @@
                                ast_log(LOG_WARNING, "Ooooh.. no tech!  That's 
REALLY bad\n");
                                break;
                        }
-                       if (bridgepeer->tech == &sip_tech || bridgepeer->tech 
== &sip_tech_info) {
+                       if (IS_SIP_TECH(bridgepeer->tech)) {
                                bridgepvt = (struct 
sip_pvt*)(bridgepeer->tech_pvt);
                                if (bridgepvt->udptl) {
                                        if (p->t38.state == T38_PEER_REINVITE) {
@@ -14571,7 +14571,7 @@
                                if ((bridgepeer = 
ast_bridged_channel(p->owner))) {
                                        /* We have a bridge, and this is 
re-invite to switchover to T38 so we send re-invite with T38 SDP, to other side 
of bridge*/
                                        /*! XXX: we should also check here does 
the other side supports t38 at all !!! XXX */
-                                       if (bridgepeer->tech == &sip_tech || 
bridgepeer->tech == &sip_tech_info) {
+                                       if (IS_SIP_TECH(bridgepeer->tech)) {
                                                bridgepvt = (struct 
sip_pvt*)bridgepeer->tech_pvt;
                                                if (bridgepvt->t38.state == 
T38_DISABLED) {
                                                        if (bridgepvt->udptl) { 
/* If everything is OK with other side's udptl struct */
@@ -14621,7 +14621,7 @@
                                struct ast_channel *bridgepeer = NULL;
                                struct sip_pvt *bridgepvt = NULL;
                                if ((bridgepeer = 
ast_bridged_channel(p->owner))) {
-                                       if (bridgepeer->tech == &sip_tech || 
bridgepeer->tech == &sip_tech_info) {
+                                       if (IS_SIP_TECH(bridgepeer->tech)) {
                                                bridgepvt = (struct 
sip_pvt*)bridgepeer->tech_pvt;
                                                /* Does the bridged peer have 
T38 ? */
                                                if (bridgepvt->t38.state == 
T38_ENABLED) {
@@ -15144,7 +15144,7 @@
        AST_STANDARD_APP_ARGS(args, parse);
 
        /* Sanity check */
-       if (chan->tech != &sip_tech && chan->tech != &sip_tech_info) {
+       if (!IS_SIP_TECH(chan->tech)) {
                ast_log(LOG_ERROR, "Cannot call %s on a non-SIP channel\n", 
funcname);
                return 0;
        }
@@ -18119,7 +18119,7 @@
                return 0;
        }
        ast_channel_lock(chan);
-       if (chan->tech != &sip_tech && chan->tech != &sip_tech_info) {
+       if (!IS_SIP_TECH(chan->tech)) {
                ast_log(LOG_WARNING, "Call this application only on SIP 
incoming calls\n");
                ast_channel_unlock(chan);
                return 0;


_______________________________________________
--Bandwidth and Colocation Provided by http://www.api-digital.com--

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to