From e5b9a56a7776941067ed1475eb0608f6208e78f9 Mon Sep 17 00:00:00 2001 From: dvossel Date: Fri, 8 Oct 2010 20:44:59 +0000 Subject: 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: http://svn.digium.com/svn/asterisk/branches/1.8@290973 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_gtalk.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index 4d9695b25..1aad3fbc2 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -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)) { -- cgit v1.2.3