mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Fixes issue with outbound google voice calls not working.
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
This commit is contained in:
		| @@ -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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user