mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	(closes issue 0012193)
Reported by: davidw Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122433 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -494,15 +494,28 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer | ||||
| 	/* Check for channel variable PARKINGEXTEN */ | ||||
| 	parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN"); | ||||
| 	if (!ast_strlen_zero(parkingexten)) { | ||||
| 		if (ast_exists_extension(NULL, parkinglot->parking_con, parkingexten, 1, NULL)) { | ||||
| 		/*!\note The API forces us to specify a numeric parking slot, even | ||||
| 		 * though the architecture would tend to support non-numeric extensions | ||||
| 		 * (as are possible with SIP, for example).  Hence, we enforce that | ||||
| 		 * limitation here.  If extout was not numeric, we could permit | ||||
| 		 * arbitrary non-numeric extensions. | ||||
| 		 */ | ||||
|         if (sscanf(parkingexten, "%d", &x) != 1 || x < 0) { | ||||
| 			AST_LIST_UNLOCK(&parkinglot->parkings); | ||||
| 			parkinglot_unref(parkinglot); | ||||
|             free(pu); | ||||
|             ast_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten); | ||||
|             return 1;   /* Continue execution if possible */ | ||||
|         } | ||||
|         snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); | ||||
|  | ||||
| 		if (ast_exists_extension(NULL, parkinglot->parking_con, pu->parkingexten, 1, NULL)) { | ||||
| 			AST_LIST_UNLOCK(&parkinglot->parkings); | ||||
| 			parkinglot_unref(parkinglot); | ||||
| 			ast_free(pu); | ||||
| 			ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con); | ||||
| 			return 1;	/* Continue execution if possible */ | ||||
| 		} | ||||
| 		ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten)); | ||||
| 		x = atoi(parkingexten); | ||||
| 	} else { | ||||
| 		int start; | ||||
| 		struct parkeduser *cur = NULL; | ||||
| @@ -544,6 +557,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer | ||||
| 		/* Set pointer for next parking */ | ||||
| 		if (parkinglot->parkfindnext)  | ||||
| 			parkinglot->parking_offset = x - parkinglot->parking_start + 1; | ||||
| 		snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); | ||||
| 	} | ||||
| 	 | ||||
| 	chan->appl = "Parked Call"; | ||||
| @@ -595,8 +609,6 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer | ||||
| 	pthread_kill(parking_thread, SIGURG); | ||||
| 	ast_verb(2, "Parked %s on %d (lot %s). Will timeout back to extension [%s] %s, %d in %d seconds\n", pu->chan->name, pu->parkingnum, parkinglot->name, pu->context, pu->exten, pu->priority, (pu->parkingtime/1000)); | ||||
|  | ||||
| 	if (pu->parkingnum != -1) | ||||
| 		snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); | ||||
| 	manager_event(EVENT_FLAG_CALL, "ParkedCall", | ||||
| 		"Exten: %s\r\n" | ||||
| 		"Channel: %s\r\n" | ||||
| @@ -620,7 +632,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer | ||||
| 	if (!con)	/* Still no context? Bad */ | ||||
| 		ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parkinglot->parking_con); | ||||
| 	/* Tell the peer channel the number of the parking space */ | ||||
| 	if (peer && ((pu->parkingnum != -1 && ast_strlen_zero(args->orig_chan_name)) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */ | ||||
| 	if (peer && (ast_strlen_zero(args->orig_chan_name) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */ | ||||
| 		/* If a channel is masqueraded into peer while playing back the parking slot number do not continue playing it back. This is the case if an attended transfer occurs. */ | ||||
| 		ast_set_flag(peer, AST_FLAG_MASQ_NOSTREAM); | ||||
| 		ast_say_digits(peer, pu->parkingnum, "", peer->language); | ||||
| @@ -658,6 +670,7 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int | ||||
| 	struct ast_channel *chan; | ||||
| 	struct ast_frame *f; | ||||
| 	char *orig_chan_name = NULL; | ||||
| 	int park_status; | ||||
|  | ||||
| 	/* Make a new, fake channel that we'll use to masquerade in the real one */ | ||||
| 	if (!(chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, rchan->accountcode, rchan->exten, rchan->context, rchan->amaflags, "Parked/%s",rchan->name))) { | ||||
| @@ -686,7 +699,12 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int | ||||
| 			.orig_chan_name = orig_chan_name, | ||||
| 		}; | ||||
|  | ||||
| 		ast_park_call_full(chan, peer, &args); | ||||
| 		park_status = ast_park_call_full(chan, peer, &args); | ||||
| 		if (park_status == 1) { | ||||
| 		/* would be nice to play "invalid parking extension" */ | ||||
| 			ast_hangup(chan); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user