[svn-commits] branch oej/multiparking - r7721 in /team/oej/multiparking: ./ res/

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon Jan 2 13:42:26 CST 2006


Author: oej
Date: Mon Jan  2 13:42:23 2006
New Revision: 7721

URL: http://svn.digium.com/view/asterisk?rev=7721&view=rev
Log:
- Fix AST_LIST implementation
- Add default parking lot as standard configuration (backwards compatibility)


Modified:
    team/oej/multiparking/Makefile
    team/oej/multiparking/res/res_features.c

Modified: team/oej/multiparking/Makefile
URL: http://svn.digium.com/view/asterisk/team/oej/multiparking/Makefile?rev=7721&r1=7720&r2=7721&view=diff
==============================================================================
--- team/oej/multiparking/Makefile (original)
+++ team/oej/multiparking/Makefile Mon Jan  2 13:42:23 2006
@@ -44,7 +44,7 @@
 #K6OPT  = -DK6OPT
 
 #Tell gcc to optimize the code
-OPTIMIZE+=-O6
+OPTIMIZE+=#-O6
 else
   # Stack backtraces, while useful for debugging, are incompatible with optimizations
   ifeq (${OSARCH},Linux)

Modified: team/oej/multiparking/res/res_features.c
URL: http://svn.digium.com/view/asterisk/team/oej/multiparking/res/res_features.c?rev=7721&r1=7720&r2=7721&view=diff
==============================================================================
--- team/oej/multiparking/res/res_features.c (original)
+++ team/oej/multiparking/res/res_features.c Mon Jan  2 13:42:23 2006
@@ -212,7 +212,7 @@
 
 /* Forward declarations */
 int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer, int timeout, int *extout, struct ast_parkinglot *parkinglot);
-struct ast_parkinglot *find_parkinglot(char *name);
+struct ast_parkinglot *find_parkinglot(const char *name);
 
 /*! If GOTO_ON_BLINDXFR is set, transferer in a blind transfer will be sent there. */
 static void check_goto_on_transfer(struct ast_channel *chan) 
@@ -314,11 +314,11 @@
 	int i, x, parking_range;
 	char exten[AST_MAX_EXTENSION];
 	struct ast_context *con;
-	char *parkinglotname;
+	const char *parkinglotname;
 	
 
 	if (!parkinglot)
-		parkinglot = &default_parkinglot;
+		parkinglot = default_parkinglot;
 	parkinglotname = pbx_builtin_getvar_helper(chan, "PARKINGLOT");
 	if (parkinglotname) {
 		if (option_debug)
@@ -1543,7 +1543,7 @@
 	char *peername,*cp;
 	char returnexten[AST_MAX_EXTENSION];
 	struct ast_context *con;
-	struct ast_parkinglot *curlot = &default_parkinglot;
+	struct ast_parkinglot *curlot;
 	int x;
 	fd_set rfds, efds;
 	fd_set nrfds, nefds;
@@ -1556,7 +1556,7 @@
 		ast_mutex_lock(&parking_lock);
 		pl = NULL;
 		/* We need to do this for every parking lot */
-		while (curlot) {
+		AST_LIST_TRAVERSE(&parkinglots, curlot, list) {
 			pu = curlot->occupiedlots;
 			FD_ZERO(&nrfds);
 			FD_ZERO(&nefds);
@@ -1689,7 +1689,7 @@
 						}
 					}
 					if (x >= AST_MAX_FDS) {
-	std:					for (x=0; x<AST_MAX_FDS; x++) {
+	std:					for (x=0; x < AST_MAX_FDS; x++) {
 							/* Keep this one for next one */
 							if (pu->chan->fds[x] > -1) {
 								FD_SET(pu->chan->fds[x], &nrfds);
@@ -1706,7 +1706,6 @@
 					}
 				}
 			}
-			curlot = curlot -> next;
 		}
 		ast_mutex_unlock(&parking_lock);
 		rfds = nrfds;
@@ -1720,7 +1719,7 @@
 }
 
 /*--- find_parkinglot: Find parkinglot by name */
