[asterisk-commits] oej: branch group/multiparking r104050 - /team/group/multiparking/main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Feb 23 09:02:51 CST 2008


Author: oej
Date: Sat Feb 23 09:02:51 2008
New Revision: 104050

URL: http://svn.digium.com/view/asterisk?view=rev&rev=104050
Log:
Add missing functions

Modified:
    team/group/multiparking/main/features.c

Modified: team/group/multiparking/main/features.c
URL: http://svn.digium.com/view/asterisk/team/group/multiparking/main/features.c?view=diff&rev=104050&r1=104049&r2=104050
==============================================================================
--- team/group/multiparking/main/features.c (original)
+++ team/group/multiparking/main/features.c Sat Feb 23 09:02:51 2008
@@ -2589,6 +2589,140 @@
 
 	return res;
 }
+
+/*! \brief Unreference parkinglot object. If no more references,
+	then go ahead and delete it */
+static void parkinglot_unref(struct ast_parkinglot *parkinglot) 
+{
+	if (option_debug > 2)
+		ast_log(LOG_DEBUG, "Multiparking: %s refcount now %d\n", parkinglot->name, parkinglot->refcount - 1);
+	ASTOBJ_UNREF(parkinglot, parkinglot_destroy);
+}
+
+static struct ast_parkinglot *parkinglot_addref(struct ast_parkinglot *parkinglot)
+{
+	if (option_debug > 2)
+		ast_log(LOG_DEBUG, "Multiparking: %s refcount now %d\n", parkinglot->name, parkinglot->refcount + 1);
+	return ASTOBJ_REF(parkinglot);
+}
+
+/*! \brief Allocate parking lot structure */
+static struct ast_parkinglot *create_parkinglot(char *name)
+{
+	struct ast_parkinglot *newlot = (struct ast_parkinglot *) NULL;
+
+	if (!name)
+		return NULL;
+
+	newlot = ast_calloc(1, sizeof(*newlot));
+	if (!newlot)
+		return NULL;
+
+	ASTOBJ_INIT(newlot);
+	ast_copy_string(newlot->name, name, sizeof(newlot->name));
+
+	return newlot;
+}
+
+/*! \brief Destroy a parking lot */
+static void parkinglot_destroy(struct ast_parkinglot *ruin)
+{
+	struct ast_context *con;
+	con = ast_context_find(ruin->parking_con);
+	if (con)
+		ast_context_destroy(con, registrar);
+	ASTOBJ_CONTAINER_UNLINK(&parkinglots, ruin);	/* Remove from parkinglot list */
+	free(ruin);
+}
+
+/*! \brief Build parkinglot from configuration and chain it in */
+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;
+
+	parkinglot = find_parkinglot(name);
+	if (parkinglot)
+		ASTOBJ_UNMARK(parkinglot);
+	else
+		parkinglot = create_parkinglot(name);
+
+	if (!parkinglot)
+		return NULL;
+
+	ASTOBJ_WRLOCK(parkinglot);
+
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Building parking lot %s\n", name);
+	
+	/* Do some config stuff */
+	while(confvar) {
+		if (!strcasecmp(confvar->name, "context")) {
+			ast_copy_string(parkinglot->parking_con, confvar->value, sizeof(parkinglot->parking_con));
+		} else if (!strcasecmp(confvar->name, "parkingtime")) {
+			if ((sscanf(confvar->value, "%d", &parkingtime) != 1) || (parkingtime < 1)) {
+				ast_log(LOG_WARNING, "%s is not a valid parkingtime\n", confvar->value);
+				parkinglot->parkingtime = DEFAULT_PARK_TIME;
+			} else
+				parkinglot->parkingtime = parkingtime * 1000;
+		} else if (!strcasecmp(confvar->name, "parkpos")) {
+			if (sscanf(confvar->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", confvar->lineno);
+				error = 1;
+			} else {
+				parkinglot->parking_start = start;
+				parkinglot->parking_stop = end;
+			}
+		} else if (!strcasecmp(confvar->name, "findslot")) {
+			parkinglot->parkfindnext = (!strcasecmp(confvar->value, "next"));
+		}
+		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);
+		error = 1;
+	}
+
+	/* 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", parkinglot->parking_con);
+			error = 1;
+		}
+	}
+
+	/* Add a parking extension into the context */
+	if (ast_add_extension2(con, 1, ast_parking_ext(), 1, NULL, NULL, parkcall, strdup(""), ast_free, registrar) == -1)
+		error = 1;
+
+	ASTOBJ_UNLOCK(parkinglot);
+
+	if (error) {
+		ast_log(LOG_WARNING, "Parking %s not open for business. Configuration error.\n", name);
+		parkinglot_destroy(parkinglot);
+		return NULL;
+	}
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Parking %s now open for business. (start exten %d end %d)\n", name, start, end);
+
+
+	/* Move it into the list */
+	ASTOBJ_CONTAINER_LINK(&parkinglots, parkinglot);
+	parkinglot_unref(parkinglot);
+
+	return parkinglot;
+	
+}
+
 
 /*! 
  * \brief Add parking hints for all defined parking lots 




More information about the asterisk-commits mailing list