]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fixes issue with outbound google voice calls not working.
authorDavid Vossel <dvossel@digium.com>
Thu, 9 Dec 2010 21:32:20 +0000 (21:32 +0000)
committerDavid Vossel <dvossel@digium.com>
Thu, 9 Dec 2010 21:32:20 +0000 (21:32 +0000)
Thanks to az1234 and nevermind_quack for their input in helping debug the issue.

(closes issue #18412)
Reported by: nevermind_quack
Patches:
      fix uploaded by dvossel (license 671)

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

channels/chan_gtalk.c

index 05d493a00913f43d0aa2cea4f640920032cee844..a4a8683f2c15334e0816e70105d88fb713992585 100644 (file)
@@ -193,6 +193,8 @@ static int gtalk_update_stun(struct gtalk *client, struct gtalk_pvt *p);
 /* static char *gtalk_do_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); */
 static char *gtalk_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 static int gtalk_update_externip(void);
+static int gtalk_parser(void *data, ikspak *pak);
+static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, char *sid, char *from, char *to);
 
 /*! \brief PBX interface structure for channel registration */
 static const struct ast_channel_tech gtalk_tech = {
@@ -458,12 +460,46 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in
 static int gtalk_ringing_ack(void *data, ikspak *pak)
 {
        struct gtalk_pvt *p = data;
+       struct ast_channel *owner;
 
-       if (p->ringrule)
+       ast_mutex_lock(&p->lock);
+
+       if (p->ringrule) {
                iks_filter_remove_rule(p->parent->connection->f, p->ringrule);
+       }
        p->ringrule = NULL;
-       if (p->owner)
-               ast_queue_control(p->owner, AST_CONTROL_RINGING);
+
+       /* this may be a redirect */
+       if (!strcmp(S_OR(iks_find_attrib(pak->x, "type"), ""), "error")) {
+               char *name = NULL;
+               char *redirect = NULL;
+               iks *traversenodes = NULL;
+               traversenodes = pak->query;
+               while (traversenodes) {
+                       if (!(name = iks_name(traversenodes))) {
+                               break;
+                       }
+                       if (!strcasecmp(name, "error") &&
+                               (redirect = iks_find_cdata(traversenodes, "redirect")) &&
+                               (redirect = strstr(redirect, "xmpp:"))) {
+                               redirect += 5;
+                               ast_log(LOG_DEBUG, "redirect %s\n", redirect);
+                               ast_copy_string(p->them, redirect, sizeof(p->them));
+
+                               gtalk_invite(p, p->them, p->us, p->sid, 1);
+                               break;
+                       }
+                       traversenodes = iks_next_tag(traversenodes);
+               }
+       }
+       gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us);
+       owner = p->owner;
+       ast_mutex_unlock(&p->lock);
+
+       if (owner) {
+               ast_queue_control(owner, AST_CONTROL_RINGING);
+       }
+
        return IKS_FILTER_EAT;
 }
 
@@ -965,7 +1001,7 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const
                if (resources) {
                        snprintf(idroster, sizeof(idroster), "%s/%s", them, resources->resource);
                } else if ((*them == '+') || (strstr(them, "@voice.google.com"))) {
-                       snprintf(idroster, sizeof(idroster), "%s/srvres", them);
+                       snprintf(idroster, sizeof(idroster), "%s", them);
                } else {
                        ast_log(LOG_ERROR, "no gtalk capable clients to talk to.\n");
                        return NULL;
@@ -1775,7 +1811,6 @@ static int gtalk_call(struct ast_channel *ast, char *dest, int timeout)
        }
 
        gtalk_invite(p, p->them, p->us, p->sid, 1);
-       gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us);
 
        return 0;
 }