aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_dial.c
diff options
context:
space:
mode:
authortwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-11 23:47:23 +0000
committertwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-11 23:47:23 +0000
commit54034751542eb884cb134a826244eca9680765ea (patch)
treebe1898af8b75b8f1bfe8692a851dcede310ecaa8 /apps/app_dial.c
parent02e87fc6524c2df91cfa8662689f3b33985e3eae (diff)
Backport fix for 11520--for some reason I didn't do this back in February when I patched for trunk.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@121992 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_dial.c')
-rw-r--r--apps/app_dial.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index d5e5fe8c9..bf98a3216 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -789,6 +789,19 @@ static int valid_priv_reply(struct ast_flags *opts, int res)
return 0;
}
+static void set_dial_features(struct ast_flags *opts, struct ast_dial_features *features)
+{
+ struct ast_flags perm_opts = {.flags = 0};
+
+ ast_copy_flags(&perm_opts, opts,
+ OPT_CALLER_TRANSFER | OPT_CALLER_PARK | OPT_CALLER_MONITOR | OPT_CALLER_HANGUP |
+ OPT_CALLEE_TRANSFER | OPT_CALLEE_PARK | OPT_CALLEE_MONITOR | OPT_CALLEE_HANGUP);
+
+ memset(features->options, 0, sizeof(features->options));
+
+ ast_app_options2str(dial_exec_options, &perm_opts, features->options, sizeof(features->options));
+}
+
static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags *peerflags, int *continue_exec)
{
int res = -1;
@@ -831,6 +844,9 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
struct ast_flags 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)) {
@@ -1086,6 +1102,28 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
}
ast_copy_flags(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;
+ }
+
+ 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, "&")) ) {
@@ -1096,6 +1134,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) {
@@ -1245,6 +1284,30 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
else
ast_copy_string(tmp->chan->exten, chan->exten, sizeof(tmp->chan->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;
+ }
+
+ 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(tmp->chan);
+ ast_channel_datastore_add(tmp->chan, ds_callee_features);
+ ast_channel_unlock(tmp->chan);
+
+
/* Place the call, but don't wait on the answer */
res = ast_call(tmp->chan, numsubst, 0);