[asterisk-commits] mvanbaak: branch group/multiparking r105544 - in /team/group/multiparking: ./...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Mar 1 08:08:44 CST 2008


Author: mvanbaak
Date: Sat Mar  1 08:08:43 2008
New Revision: 105544

URL: http://svn.digium.com/view/asterisk?view=rev&rev=105544
Log:
resolve, reset

Modified:
    team/group/multiparking/   (props changed)
    team/group/multiparking/apps/app_dial.c
    team/group/multiparking/include/asterisk/app.h
    team/group/multiparking/include/asterisk/global_datastores.h
    team/group/multiparking/main/app.c
    team/group/multiparking/main/features.c
    team/group/multiparking/main/global_datastores.c
    team/group/multiparking/main/slinfactory.c

Propchange: team/group/multiparking/
------------------------------------------------------------------------------
--- automerge (added)
+++ automerge Sat Mar  1 08:08:43 2008
@@ -1,0 +1,1 @@
+yes

Propchange: team/group/multiparking/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sat Mar  1 08:08:43 2008
@@ -1,1 +1,1 @@
-/trunk:1-105470
+/trunk:1-105543

Modified: team/group/multiparking/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/apps/app_dial.c?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/apps/app_dial.c (original)
+++ team/group/multiparking/apps/app_dial.c Sat Mar  1 08:08:43 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/group/multiparking/include/asterisk/app.h
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/include/asterisk/app.h?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/include/asterisk/app.h (original)
+++ team/group/multiparking/include/asterisk/app.h Sat Mar  1 08:08:43 2008
@@ -461,8 +461,16 @@
  */
 int ast_app_parse_options64(const struct ast_app_option *options, struct ast_flags64 *flags, char **args, char *optstr);
 
-/*! \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. 
+/*! \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 */
 int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect, size_t size, int maxlen, int timeout);
 

Modified: team/group/multiparking/include/asterisk/global_datastores.h
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/include/asterisk/global_datastores.h?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/include/asterisk/global_datastores.h (original)
+++ team/group/multiparking/include/asterisk/global_datastores.h Sat Mar  1 08:08:43 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/group/multiparking/main/app.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/main/app.c?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/main/app.c (original)
+++ team/group/multiparking/main/app.c Sat Mar  1 08:08:43 2008
@@ -1670,6 +1670,17 @@
 	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;
+		}
+	}
+	buf[found] = '\0';
+}
+
 int ast_get_encoded_char(const char *stream, char *result, size_t *consumed)
 {
 	int i;

Modified: team/group/multiparking/main/features.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/main/features.c?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/main/features.c (original)
+++ team/group/multiparking/main/features.c Sat Mar  1 08:08:43 2008
@@ -60,6 +60,7 @@
 #include "asterisk/devicestate.h"
 #include "asterisk/monitor.h"
 #include "asterisk/audiohook.h"
+#include "asterisk/global_datastores.h"
 #include "asterisk/astobj.h"
 
 #define DEFAULT_PARK_TIME 45000
@@ -2288,7 +2289,6 @@
 				char peername_flat[AST_MAX_EXTENSION]; /* using something like Zap/52 for an extension name is NOT a good idea */
 				int i;
 
-
 				if (cp) 
 					*cp = 0;
 				ast_copy_string(peername_flat,peername,sizeof(peername_flat));
@@ -2299,31 +2299,40 @@
 				con = ast_context_find(pu->parkinglot->parking_con_dial);
 				if (!con) {
 					con = ast_context_create(NULL, pu->parkinglot->parking_con_dial, registrar);
-					if (!con) 
+					if (!con)
 						ast_log(LOG_ERROR, "Parking dial context '%s' does not exist and unable to create\n", pu->parkinglot->parking_con_dial);
 				}
-
 				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)
-					set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername, 1);
-				else {
-					char parkingslot[AST_MAX_EXTENSION];
+				if (comebacktoorigin) {
+					set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername_flat, 1);
+				} else {
 					ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum);
 					snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum);
 					pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot);
-					set_c_e_p(chan, "parkedcallstimeout", peername, 1);
+					set_c_e_p(chan, "parkedcallstimeout", peername_flat, 1);
 				}
-
 			} else {
 				/* They've been waiting too long, send them back to where they came.  Theoretically they
-			   	should have their original extensions and such, but we copy to be on the safe side */
+				   should have their original extensions and such, but we copy to be on the safe side */
 				set_c_e_p(chan, pu->context, pu->exten, pu->priority);
-
 			}
 			post_manager_event("ParkedCallTimeOut", pu);
 

Modified: team/group/multiparking/main/global_datastores.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/main/global_datastores.c?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/main/global_datastores.c (original)
+++ team/group/multiparking/main/global_datastores.c Sat Mar  1 08:08:43 2008
@@ -35,8 +35,9 @@
 	struct ast_dialed_interface *di = NULL;
 	AST_LIST_HEAD(, ast_dialed_interface) *dialed_interface_list = data;
 	
-	if (!dialed_interface_list)
+	if (!dialed_interface_list) {
 		return;
+	}
 
 	AST_LIST_LOCK(dialed_interface_list);
 	while ((di = AST_LIST_REMOVE_HEAD(dialed_interface_list, list)))
@@ -53,11 +54,13 @@
 	AST_LIST_HEAD(, ast_dialed_interface) *old_list;
 	AST_LIST_HEAD(, ast_dialed_interface) *new_list = NULL;
 
-	if(!(old_list = data))
+	if(!(old_list = data)) {
 		return NULL;
+	}
 
-	if(!(new_list = ast_calloc(1, sizeof(*new_list))))
+	if(!(new_list = ast_calloc(1, sizeof(*new_list)))) {
 		return NULL;
+	}
 
 	AST_LIST_HEAD_INIT(new_list);
 	AST_LIST_LOCK(old_list);
@@ -76,8 +79,35 @@
 	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",
+	.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,
+};

Modified: team/group/multiparking/main/slinfactory.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/main/slinfactory.c?view=diff&rev=105544&r1=105543&r2=105544
==============================================================================
--- team/group/multiparking/main/slinfactory.c (original)
+++ team/group/multiparking/main/slinfactory.c Sat Mar  1 08:08:43 2008
@@ -56,14 +56,14 @@
 	struct ast_frame *begin_frame = f, *duped_frame = NULL, *frame_ptr;
 	unsigned int x;
 
-	if (f->subclass != AST_FORMAT_SLINEAR) {
+	if (f->subclass != AST_FORMAT_SLINEAR && f->subclass != AST_FORMAT_SLINEAR16) {
 		if (sf->trans && f->subclass != sf->format) {
 			ast_translator_free_path(sf->trans);
 			sf->trans = NULL;
 		}
 
 		if (!sf->trans) {
-			if (!(sf->trans = ast_translator_build_path(AST_FORMAT_SLINEAR, f->subclass))) {
+			if (!(sf->trans = ast_translator_build_path((f->subclass == AST_FORMAT_G722 ? AST_FORMAT_SLINEAR16 : AST_FORMAT_SLINEAR), f->subclass))) {
 				ast_log(LOG_WARNING, "Cannot build a path from %s to slin\n", ast_getformatname(f->subclass));
 				return 0;
 			}




More information about the asterisk-commits mailing list