mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	First pass at BYE/Also transfer
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1423 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -3628,6 +3628,47 @@ static int get_refer_info(struct sip_pvt *p, struct sip_request *oreq) | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| static int get_also_info(struct sip_pvt *p, struct sip_request *oreq) | ||||
| { | ||||
| 	char tmp[256] = "", *c, *a; | ||||
| 	struct sip_request *req; | ||||
| 	 | ||||
| 	req = oreq; | ||||
| 	if (!req) | ||||
| 		req = &p->initreq; | ||||
| 	strncpy(tmp, get_header(req, "Also"), sizeof(tmp) - 1); | ||||
| 	 | ||||
| 	c = ditch_braces(tmp); | ||||
| 	 | ||||
| 		 | ||||
| 	if (strncmp(c, "sip:", 4)) { | ||||
| 		ast_log(LOG_WARNING, "Huh?  Not a SIP header (%s)?\n", c); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	c += 4; | ||||
| 	if ((a = strchr(c, '@'))) | ||||
| 		*a = '\0'; | ||||
| 	if ((a = strchr(c, ';')))  | ||||
| 		*a = '\0'; | ||||
| 	 | ||||
| 	if (sipdebug) { | ||||
| 		ast_verbose("Looking for %s in %s\n", c, p->context); | ||||
| 	} | ||||
| 	if (ast_exists_extension(NULL, p->context, c, 1, NULL)) { | ||||
| 		/* This is an unsupervised transfer */ | ||||
| 		ast_log(LOG_DEBUG,"Assigning Extension %s to REFER-TO\n", c); | ||||
| 		strncpy(p->refer_to, c, sizeof(p->refer_to) - 1); | ||||
| 		strncpy(p->referred_by, "", sizeof(p->referred_by) - 1); | ||||
| 		strncpy(p->refer_contact, "", sizeof(p->refer_contact) - 1); | ||||
| 		strncpy(p->remote_party_id, "", sizeof(p->remote_party_id) - 1); | ||||
| 		p->refer_call = NULL; | ||||
| 		return 0; | ||||
| 	} else if (ast_canmatch_extension(NULL, p->context, c, 1, NULL)) { | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| static int check_via(struct sip_pvt *p, struct sip_request *req) | ||||
| { | ||||
| @@ -4631,6 +4672,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc | ||||
| 	char *from; | ||||
| 	char *e; | ||||
| 	struct ast_channel *c=NULL; | ||||
| 	struct ast_channel *transfer_to; | ||||
| 	int seqno; | ||||
| 	int len; | ||||
| 	int ignore=0; | ||||
| @@ -4862,7 +4904,6 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc | ||||
| 			} | ||||
| 		} | ||||
| 	} else if (!strcasecmp(cmd, "REFER")) { | ||||
| 		struct ast_channel *transfer_to; | ||||
| 		ast_log(LOG_DEBUG, "We found a REFER!\n"); | ||||
| 		if (!strlen(p->context)) | ||||
| 			strncpy(p->context, context, sizeof(p->context) - 1); | ||||
| @@ -4920,7 +4961,28 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc | ||||
| 			/* Immediately stop VRTP */ | ||||
| 			ast_rtp_stop(p->vrtp); | ||||
| 		} | ||||
| 		if (p->owner) | ||||
| 		if (strlen(get_header(req, "Also"))) { | ||||
| 			ast_log(LOG_NOTICE, "Client '%s' using depreciated BYE/Also transfer method.  Ask vendor to support REFER instead\n", | ||||
| 				inet_ntoa(p->recv.sin_addr)); | ||||
| 			if (!strlen(p->context)) | ||||
| 				strncpy(p->context, context, sizeof(p->context) - 1); | ||||
| 			res = get_refer_info(p, req); | ||||
| 			if (!res) { | ||||
| 				c = p->owner; | ||||
| 				if (c) { | ||||
| 					transfer_to = c->bridge; | ||||
| 					if (transfer_to) { | ||||
| 						/* Don't actually hangup here... */ | ||||
| 						ast_moh_stop(transfer_to); | ||||
| 						ast_async_goto(transfer_to,p->context, p->refer_to,1, 1); | ||||
| 					} else | ||||
| 						ast_queue_hangup(p->owner, 0); | ||||
| 				} | ||||
| 			} else { | ||||
| 				ast_log(LOG_WARNING, "Invalid transfer information from '%s'\n", inet_ntoa(p->recv.sin_addr)); | ||||
| 				ast_queue_hangup(p->owner, 0); | ||||
| 			} | ||||
| 		} else if (p->owner) | ||||
| 			ast_queue_hangup(p->owner, 0); | ||||
| 		transmit_response(p, "200 OK", req); | ||||
| 	} else if (!strcasecmp(cmd, "MESSAGE")) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user