-struct ast_parkinglot *find_parkinglot(char *name)
+struct ast_parkinglot *find_parkinglot(const char *name)
 {
 	struct ast_parkinglot *parkinglot = NULL;
 	
@@ -1746,7 +1745,8 @@
 	   lot context eventually */
 	int res=0;
 	struct localuser *u;
-	char *parkinglotname = DEFAULT_PARKINGLOT;
+	const char *parkinglotname = DEFAULT_PARKINGLOT;
+	struct ast_parkinglot *parkinglot = NULL;
 
 	LOCAL_USER_ADD(u);
 	parkinglotname = pbx_builtin_getvar_helper(chan, "PARKINGLOT");
@@ -1778,7 +1778,7 @@
 	struct ast_channel *peer=NULL;
 	struct parkeduser *pu, *pl=NULL;
 	char exten[AST_MAX_EXTENSION];
-	char *parkinglotname;
+	const char *parkinglotname;
 	struct ast_context *con;
 	int park;
 	int dres;
@@ -1895,7 +1895,7 @@
 
 static int park_exec(struct ast_channel *chan, void *data) 
 {
-	return park_exec_full(chan, data, &default_parkinglot);
+	return park_exec_full(chan, data, default_parkinglot);
 }
 
 static int handle_showfeatures(int fd, int argc, char *argv[])
@@ -1951,7 +1951,7 @@
 {
 	struct parkeduser *cur;
 	int numparked = 0;
-	struct ast_parkinglot *parkinglot = &default_parkinglot;
+	struct ast_parkinglot *parkinglot;
 	
 
 	ast_cli(fd, "%4s %25s (%-15s %-12s %-4s) %-6s \n", "Num", "Channel"
@@ -1959,8 +1959,9 @@
 
 	ast_mutex_lock(&parking_lock);
 
-	while (parkinglot) {
+	AST_LIST_TRAVERSE(&parkinglots, parkinglot, list) {
 		int lotparked = 0;
+
 		cur = parkinglot->occupiedlots;
 		if (cur)
 			ast_cli(fd, "*** Parking lot: %s\n", parkinglot->name);
@@ -1973,8 +1974,8 @@
 			lotparked++;
 		}
 		if (lotparked)
-			ast_cli(fd, "%d parked call%s in this parking lot.\n", lotparked, (numparked != 1) ? "s" : "");
-		parkinglot = parkinglot->next;
+			ast_cli(fd, "   %d parked call%s in parking lot %s\n", lotparked, (lotparked != 1) ? "s" : "", parkinglot->name);
+		numparked += lotparked;
 	}
 	ast_cli(fd, "---\n%d parked call%s in total.\n", numparked, (numparked != 1) ? "s" : "");
 
@@ -1996,7 +1997,7 @@
 	struct parkeduser *cur;
 	char *id = astman_get_header(m,"ActionID");
 	char idText[256] = "";
-	struct ast_parkinglot *parkinglot = &default_parkinglot;
+	struct ast_parkinglot *parkinglot;
 
 	if (id && !ast_strlen_zero(id))
 		snprintf(idText,256,"ActionID: %s\r\n",id);
@@ -2007,7 +2008,7 @@
         ast_mutex_lock(&parking_lock);
 
 	
-	while (parkinglot) {
+	AST_LIST_TRAVERSE(&parkinglots, parkinglot, list) {
         	cur=parkinglot->occupiedlots;
         	while(cur) {
 			ast_cli(s->fd, "Event: ParkedCall\r\n"
@@ -2029,13 +2030,12 @@
 
 			cur = cur->next;
 		}
-		parkinglot = parkinglot->next;
 	}
 
 	ast_cli(s->fd,
-	"Event: ParkedCallsComplete\r\n"
-	"%s"
-	"\r\n",idText);
+		"Event: ParkedCallsComplete\r\n"
+		"%s"
+		"\r\n",idText);
 
         ast_mutex_unlock(&parking_lock);
 
@@ -2094,7 +2094,8 @@
 	return newlot;
 }
 
-static void destroy_parkinglot(ast_parkinglot *ruin)
+/*! \brief Destroy a parking lot */
+static void destroy_parkinglot(struct ast_parkinglot *ruin)
 {
 	struct ast_context *con;
 	con = ast_context_find(ruin->parking_con);
@@ -2104,19 +2105,20 @@
 }
 
 /*! \brief Build parkinglot from configuration and chain it in */
-static int build_parking_lot(char *name, struct ast_variable *var)
+static struct ast_parkinglot *build_parkinglot(char *name, struct ast_variable *var)
 {
 	struct ast_parkinglot *parkinglot;
 	struct ast_context *con = NULL;
 
 	struct ast_variable *confvar = var;
 	int error = 0;
+	int start = 0, end = 0;
 
 	/* Check if parkinglot with this name already exists */
 	/* OEJ */
 	parkinglot = create_parkinglot(name);
 	if (!parkinglot)
-		return;
+		return NULL;
 	
 	/* Do some config stuff */
 	while(confvar) {
@@ -2141,6 +2143,10 @@
 		}
 		confvar = confvar->next;
 	}
+
+	if (!var)	/* Default parking lot */
+		ast_copy_string(parkinglot->parking_con, "parkedcalls", sizeof(parkinglot->parking_con));
+
 	/* Check for errors */
 	if (ast_strlen_zero(parkinglot->parking_con)) {
 		ast_log(LOG_WARNING, "Parking lot %s lacks context\n", name);
@@ -2150,7 +2156,7 @@
 	/* Create context */
 	if (!error && !(con = ast_context_find(parkinglot->parking_con))) {
 		if (!(con = ast_context_create(NULL, parkinglot->parking_con, registrar))) {
-			ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", cur->parking_con);
+			ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parkinglot->parking_con);
 			error = 1;
 		}
 	}
@@ -2162,12 +2168,13 @@
 	if (error) {
 		ast_log(LOG_WARNING, "Parking %s not open for business. Configuration error.\n", name);
 		destroy_parkinglot(parkinglot);
-		return -1;
+		return NULL;
 	}
 
 	/* Move it into the list */
 	AST_LIST_INSERT_TAIL(&parkinglots, parkinglot, list);
-	return 0;
+
+	return parkinglot;
 	
 }
 
@@ -2179,15 +2186,27 @@
 	struct ast_config *cfg = NULL;
 	struct ast_variable *var = NULL;
 
+
 	if (!default_parkinglot) {
-		default_parkinglot = build_parkinglot(DEFAULT_PARKINGLOT);
-		AST_LIST_INSERT_TAIL(&parkinglots, parkinglot, list);
+		default_parkinglot = build_parkinglot(DEFAULT_PARKINGLOT, NULL);
+		if (default_parkinglot) {
+			default_parkinglot->parking_start = 701;
+			default_parkinglot->parking_stop = 750;
+			default_parkinglot->parking_offset = 0;
+			default_parkinglot->parkfindnext = 0;
+			default_parkinglot->parkingtime = 0;
+		}
+	}
+	if (default_parkinglot)
+		ast_log(LOG_DEBUG, "Configuration of default parkinglot done.\n");
+	else {
+		ast_log(LOG_DEBUG, "Configuration of default parkinglot failed.\n");
+		return -1;
 	}
 	
 	transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT;
 	featuredigittimeout = DEFAULT_FEATURE_DIGIT_TIMEOUT;
 
-	AST_LIST_HEAD_INIT(&parkinglots);
 	
 	strcpy(xfersound, "beep");
 	strcpy(xferfailsound, "pbx-invalid");
@@ -2213,12 +2232,14 @@
 				} else
 					parkingtime = parkingtime * 1000;
 			} else if (!strcasecmp(var->name, "parkpos")) {
+				ast_log(LOG_DEBUG, "Found parking position in general: %s\n", var->value);
 				if (sscanf(var->value, "%d-%d", &start, &end) != 2) {
 					ast_log(LOG_WARNING, "Format for parking positions is a-b, where a and b are numbers at line %d of parking.conf\n", var->lineno);
-				} else {
+				} else if (default_parkinglot) {
 					default_parkinglot->parking_start = start;
 					default_parkinglot->parking_stop = end;
-				}
+				} else 
+					ast_log(LOG_WARNING, "No default parking lot!\n");
 			} else if (!strcasecmp(var->name, "findslot")) {
 				default_parkinglot->parkfindnext = (!strcasecmp(var->value, "next"));
 			} else if (!strcasecmp(var->name, "adsipark")) {
@@ -2325,16 +2346,18 @@
 			var = var->next;
 		}	 
 	}
+
 	/* Now, find parking lot definitions */
 	ast_config_destroy(cfg);
-
 	
 	if (con)
 		ast_context_remove_extension2(con, ast_parking_ext(), 1, registrar);
 	
+	ast_log(LOG_DEBUG, "Trying to find contexts for default parking lot\n");
+
 	if (!(con = ast_context_find(default_parkinglot->parking_con))) {
-		if (!(con = ast_context_create(NULL, cur->parking_con, registrar))) {
-			ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", cur->parking_con);
+		if (!(con = ast_context_create(NULL, default_parkinglot->parking_con, registrar))) {
+			ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", default_parkinglot->parking_con);
 			return -1;
 		}
 	}
@@ -2362,6 +2385,7 @@
 	int res;
 	
 	AST_LIST_HEAD_INIT(&feature_list);
+	AST_LIST_HEAD_INIT(&parkinglots);
 
 	if ((res = load_config()))
 		return res;



More information about the svn-commits mailing list