[svn-commits] twilson: branch twilson/bug_11520-datastore_dial_features r103734 - in /team/...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Fri Feb 15 16:23:23 CST 2008
Author: twilson
Date: Fri Feb 15 16:23:23 2008
New Revision: 103734
URL: http://svn.digium.com/view/asterisk?view=rev&rev=103734
Log:
This should fix parking. Still having trouble getting the 'T' option to behave with builtin atxfer.
Modified:
team/twilson/bug_11520-datastore_dial_features/ (props changed)
team/twilson/bug_11520-datastore_dial_features/apps/app_dial.c
team/twilson/bug_11520-datastore_dial_features/include/asterisk/app.h
team/twilson/bug_11520-datastore_dial_features/include/asterisk/global_datastores.h
team/twilson/bug_11520-datastore_dial_features/main/app.c
team/twilson/bug_11520-datastore_dial_features/main/features.c
team/twilson/bug_11520-datastore_dial_features/main/global_datastores.c
Propchange: team/twilson/bug_11520-datastore_dial_features/
------------------------------------------------------------------------------
automerge = *
Modified: team/twilson/bug_11520-datastore_dial_features/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/apps/app_dial.c?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/apps/app_dial.c (original)
+++ team/twilson/bug_11520-datastore_dial_features/apps/app_dial.c Fri Feb 15 16:23:23 2008
@@ -1208,6 +1208,19 @@
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 @@
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 @@
}
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 @@
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) {
@@ -1465,6 +1505,30 @@
ast_copy_string(tc->exten, chan->macroexten, sizeof(tc->exten));
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 */
Modified: team/twilson/bug_11520-datastore_dial_features/include/asterisk/app.h
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/include/asterisk/app.h?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/include/asterisk/app.h (original)
+++ team/twilson/bug_11520-datastore_dial_features/include/asterisk/app.h Fri Feb 15 16:23:23 2008
@@ -461,6 +461,14 @@
*/
int ast_app_parse_options64(const struct ast_app_option *options, struct ast_flags64 *flags, char **args, char *optstr);
+/*! \brief Given a list of options array, return an option string based on passed flags
+ \param options The array of possible options declared with AST_APP_OPTIONS
+ \param flags The flags of the options that you wish to populate the buffer with
+ \param buf The buffer to fill with the string of options
+ \param len The maximum length of buf
+*/
+void ast_app_options2str64(const struct ast_app_option *options, struct ast_flags64 *flags, char *buf, size_t len);
+
/*! \brief Present a dialtone and collect a certain length extension.
\return Returns 1 on valid extension entered, -1 on hangup, or 0 on invalid extension.
\note Note that if 'collect' holds digits already, new digits will be appended, so be sure it's initialized properly */
Modified: team/twilson/bug_11520-datastore_dial_features/include/asterisk/global_datastores.h
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/include/asterisk/global_datastores.h?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/include/asterisk/global_datastores.h (original)
+++ team/twilson/bug_11520-datastore_dial_features/include/asterisk/global_datastores.h Fri Feb 15 16:23:23 2008
@@ -26,11 +26,22 @@
#include "asterisk/channel.h"
+#define MAX_DIAL_FEATURE_OPTIONS 30
+
extern const struct ast_datastore_info dialed_interface_info;
+
+extern const struct ast_datastore_info dial_features_info;
struct ast_dialed_interface {
AST_LIST_ENTRY(ast_dialed_interface) list;
char interface[1];
};
+struct ast_dial_features {
+ struct ast_flags features_caller;
+ struct ast_flags features_callee;
+ char options[MAX_DIAL_FEATURE_OPTIONS];
+ int is_caller;
+};
+
#endif
Modified: team/twilson/bug_11520-datastore_dial_features/main/app.c
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/main/app.c?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/main/app.c (original)
+++ team/twilson/bug_11520-datastore_dial_features/main/app.c Fri Feb 15 16:23:23 2008
@@ -1670,6 +1670,16 @@
return res;
}
+void ast_app_options2str64(const struct ast_app_option *options, struct ast_flags64 *flags, char *buf, size_t len)
+{
+ unsigned int i, found = 0;
+ for (i =32; i < 128 && found < len; i++) {
+ if (ast_test_flag64(flags, options[i].flag)) {
+ buf[found++] = i;
+ }
+ }
+}
+
int ast_get_encoded_char(const char *stream, char *result, size_t *consumed)
{
int i;
Modified: team/twilson/bug_11520-datastore_dial_features/main/features.c
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/main/features.c?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/main/features.c (original)
+++ team/twilson/bug_11520-datastore_dial_features/main/features.c Fri Feb 15 16:23:23 2008
@@ -53,6 +53,7 @@
#include "asterisk/devicestate.h"
#include "asterisk/monitor.h"
#include "asterisk/audiohook.h"
+#include "asterisk/global_datastores.h"
#define DEFAULT_PARK_TIME 45000
#define DEFAULT_TRANSFER_DIGIT_TIMEOUT 3000
@@ -1697,7 +1698,7 @@
if ((chan = ast_request(type, format, data, &cause))) {
ast_set_callerid(chan, cid_num, cid_name, cid_num);
- ast_channel_inherit_variables(caller, chan);
+ ast_channel_inherit_variables(caller, chan);
pbx_builtin_setvar_helper(chan, "TRANSFERERNAME", caller->name);
if (!chan->cdr) {
chan->cdr=ast_cdr_alloc();
@@ -2231,7 +2232,21 @@
}
if (con) {
char returnexten[AST_MAX_EXTENSION];
- snprintf(returnexten, sizeof(returnexten), "%s,,t", peername);
+ struct ast_datastore *features_datastore;
+ struct ast_dial_features *dialfeatures = NULL;
+
+ ast_channel_lock(chan);
+
+ if ((features_datastore = ast_channel_datastore_find(chan, &dial_features_info, NULL)))
+ dialfeatures = features_datastore->data;
+
+ ast_channel_unlock(chan);
+
+ if (dialfeatures)
+ snprintf(returnexten, sizeof(returnexten), "%s,,%s", peername, dialfeatures->options);
+ else /* Existing default */
+ snprintf(returnexten, sizeof(returnexten), "%s,,t", peername);
+
ast_add_extension2(con, 1, peername_flat, 1, NULL, NULL, "Dial", ast_strdup(returnexten), ast_free_ptr, registrar);
}
if (comebacktoorigin) {
Modified: team/twilson/bug_11520-datastore_dial_features/main/global_datastores.c
URL: http://svn.digium.com/view/asterisk/team/twilson/bug_11520-datastore_dial_features/main/global_datastores.c?view=diff&rev=103734&r1=103733&r2=103734
==============================================================================
--- team/twilson/bug_11520-datastore_dial_features/main/global_datastores.c (original)
+++ team/twilson/bug_11520-datastore_dial_features/main/global_datastores.c Fri Feb 15 16:23:23 2008
@@ -76,8 +76,33 @@
return new_list;
}
+
+static void *dial_features_duplicate(void *data)
+{
+ struct ast_dial_features *df = data, *df_copy;
+
+ if (!(df_copy = ast_calloc(1, sizeof(*df))))
+ return NULL;
+
+ memcpy(df_copy, df, sizeof(*df));
+
+ return df_copy;
+}
+
+static void dial_features_destroy(void *data) {
+ struct ast_dial_features *df = data;
+ if (df)
+ ast_free(df);
+}
+
const struct ast_datastore_info dialed_interface_info = {
.type ="dialed-interface",
.destroy = dialed_interface_destroy,
.duplicate = dialed_interface_duplicate,
};
+
+const struct ast_datastore_info dial_features_info = {
+ .type="dial-features",
+ .destroy = dial_features_destroy,
+ .duplicate = dial_features_duplicate,
+};
More information about the svn-commits
mailing list