(closes issue 0012193)
Reported by: davidw Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app git-svn-id: http://svn.digium.com/svn/asterisk/trunk@122433 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
93b3e048b8
commit
9b82566639
|
@ -113,7 +113,9 @@ static int parkandannounce_exec(struct ast_channel *chan, void *data)
|
||||||
/* we are using masq_park here to protect * from touching the channel once we park it. If the channel comes out of timeout
|
/* we are using masq_park here to protect * from touching the channel once we park it. If the channel comes out of timeout
|
||||||
before we are done announcing and the channel is messed with, Kablooeee. So we use Masq to prevent this. */
|
before we are done announcing and the channel is messed with, Kablooeee. So we use Masq to prevent this. */
|
||||||
|
|
||||||
ast_masq_park_call(chan, NULL, timeout, &lot);
|
res = ast_masq_park_call(chan, NULL, timeout, &lot);
|
||||||
|
if (res == -1)
|
||||||
|
return res;
|
||||||
|
|
||||||
ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, args.return_context);
|
ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, args.return_context);
|
||||||
|
|
||||||
|
|
|
@ -494,15 +494,28 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer
|
||||||
/* Check for channel variable PARKINGEXTEN */
|
/* Check for channel variable PARKINGEXTEN */
|
||||||
parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN");
|
parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN");
|
||||||
if (!ast_strlen_zero(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);
|
AST_LIST_UNLOCK(&parkinglot->parkings);
|
||||||
parkinglot_unref(parkinglot);
|
parkinglot_unref(parkinglot);
|
||||||
ast_free(pu);
|
ast_free(pu);
|
||||||
ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con);
|
ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con);
|
||||||
return 1; /* Continue execution if possible */
|
return 1; /* Continue execution if possible */
|
||||||
}
|
}
|
||||||
ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
|
|
||||||
x = atoi(parkingexten);
|
|
||||||
} else {
|
} else {
|
||||||
int start;
|
int start;
|
||||||
struct parkeduser *cur = NULL;
|
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 */
|
/* Set pointer for next parking */
|
||||||
if (parkinglot->parkfindnext)
|
if (parkinglot->parkfindnext)
|
||||||
parkinglot->parking_offset = x - parkinglot->parking_start + 1;
|
parkinglot->parking_offset = x - parkinglot->parking_start + 1;
|
||||||
|
snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
|
||||||
}
|
}
|
||||||
|
|
||||||
chan->appl = "Parked Call";
|
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);
|
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));
|
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",
|
manager_event(EVENT_FLAG_CALL, "ParkedCall",
|
||||||
"Exten: %s\r\n"
|
"Exten: %s\r\n"
|
||||||
"Channel: %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 */
|
if (!con) /* Still no context? Bad */
|
||||||
ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parkinglot->parking_con);
|
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 */
|
/* 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. */
|
/* 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_set_flag(peer, AST_FLAG_MASQ_NOSTREAM);
|
||||||
ast_say_digits(peer, pu->parkingnum, "", peer->language);
|
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_channel *chan;
|
||||||
struct ast_frame *f;
|
struct ast_frame *f;
|
||||||
char *orig_chan_name = NULL;
|
char *orig_chan_name = NULL;
|
||||||
|
int park_status;
|
||||||
|
|
||||||
/* Make a new, fake channel that we'll use to masquerade in the real one */
|
/* 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))) {
|
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,
|
.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;
|
return 0;
|
||||||
|
|
Reference in New Issue