aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-08 20:44:59 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-08 20:44:59 +0000
commite5b9a56a7776941067ed1475eb0608f6208e78f9 (patch)
treea02495cfbc3f1deb78aa549d2e35675ee23b3f57 /channels
parentb27c6cd5d5efd214fe2a2d27e500c6e152a26727 (diff)
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
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_gtalk.c18
1 files 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)) {