Merged revisions 290973 via svnmerge from
authorDavid Vossel <dvossel@digium.com>
Fri, 8 Oct 2010 20:45:49 +0000 (20:45 +0000)
committerDavid Vossel <dvossel@digium.com>
Fri, 8 Oct 2010 20:45:49 +0000 (20:45 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r290973 | dvossel | 2010-10-08 15:44:59 -0500 (Fri, 08 Oct 2010) | 12 lines

  Make outbound Google Voice calls.

  This patch allows for outbound Google Voice calls to be
  dialed from Asterisk using chan_gtalk. Below is an example
  dialstring.

  exten -> blah,1,Dial(Gtalk/asterisk/+15552225555@voice.google.com,,)

  In this example, 'asterisk' is the jabber.conf profile configured
  to connect to your gmail account. In order to receive Google Voice
  calls make sure to enable 'allowguest=yes' in gtalk.conf.
........

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

channels/chan_gtalk.c

index 4d9695b..1aad3fb 100644 (file)
@@ -99,6 +99,8 @@ enum gtalk_client_type {
        AJI_CLIENT_UNKNOWN,
        AJI_CLIENT_GTALK,               /*!< Remote client type is GoogleTalk */
        AJI_CLIENT_GMAIL,               /*!< Remote client type is Gmail */
+       AJI_CLIENT_GOOGLE_VOICE,/*!< Remote client type is Google Voice*/
+
 };
 
 struct gtalk_pvt {
@@ -442,7 +444,9 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in
        iks_insert_attrib(gtalk, "id", sid);
        iks_insert_node(iq, gtalk);
        iks_insert_node(gtalk, dcodecs);
-       iks_insert_node(gtalk, transport);
+       if (p->ctype != AJI_CLIENT_GOOGLE_VOICE) {
+               iks_insert_node(gtalk, transport);
+       }
        iks_insert_node(dcodecs, payload_telephone);
 
        ast_aji_send(client->connection, iq);
@@ -950,6 +954,7 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const
        char idroster[200];
        char *data, *exten = NULL;
        struct ast_sockaddr bindaddr_tmp;
+       enum gtalk_client_type ctype = AJI_CLIENT_UNKNOWN;
 
        ast_debug(1, "The client is %s for alloc\n", client->name);
        if (!sid && !strchr(them, '/')) {       /* I started call! */
@@ -970,6 +975,12 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const
                }
                if (resources) {
                        snprintf(idroster, sizeof(idroster), "%s/%s", them, resources->resource);
+                       if (strstr(resources->resource, "gmail")) {
+                               ctype = AJI_CLIENT_GMAIL;
+                       }
+               } else if ((*them == '+') || (strstr(them, "@voice.google.com"))) {
+                       snprintf(idroster, sizeof(idroster), "%s/srvres", them);
+                       ctype = AJI_CLIENT_GOOGLE_VOICE;
                } else {
                        ast_log(LOG_ERROR, "no gtalk capable clients to talk to.\n");
                        return NULL;
@@ -979,7 +990,7 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const
                return NULL;
        }
        /* set client type to unknown until we have more info */
-       tmp->ctype = AJI_CLIENT_UNKNOWN;
+       tmp->ctype = ctype;
 
        memcpy(&tmp->prefs, &client->prefs, sizeof(struct ast_codec_pref));
 
@@ -1216,8 +1227,9 @@ static int gtalk_newcall(struct gtalk *client, ikspak *pak)
 
        /* Make sure our new call doesn't exist yet */
        from = iks_find_attrib(pak->x,"to");
-       if(!from)
+       if(!from) {
                from = client->connection->jid->full;
+       }
 
        while (tmp) {
                if (iks_find_with_attrib(pak->x, "session", "id", tmp->sid) || !strcmp(iks_find_attrib(pak->query, "id"), tmp->sid)) {