mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 02:57:23 +00:00
Asterisk, when parking can drop rights a caller when a parking timeout occurs. Also, when doing built-in attended transfers, sometimes incorrectly passes rights from the transferrer to the transferee. This patch tries to fixes the parking issue and lays some groundwork for later fixing the transfer issue.
(closes issue #11520) Reported by: pliew Tested by: otherwiseguy git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@105477 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -1208,6 +1208,19 @@ static int setup_privacy_args(struct privacy_args *pa,
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
static void set_dial_features(struct ast_flags64 *opts, struct ast_dial_features *features)
|
||||
{
|
||||
struct ast_flags64 perm_opts = {.flags = 0};
|
||||
|
||||
ast_copy_flags64(&perm_opts, opts,
|
||||
OPT_CALLER_TRANSFER | OPT_CALLER_PARK | OPT_CALLER_MONITOR | OPT_CALLER_MIXMONITOR | OPT_CALLER_HANGUP |
|
||||
OPT_CALLEE_TRANSFER | OPT_CALLEE_PARK | OPT_CALLEE_MONITOR | OPT_CALLEE_MIXMONITOR | OPT_CALLEE_HANGUP);
|
||||
|
||||
memset(features->options, 0, sizeof(features->options));
|
||||
|
||||
ast_app_options2str64(dial_exec_options, &perm_opts, features->options, sizeof(features->options));
|
||||
}
|
||||
|
||||
static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags64 *peerflags, int *continue_exec)
|
||||
{
|
||||
int res = -1; /* default: error */
|
||||
@@ -1243,6 +1256,9 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
struct ast_flags64 opts = { 0, };
|
||||
char *opt_args[OPT_ARG_ARRAY_SIZE];
|
||||
struct ast_datastore *datastore = NULL;
|
||||
struct ast_datastore *ds_caller_features = NULL;
|
||||
struct ast_datastore *ds_callee_features = NULL;
|
||||
struct ast_dial_features *caller_features;
|
||||
int fulldial = 0, num_dialed = 0;
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
@@ -1316,6 +1332,29 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
}
|
||||
|
||||
ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING);
|
||||
|
||||
/* Create datastore for channel dial features for caller */
|
||||
if (!(ds_caller_features = ast_channel_datastore_alloc(&dial_features_info, NULL))) {
|
||||
ast_log(LOG_WARNING, "Unable to create channel datastore for dial features. Aborting!\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(caller_features = ast_malloc(sizeof(*caller_features)))) {
|
||||
ast_log(LOG_WARNING, "Unable to allocate memory for feature flags. Aborting!\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ast_copy_flags(&(caller_features->features_callee), &(config.features_caller), AST_FLAGS_ALL);
|
||||
caller_features->is_caller = 1;
|
||||
set_dial_features(&opts, caller_features);
|
||||
|
||||
ds_caller_features->inheritance = DATASTORE_INHERIT_FOREVER;
|
||||
ds_caller_features->data = caller_features;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
ast_channel_datastore_add(chan, ds_caller_features);
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
/* loop through the list of dial destinations */
|
||||
rest = args.peers;
|
||||
while ((cur = strsep(&rest, "&")) ) {
|
||||
@@ -1327,6 +1366,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
char *tech = strsep(&number, "/");
|
||||
/* find if we already dialed this interface */
|
||||
struct ast_dialed_interface *di;
|
||||
struct ast_dial_features *callee_features;
|
||||
AST_LIST_HEAD(, ast_dialed_interface) *dialed_interfaces;
|
||||
num_dialed++;
|
||||
if (!number) {
|
||||
@@ -1466,6 +1506,30 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
else
|
||||
ast_copy_string(tc->exten, chan->exten, sizeof(tc->exten));
|
||||
|
||||
/* Save callee features */
|
||||
if (!(ds_callee_features = ast_channel_datastore_alloc(&dial_features_info, NULL))) {
|
||||
ast_log(LOG_WARNING, "Unable to create channel datastore for dial features. Aborting!\n");
|
||||
ast_free(tmp);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(callee_features = ast_malloc(sizeof(*callee_features)))) {
|
||||
ast_log(LOG_WARNING, "Unable to allocate memory for feature flags. Aborting!\n");
|
||||
ast_free(tmp);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ast_copy_flags(&(callee_features->features_callee), &(config.features_callee), AST_FLAGS_ALL);
|
||||
callee_features->is_caller = 0;
|
||||
set_dial_features(&opts, callee_features);
|
||||
|
||||
ds_callee_features->inheritance = DATASTORE_INHERIT_FOREVER;
|
||||
ds_callee_features->data = callee_features;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
ast_channel_datastore_add(tc, ds_callee_features);
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
res = ast_call(tc, numsubst, 0); /* Place the call, but don't wait on the answer */
|
||||
|
||||
/* Save the info in cdr's that we called them */
|
||||
|
Reference in New Issue
Block a user