Update spiral support in trunk and 1.6.X to match what is in 1.4.
authorMark Michelson <mmichelson@digium.com>
Tue, 12 May 2009 20:28:13 +0000 (20:28 +0000)
committerMark Michelson <mmichelson@digium.com>
Tue, 12 May 2009 20:28:13 +0000 (20:28 +0000)
In 1.4, a SIP spiral is treated the same way as a call forward. This
works much better than what is currently in trunk and 1.6.X. The code
in trunk and 1.6.X did not create a new call to the recipient of the spiral,
instead trying to continue the same call. In addition to just being plain
wrong, this also had the side effect of only being able to spiral calls
to other SIP channels.

With this in place, as long as call forwards are honored, SIP spirals
will work properly. This means that it will work for outbound calls
made  by the Queue, Dial, and Page applications. For originated calls and
spool calls, however, the spiral will not work properly until a generic
call forward mechanism is introduced into Asterisk.

(relates to issue #13630)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@193954 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 089abef..7e58f7f 100644 (file)
@@ -19400,10 +19400,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        char *uri = ast_strdupa(this_rlPart2);
                        char *at = strchr(uri, '@');
                        char *peerorhost;
-                       struct sip_pkt *pkt = NULL;
-                       if (option_debug > 2) {
-                               ast_log(LOG_DEBUG, "Potential spiral detected. Original RURI was %s, new RURI is %s\n", initial_rlPart2, this_rlPart2);
-                       }
+                       ast_debug(2, "Potential spiral detected. Original RURI was %s, new RURI is %s\n", initial_rlPart2, this_rlPart2);
                        if (at) {
                                *at = '\0';
                        }
@@ -19411,14 +19408,12 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        if ((peerorhost = strchr(uri, ':'))) {
                                *peerorhost++ = '\0';
                        }
-                       create_addr(p, peerorhost, NULL, 0);
                        ast_string_field_set(p, theirtag, NULL);
-                       for (pkt = p->packets; pkt; pkt = pkt->next) {
-                               if (pkt->seqno == p->icseq && pkt->method == SIP_INVITE) {
-                                       AST_SCHED_DEL(sched, pkt->retransid);
-                               }
-                       }
-                       return transmit_invite(p, SIP_INVITE, 1, 3);
+                       /* Treat this as if there were a call forward instead...
+                        */
+                       ast_string_field_set(p->owner, call_forward, peerorhost);
+                       ast_queue_control(p->owner, AST_CONTROL_BUSY);
+                       return 0;
                }
        }