[asterisk-commits] branch oej/jitterbuffer r25434 - in /team/oej/jitterbuffer: ./ apps/ build_to...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon May 8 04:03:43 MST 2006


Author: oej
Date: Mon May  8 06:03:42 2006
New Revision: 25434

URL: http://svn.digium.com/view/asterisk?rev=25434&view=rev
Log:
reset automerge

Modified:
    team/oej/jitterbuffer/   (props changed)
    team/oej/jitterbuffer/apps/app_meetme.c
    team/oej/jitterbuffer/apps/app_voicemail.c
    team/oej/jitterbuffer/asterisk.c
    team/oej/jitterbuffer/build_tools/make_version
    team/oej/jitterbuffer/build_tools/menuselect.c
    team/oej/jitterbuffer/build_tools/menuselect.h
    team/oej/jitterbuffer/channels/misdn/isdn_lib.c
    team/oej/jitterbuffer/configs/func_odbc.conf.sample
    team/oej/jitterbuffer/file.c
    team/oej/jitterbuffer/frame.c
    team/oej/jitterbuffer/funcs/func_odbc.c
    team/oej/jitterbuffer/include/asterisk/pbx.h
    team/oej/jitterbuffer/pbx.c
    team/oej/jitterbuffer/pbx/pbx_dundi.c
    team/oej/jitterbuffer/say.c
    team/oej/jitterbuffer/static-http/ajamdemo.html
    team/oej/jitterbuffer/strcompat.c

Propchange: team/oej/jitterbuffer/
------------------------------------------------------------------------------
    automerge = http://edvina.net/training/

Propchange: team/oej/jitterbuffer/
------------------------------------------------------------------------------
Binary property 'branch-1.2-blocked' - no diff available.

Propchange: team/oej/jitterbuffer/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.

Propchange: team/oej/jitterbuffer/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon May  8 06:03:42 2006
@@ -1,1 +1,1 @@
-/trunk:1-25138
+/trunk:1-25414

Modified: team/oej/jitterbuffer/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/apps/app_meetme.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/apps/app_meetme.c (original)
+++ team/oej/jitterbuffer/apps/app_meetme.c Mon May  8 06:03:42 2006
@@ -1,4 +1,3 @@
-
 /*
  * Asterisk -- An open source telephony toolkit.
  *
@@ -2151,9 +2150,12 @@
 								break;
 							} else {
 								/* Pin invalid */
-								res = ast_streamfile(chan, "conf-invalidpin", chan->language);
-								if (!res)
-									ast_waitstream(chan, AST_DIGIT_ANY);
+								if (!ast_streamfile(chan, "conf-invalidpin", chan->language))
+									res = ast_waitstream(chan, AST_DIGIT_ANY);
+								else {
+									ast_log(LOG_WARNING, "Couldn't play invalid pin msg!\n");
+									break;
+								}
 								if (res < 0) {
 									AST_LIST_LOCK(&confs);
 									cnf->refcount--;

Modified: team/oej/jitterbuffer/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/apps/app_voicemail.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/apps/app_voicemail.c (original)
+++ team/oej/jitterbuffer/apps/app_voicemail.c Mon May  8 06:03:42 2006
@@ -37,6 +37,8 @@
  * 07-11-2005 : An issue with voicemail synchronization has been fixed by GDS Partners (www.gdspartners.com)
  *				 Stojan Sljivic <stojan.sljivic at gdspartners.com>
  *
+ * 12-04-2006 : Support for Polish added by DIR (www.dir.pl)
+ *				 Bartosz Supczinski <Bartosz.Supczinski at dir.pl>
  */
 
 #include <stdlib.h>
@@ -161,6 +163,7 @@
 	\arg \b fr - French
 	\arg \b it = Italian
 	\arg \b nl - Dutch
+	\arg \b pt - Polish
 	\arg \b pt - Portuguese
 	\arg \b gr - Greek
 	\arg \b no - Norwegian
@@ -179,6 +182,16 @@
 NB these are plural:
 \arg \b vm-INBOX	nieuwe (nl)
 \arg \b vm-Old		oude (nl)
+
+Polish uses:
+\arg \b vm-new-a	'new', feminine singular accusative
+\arg \b vm-new-e	'new', feminine plural accusative
+\arg \b vm-new-ych	'new', feminine plural genitive
+\arg \b vm-old-a	'old', feminine singular accusative
+\arg \b vm-old-e	'old', feminine plural accusative
+\arg \b vm-old-ych	'old', feminine plural genitive
+\arg \b digits/1-a	'one', not always same as 'digits/1'
+\arg \b digits/2-ie	'two', not always same as 'digits/2'
 
 Swedish uses:
 \arg \b vm-nytt		singular of 'new'
@@ -3688,10 +3701,12 @@
 #endif
 	if (the_zone)
 		res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, the_zone->msg_format, the_zone->timezone);
-       else if(!strcasecmp(chan->language,"se"))       /* SWEDISH syntax */
-               res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' dB 'digits/at' k 'and' M", NULL);
-       else if(!strcasecmp(chan->language,"no"))       /* NORWEGIAN syntax */
-               res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' Q 'digits/at' HM", NULL);
+	else if(!strcasecmp(chan->language,"pl"))	/* POLISH syntax */
+		res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' Q HM", NULL);
+	else if(!strcasecmp(chan->language,"se"))       /* SWEDISH syntax */
+		res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' dB 'digits/at' k 'and' M", NULL);
+	else if(!strcasecmp(chan->language,"no"))       /* NORWEGIAN syntax */
+		res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' Q 'digits/at' HM", NULL);
 	else if(!strcasecmp(chan->language,"de"))	/* GERMAN syntax */
 		res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' Q 'digits/at' HM", NULL);
 	else if (!strcasecmp(chan->language,"nl"))	/* DUTCH syntax */
@@ -3788,9 +3803,37 @@
 
 	ast_log(LOG_DEBUG, "VM-Duration: duration is: %d seconds converted to: %d minutes\n", durations, durationm);
 
-	if((!res)&&(durationm>=minduration)) {
-		res = ast_say_number(chan, durationm, AST_DIGIT_ANY, chan->language, (char *) NULL);
-		res = wait_file2(chan, vms, "vm-minutes");
+	if ((!res) && (durationm >= minduration)) {
+		res = wait_file2(chan, vms, "vm-duration");
+
+		/* POLISH syntax */
+		if (!strcasecmp(chan->language, "pl")) {
+			div_t num = div(durationm, 10);
+
+			if (durationm == 1) {
+				res = ast_play_and_wait(chan, "digits/1z");
+				res = res ? res : ast_play_and_wait(chan, "vm-minute-ta");
+			} else if (num.rem > 1 && num.rem < 5 && num.quot != 1) {
+				if (num.rem == 2) {
+					if (!num.quot) {
+						res = ast_play_and_wait(chan, "digits/2-ie");
+					} else {
+						res = say_and_wait(chan, durationm - 2 , chan->language);
+						res = res ? res : ast_play_and_wait(chan, "digits/2-ie");
+					}
+				} else {
+					res = say_and_wait(chan, durationm, chan->language);
+				}
+				res = res ? res : ast_play_and_wait(chan, "vm-minute-ty");
+			} else {
+				res = say_and_wait(chan, durationm, chan->language);
+				res = res ? res : ast_play_and_wait(chan, "vm-minute-t");
+			}
+		/* DEFAULT syntax */
+		} else {
+			res = ast_say_number(chan, durationm, AST_DIGIT_ANY, chan->language, NULL);
+			res = wait_file2(chan, vms, "vm-minutes");
+		}
 	}
 	return res;
 }
@@ -3810,21 +3853,45 @@
 	else if (vms->curmsg == vms->lastmsg)
 		res = wait_file2(chan, vms, "vm-last");		/* "last" */
 	if (!res) {
-               if (!strcasecmp(chan->language, "se")) {             /* SWEDISH syntax */
-                       res = wait_file2(chan, vms, "vm-meddelandet");  /* "message" */
-               }
-               else {
-                       res = wait_file2(chan, vms, "vm-message");      /* "message" */
-               }
-		if (vms->curmsg && (vms->curmsg != vms->lastmsg)) {
+		/* POLISH syntax */
+		if (!strcasecmp(chan->language, "pl")) { 
+			if (vms->curmsg && (vms->curmsg != vms->lastmsg)) {
+				int ten, one;
+				char nextmsg[256];
+				ten = (vms->curmsg + 1) / 10;
+				one = (vms->curmsg + 1) % 10;
+				
+				if (vms->curmsg < 20) {
+					snprintf(nextmsg, sizeof(nextmsg), "digits/n-%d", vms->curmsg + 1);
+					res = wait_file2(chan, vms, nextmsg);
+				} else {
+					snprintf(nextmsg, sizeof(nextmsg), "digits/n-%d", ten * 10);
+					res = wait_file2(chan, vms, nextmsg);
+					if (one > 0) {
+						if (!res) {
+							snprintf(nextmsg, sizeof(nextmsg), "digits/n-%d", one);
+							res = wait_file2(chan, vms, nextmsg);
+						}
+					}
+				}
+			}
 			if (!res)
-				res = ast_say_number(chan, vms->curmsg + 1, AST_DIGIT_ANY, chan->language, (char *) NULL);
+				res = wait_file2(chan, vms, "vm-message");
+		} else {
+			if (!strcasecmp(chan->language, "se")) /* SWEDISH syntax */
+				res = wait_file2(chan, vms, "vm-meddelandet");  /* "message" */
+			else /* DEFAULT syntax */
+				res = wait_file2(chan, vms, "vm-message");
+			if (vms->curmsg && (vms->curmsg != vms->lastmsg)) {
+				if (!res)
+					res = ast_say_number(chan, vms->curmsg + 1, AST_DIGIT_ANY, chan->language, NULL);
+			}
 		}
 	}
 
 	/* Retrieve info from VM attribute file */
 	make_file(vms->fn2, sizeof(vms->fn2), vms->curdir, vms->curmsg);
-	snprintf(filename,sizeof(filename), "%s.txt", vms->fn2);
+	snprintf(filename, sizeof(filename), "%s.txt", vms->fn2);
 	RETRIEVE(vms->curdir, vms->curmsg);
 	msg_cfg = ast_config_load(filename);
 	if (!msg_cfg) {
@@ -3980,14 +4047,26 @@
 
 	if (!strcasecmp(mbox, "vm-INBOX") || !strcasecmp(mbox, "vm-Old")){
 		cmd = ast_play_and_wait(chan, buf); /* "NEA / PALIA" */
-		if (cmd)
-		return cmd;
-		return ast_play_and_wait(chan, "vm-messages"); /* "messages" -> "MYNHMATA" */
+		return cmd ? cmd : ast_play_and_wait(chan, "vm-messages"); /* "messages" -> "MYNHMATA" */
 	} else {
 		cmd = ast_play_and_wait(chan, "vm-messages"); /* "messages" -> "MYNHMATA" */
-	  	if (cmd)
-			return cmd;
-	  	return ast_play_and_wait(chan, mbox); /* friends/family/work... -> "FILWN"/"OIKOGENIAS"/"DOULEIAS"*/
+	  	return cmd ? cmd : ast_play_and_wait(chan, mbox); /* friends/family/work... -> "FILWN"/"OIKOGENIAS"/"DOULEIAS"*/
+	}
+}
+
+static int vm_play_folder_name_pl(struct ast_channel *chan, char *mbox)
+{
+	int cmd;
+
+	if (!strcasecmp(mbox, "vm-INBOX") || !strcasecmp(mbox, "vm-Old")) {
+		if (!strcasecmp(mbox, "vm-INBOX"))
+			cmd = ast_play_and_wait(chan, "vm-new-e");
+		else
+			cmd = ast_play_and_wait(chan, "vm-old-e");
+		return cmd ? cmd : ast_play_and_wait(chan, "vm-messages");
+	} else {
+		cmd = ast_play_and_wait(chan, "vm-messages");
+	  	return cmd ? cmd : ast_play_and_wait(chan, mbox);
 	}
 }
 
@@ -3997,16 +4076,14 @@
 
 	if (!strcasecmp(chan->language, "it") || !strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Italian, Spanish, French or Portuguese syntax */
 		cmd = ast_play_and_wait(chan, "vm-messages"); /* "messages */
-		if (cmd)
-			return cmd;
-		return ast_play_and_wait(chan, mbox);
+		return cmd ? cmd : ast_play_and_wait(chan, mbox);
 	} else if (!strcasecmp(chan->language, "gr")){
 		return vm_play_folder_name_gr(chan, mbox);
+	} else if (!strcasecmp(chan->language, "pl")){
+		return vm_play_folder_name_pl(chan, mbox);
 	} else {  /* Default English */
 		cmd = ast_play_and_wait(chan, mbox);
-		if (cmd)
-			return cmd;
-		return ast_play_and_wait(chan, "vm-messages"); /* "messages */
+		return cmd ? cmd : ast_play_and_wait(chan, "vm-messages"); /* "messages */
 	}
 }
 
@@ -4138,6 +4215,77 @@
 	return res ? -1 : 0;
 }
 
+/* POLISH syntax */
+static int vm_intro_pl(struct ast_channel *chan, struct vm_state *vms)
+{
+	/* Introduce messages they have */
+	int res;
+	div_t num;
+
+	if (!vms->oldmessages && !vms->newmessages) {
+		res = ast_play_and_wait(chan, "vm-no");
+		res = res ? res : ast_play_and_wait(chan, "vm-messages");
+		return res;
+	} else {
+		res = ast_play_and_wait(chan, "vm-youhave");
+	}
+
+	if (vms->newmessages) {
+		num = div(vms->newmessages, 10);
+		if (vms->newmessages == 1) {
+			res = ast_play_and_wait(chan, "digits/1-a");
+			res = res ? res : ast_play_and_wait(chan, "vm-new-a");
+			res = res ? res : ast_play_and_wait(chan, "vm-message");
+		} else if (num.rem > 1 && num.rem < 5 && num.quot != 1) {
+			if (num.rem == 2) {
+				if (!num.quot) {
+					res = ast_play_and_wait(chan, "digits/2-ie");
+				} else {
+					res = say_and_wait(chan, vms->newmessages - 2 , chan->language);
+					res = res ? res : ast_play_and_wait(chan, "digits/2-ie");
+				}
+			} else {
+				res = say_and_wait(chan, vms->newmessages, chan->language);
+			}
+			res = res ? res : ast_play_and_wait(chan, "vm-new-e");
+			res = res ? res : ast_play_and_wait(chan, "vm-messages");
+		} else {
+			res = say_and_wait(chan, vms->newmessages, chan->language);
+			res = res ? res : ast_play_and_wait(chan, "vm-new-ych");
+			res = res ? res : ast_play_and_wait(chan, "vm-messages");
+		}
+		if (!res && vms->oldmessages)
+			res = ast_play_and_wait(chan, "vm-and");
+	}
+	if (!res && vms->oldmessages) {
+		num = div(vms->oldmessages, 10);
+		if (vms->oldmessages == 1) {
+			res = ast_play_and_wait(chan, "digits/1-a");
+			res = res ? res : ast_play_and_wait(chan, "vm-old-a");
+			res = res ? res : ast_play_and_wait(chan, "vm-message");
+		} else if (num.rem > 1 && num.rem < 5 && num.quot != 1) {
+			if (num.rem == 2) {
+				if (!num.quot) {
+					res = ast_play_and_wait(chan, "digits/2-ie");
+				} else {
+					res = say_and_wait(chan, vms->oldmessages - 2 , chan->language);
+					res = res ? res : ast_play_and_wait(chan, "digits/2-ie");
+				}
+			} else {
+				res = say_and_wait(chan, vms->oldmessages, chan->language);
+			}
+			res = res ? res : ast_play_and_wait(chan, "vm-old-e");
+			res = res ? res : ast_play_and_wait(chan, "vm-messages");
+		} else {
+			res = say_and_wait(chan, vms->oldmessages, chan->language);
+			res = res ? res : ast_play_and_wait(chan, "vm-old-ych");
+			res = res ? res : ast_play_and_wait(chan, "vm-messages");
+		}
+	}
+
+	return res;
+}
+
 /* SWEDISH syntax */
 static int vm_intro_se(struct ast_channel *chan, struct vm_state *vms)
 {
@@ -4647,6 +4795,8 @@
 		return vm_intro_cz(chan, vms);
 	} else if (!strcasecmp(chan->language, "gr")) {	/* GREEK syntax */
 		return vm_intro_gr(chan, vms);
+	} else if (!strcasecmp(chan->language, "pl")) {	/* POLISH syntax */
+		return vm_intro_pl(chan, vms);
 	} else if (!strcasecmp(chan->language, "se")) {	/* SWEDISH syntax */
 		return vm_intro_se(chan, vms);
 	} else if (!strcasecmp(chan->language, "no")) {	/* NORWEGIAN syntax */

Modified: team/oej/jitterbuffer/asterisk.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/asterisk.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/asterisk.c (original)
+++ team/oej/jitterbuffer/asterisk.c Mon May  8 06:03:42 2006
@@ -2529,6 +2529,7 @@
 			fclose(f);
 		} else
 			ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", ast_config_AST_PID, strerror(errno));
+		ast_mainpid = getpid();
 	}
 
 	/* Test recursive mutex locking. */

Modified: team/oej/jitterbuffer/build_tools/make_version
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/build_tools/make_version?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/build_tools/make_version (original)
+++ team/oej/jitterbuffer/build_tools/make_version Mon May  8 06:03:42 2006
@@ -3,7 +3,7 @@
 if [ -f ${1}/.version ]; then
 	cat ${1}.version
 elif [ -f ${1}/.svnrevision ]; then
-	echo SVN-`cat ${1}/.svnbranch`-r`cat ${1}.svnrevision`
+	echo SVN-`cat ${1}/.svnbranch`-r`cat ${1}/.svnrevision`
 elif [ -d .svn ]; then
     PARTS=`LANG=C svn info ${1} | grep URL | awk '{print $2;}' | sed -e s:^.*/svn/asterisk/:: | sed -e 's:/: :g'`
     BRANCH=0

Modified: team/oej/jitterbuffer/build_tools/menuselect.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/build_tools/menuselect.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/build_tools/menuselect.c (original)
+++ team/oej/jitterbuffer/build_tools/menuselect.c Mon May  8 06:03:42 2006
@@ -72,46 +72,34 @@
 };
 
 /*! The list of trees from makeopts.xml files */
-AST_LIST_HEAD_NOLOCK_STATIC(trees, tree);
-
-const char * const makeopts_files[] = {
+static AST_LIST_HEAD_NOLOCK_STATIC(trees, tree);
+
+static const char * const makeopts_files[] = {
 	"makeopts.xml"
 };
 
-char *output_makeopts = OUTPUT_MAKEOPTS_DEFAULT;
+static char *output_makeopts = OUTPUT_MAKEOPTS_DEFAULT;
 
 /*! This is set to 1 if menuselect.makeopts pre-existed the execution of this app */
-int existing_config = 0;
+static int existing_config = 0;
 
 /*! This is set when the --check-deps argument is provided. */
-int check_deps = 0;
+static int check_deps = 0;
 
 /*! Force a clean of the source tree */
-int force_clean = 0;
-
-int add_category(struct category *cat);
-int add_member(struct member *mem, struct category *cat);
-int parse_makeopts_xml(const char *makeopts_xml);
-int process_deps(void);
-int build_member_list(void);
-void mark_as_present(const char *member, const char *category);
-int parse_existing_config(const char *infile);
-int generate_makeopts_file(void);
-void free_member_list(void);
-void free_trees(void);
-
-/*! \brief a wrapper for calloc() that generates an error message if the allocation fails */
-static inline void *my_calloc(size_t num, size_t len)
-{
-	void *tmp;
-
-	tmp = calloc(num, len);
-	
-	if (!tmp)
-		fprintf(stderr, "Memory allocation error!\n");
-
-	return tmp;
-}
+static int force_clean = 0;
+
+static int add_category(struct category *cat);
+static int add_member(struct member *mem, struct category *cat);
+static int parse_makeopts_xml(const char *makeopts_xml);
+static int process_deps(void);
+static int build_member_list(void);
+static void mark_as_present(const char *member, const char *category);
+static void process_prev_failed_deps(char *buf);
+static int parse_existing_config(const char *infile);
+static int generate_makeopts_file(void);
+static void free_member_list(void);
+static void free_trees(void);
 
 /*! \brief return a pointer to the first non-whitespace character */
 static inline char *skip_blanks(char *str)
@@ -126,7 +114,7 @@
 }
 
 /*! \brief Add a category to the category list, ensuring that there are no duplicates */
-int add_category(struct category *cat)
+static int add_category(struct category *cat)
 {
 	struct category *tmp;
 
@@ -142,7 +130,7 @@
 }
 
 /*! \brief Add a member to the member list of a category, ensuring that there are no duplicates */
-int add_member(struct member *mem, struct category *cat)
+static int add_member(struct member *mem, struct category *cat)
 {
 	struct member *tmp;
 
@@ -158,7 +146,7 @@
 }
 
 /*! \brief Parse an input makeopts file */
-int parse_makeopts_xml(const char *makeopts_xml)
+static int parse_makeopts_xml(const char *makeopts_xml)
 {
 	FILE *f;
 	struct category *cat;
@@ -177,7 +165,7 @@
 		return -1;
 	}
 
-	if (!(tree = my_calloc(1, sizeof(*tree)))) {
+	if (!(tree = calloc(1, sizeof(*tree)))) {
 		fclose(f);
 		return -1;
 	}
@@ -195,7 +183,7 @@
 	     cur;
 	     cur = mxmlFindElement(cur, menu, "category", NULL, NULL, MXML_DESCEND))
 	{
-		if (!(cat = my_calloc(1, sizeof(*cat))))
+		if (!(cat = calloc(1, sizeof(*cat))))
 			return -1;
 
 		cat->name = mxmlElementGetAttr(cur, "name");
@@ -214,29 +202,23 @@
 		     cur2;
 		     cur2 = mxmlFindElement(cur2, cur, "member", NULL, NULL, MXML_DESCEND))
 		{
-			if (!(mem = my_calloc(1, sizeof(*mem))))
+			if (!(mem = calloc(1, sizeof(*mem))))
 				return -1;
 			
+			mem->name = mxmlElementGetAttr(cur2, "name");
+		
 			if (!cat->positive_output)
-				mem->enabled = 1; /* Enabled by default */
-
-			mem->name = mxmlElementGetAttr(cur2, "name");
-			
+				mem->enabled = 1;
+	
 			cur3 = mxmlFindElement(cur2, cur2, "defaultenabled", NULL, NULL, MXML_DESCEND);
-			if (cur3 && cur3->child) {
-				if (!strcasecmp("no", cur3->child->value.opaque))
-					mem->enabled = 0;
-				else if (!strcasecmp("yes", cur3->child->value.opaque))
-					mem->enabled = 1;
-				else
-					fprintf(stderr, "Invalid value '%s' for <defaultenabled> !\n", cur3->child->value.opaque);
-			}
+			if (cur3 && cur3->child)
+				mem->defaultenabled = cur3->child->value.opaque;
 			
 			for (cur3 = mxmlFindElement(cur2, cur2, "depend", NULL, NULL, MXML_DESCEND);
 			     cur3 && cur3->child;
 			     cur3 = mxmlFindElement(cur3, cur2, "depend", NULL, NULL, MXML_DESCEND))
 			{
-				if (!(dep = my_calloc(1, sizeof(*dep))))
+				if (!(dep = calloc(1, sizeof(*dep))))
 					return -1;
 				if (!strlen_zero(cur3->child->value.opaque)) {
 					dep->name = cur3->child->value.opaque;
@@ -249,7 +231,7 @@
 			     cur3 && cur3->child;
 			     cur3 = mxmlFindElement(cur3, cur2, "conflict", NULL, NULL, MXML_DESCEND))
 			{
-				if (!(cnf = my_calloc(1, sizeof(*cnf))))
+				if (!(cnf = calloc(1, sizeof(*cnf))))
 					return -1;
 				if (!strlen_zero(cur3->child->value.opaque)) {
 					cnf->name = cur3->child->value.opaque;
@@ -269,7 +251,7 @@
 }
 
 /*! \brief Process dependencies against the input dependencies file */
-int process_deps(void)
+static int process_deps(void)
 {
 	struct category *cat;
 	struct member *mem;
@@ -297,7 +279,7 @@
 		strsep(&p, "=");
 		if (!p)
 			continue;
-		if (!(dep_file = my_calloc(1, sizeof(*dep_file))))
+		if (!(dep_file = calloc(1, sizeof(*dep_file))))
 			break;
 		strncpy(dep_file->name, buf, sizeof(dep_file->name) - 1);
 		dep_file->met = atoi(p);
@@ -321,20 +303,6 @@
 				if (mem->depsfailed)
 					break; /* This dependency is not met, so we can stop now */
 			}
-			if (mem->depsfailed) {
-				if (check_deps && existing_config && mem->enabled) {
-					/* Config already existed, but this module was not disabled.
-					 * However, according to our current list of dependencies that
-					 * have been met, this can not be built. */
-					res = -1;
-					fprintf(stderr, "\nThe existing menuselect.makeopts did not specify that %s should not be built\n", mem->name);
-					fprintf(stderr, "However, menuselect-deps indicates that dependencies for this module have not\n");
-					fprintf(stderr, "been met.  So, either remove the existing menuselect.makeopts file, or run\n");
-					fprintf(stderr, "'make menuselect' to generate a file that is correct.\n\n");
-					goto deps_file_free;
-				}
-				mem->enabled = 0; /* Automatically disable it if dependencies not met */
-			}
 		}
 	}
 
@@ -353,24 +321,8 @@
 				if (mem->conflictsfailed)
 					break; /* This conflict was found, so we can stop now */
 			}
-			if (mem->conflictsfailed) {
-				if (check_deps && existing_config && mem->enabled) {
-					/* Config already existed, but this module was not disabled.
-					 * However, according to our current list of conflicts that
-					 * exist, this can not be built. */
-					res = -1;
-					fprintf(stderr, "\nThe existing menuselect.makeopts did not specify that %s should not be built\n", mem->name);
-					fprintf(stderr, "However, menuselect-deps indicates that conflicts for this module exist.\n");
-					fprintf(stderr, "So, either remove the existing menuselect.makeopts file, or run\n");
-					fprintf(stderr, "'make menuselect' to generate a file that is correct.\n\n");
-					goto deps_file_free;
-				}
-				mem->enabled = 0; /* Automatically disable it if conflicts exist */
-			}
-		}
-	}
-
-deps_file_free:
+		}
+	}
 
 	/* Free the dependency list we built from the file */
 	while ((dep_file = AST_LIST_REMOVE_HEAD(&deps_file, list)))
@@ -380,7 +332,7 @@
 }
 
 /*! \brief Iterate through all of the input makeopts files and call the parse function on them */
-int build_member_list(void)
+static int build_member_list(void)
 {
 	int i;
 	int res = -1;
@@ -396,7 +348,7 @@
 }
 
 /*! \brief Given the string representation of a member and category, mark it as present in a given input file */
-void mark_as_present(const char *member, const char *category)
+static void mark_as_present(const char *member, const char *category)
 {
 	struct category *cat;
 	struct member *mem;
@@ -437,8 +389,45 @@
 	}
 }
 
+/*! \brief Process a previously failed dependency
+ *
+ * If a module was previously disabled because of a failed dependency
+ * or a conflict, and not because the user selected it to be that way,
+ * then it needs to be re-enabled by default if the problem is no longer present.
+ */
+static void process_prev_failed_deps(char *buf)
+{
+	const char *cat_name, *mem_name;
+	struct category *cat;
+	struct member *mem;
+
+	cat_name = strsep(&buf, "=");
+	mem_name = strsep(&buf, "\n");
+
+	if (!cat_name || !mem_name)
+		return;
+
+	AST_LIST_TRAVERSE(&categories, cat, list) {
+		if (strcasecmp(cat->name, cat_name))
+			continue;
+		AST_LIST_TRAVERSE(&cat->members, mem, list) {
+			if (strcasecmp(mem->name, mem_name))
+				continue;
+
+			if (!mem->depsfailed && !mem->conflictsfailed)
+				mem->enabled = 1;			
+	
+			break;
+		}
+		break;	
+	}
+
+	if (!cat || !mem)
+		fprintf(stderr, "Unable to find '%s' in category '%s'\n", mem_name, cat_name);
+}
+
 /*! \brief Parse an existing output makeopts file and enable members previously selected */
-int parse_existing_config(const char *infile)
+static int parse_existing_config(const char *infile)
 {
 	FILE *f;
 	char buf[2048];
@@ -474,13 +463,18 @@
 			fprintf(stderr, "Invalid string in '%s' at line '%d'!\n", output_makeopts, lineno);
 			continue;
 		}
-
+		
 		parse = skip_blanks(parse);
+	
+		if (!strcasecmp(category, "MENUSELECT_DEPSFAILED")) {
+			process_prev_failed_deps(parse);
+			continue;
+		}
+	
 		while ((member = strsep(&parse, " \n"))) {
 			member = skip_blanks(member);
 			if (strlen_zero(member))
 				continue;
-
 			mark_as_present(member, category);
 		}
 	}
@@ -491,7 +485,7 @@
 }
 
 /*! \brief Create the output makeopts file that results from the user's selections */
-int generate_makeopts_file(void)
+static int generate_makeopts_file(void)
 {
 	FILE *f;
 	struct category *cat;
@@ -513,6 +507,14 @@
 		fprintf(f, "\n");
 	}
 
+	/* Output which members were disabled because of failed dependencies or conflicts */
+	AST_LIST_TRAVERSE(&categories, cat, list) {
+		AST_LIST_TRAVERSE(&cat->members, mem, list) {
+			if (mem->depsfailed || mem->conflictsfailed)
+				fprintf(f, "MENUSELECT_DEPSFAILED=%s=%s\n", cat->name, mem->name);
+		}
+	}
+
 	fclose(f);
 
 	return 0;
@@ -520,7 +522,7 @@
 
 #ifdef MENUSELECT_DEBUG
 /*! \brief Print out all of the information contained in our tree */
-void dump_member_list(void)
+static void dump_member_list(void)
 {
 	struct category *cat;
 	struct member *mem;
@@ -545,7 +547,7 @@
 #endif
 
 /*! \brief Free all categories and their members */
-void free_member_list(void)
+static void free_member_list(void)
 {
 	struct category *cat;
 	struct member *mem;
@@ -565,7 +567,7 @@
 }
 
 /*! \brief Free all of the XML trees */
-void free_trees(void)
+static void free_trees(void)
 {
 	struct tree *tree;
 
@@ -608,6 +610,52 @@
 	return count;		
 }
 
+/*! \brief Make sure an existing menuselect.makeopts disabled everything it should have */
+static int sanity_check(void)
+{
+	struct category *cat;
+	struct member *mem;
+
+	AST_LIST_TRAVERSE(&categories, cat, list) {
+		AST_LIST_TRAVERSE(&cat->members, mem, list) {
+			if ((mem->depsfailed || mem->conflictsfailed) && mem->enabled) {
+				fprintf(stderr, "\n***********************************************************\n"
+				                "  The existing menuselect.makeopts file did not specify    \n"
+				                "  that '%s' should not be included.  However, either some  \n"
+				                "  dependencies for this module were not found or a         \n"
+				                "  conflict exists.                                         \n"
+				                "                                                           \n"
+				                "  Either run 'make menuselect' or remove the existing      \n"
+				                "  menuselect.makeopts file to resolve this issue.          \n"
+						"***********************************************************\n\n", mem->name);
+				return -1;
+			}
+		}
+	}
+}
+
+/* \brief Set the forced default values if they exist */
+static void process_defaults(void)
+{
+	struct category *cat;
+	struct member *mem;
+
+	AST_LIST_TRAVERSE(&categories, cat, list) {
+		AST_LIST_TRAVERSE(&cat->members, mem, list) {
+			if (!mem->defaultenabled)
+				continue;
+			
+			if (!strcasecmp(mem->defaultenabled, "yes"))
+				mem->enabled = 1;
+			else if (!strcasecmp(mem->defaultenabled, "no"))
+				mem->enabled = 0;
+			else
+				fprintf(stderr, "Invalid defaultenabled value for '%s' in category '%s'\n", mem->name, cat->name);	
+		}
+	}
+
+}
+
 int main(int argc, char *argv[])
 {
 	int res = 0;
@@ -616,7 +664,10 @@
 	/* Parse the input XML files to build the list of available options */
 	if ((res = build_member_list()))
 		exit(res);
-
+	
+	/* Process module dependencies */
+	res = process_deps();
+	
 	/* The --check-deps option is used to ask this application to check to
 	 * see if that an existing menuselect.makeopts file contails all of the
 	 * modules that have dependencies that have not been met.  If this
@@ -629,16 +680,19 @@
 			res = parse_existing_config(argv[x]);
 			if (!res && !strcasecmp(argv[x], OUTPUT_MAKEOPTS_DEFAULT))
 				existing_config = 1;
-		}
-	}
-
-	/* Process module dependencies */
-	res = process_deps();
+			res = 0;
+		}
+	}
 
 #ifdef MENUSELECT_DEBUG
 	/* Dump the list produced by parsing the various input files */
 	dump_member_list();
 #endif
+
+	if (!existing_config)
+		process_defaults();
+	else if (check_deps)
+		res = sanity_check();
 
 	/* Run the menu to let the user enable/disable options */
 	if (!check_deps && !res)
@@ -664,6 +718,9 @@
 		res = -1;
 	}
 
+	/* In some cases, such as modifying the CFLAGS for the build,
+	 * a "make clean" needs to be forced.  Removing the .lastclean 
+	 * file does this. */
 	if (force_clean)
 		unlink(".lastclean");
 

Modified: team/oej/jitterbuffer/build_tools/menuselect.h
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/build_tools/menuselect.h?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/build_tools/menuselect.h (original)
+++ team/oej/jitterbuffer/build_tools/menuselect.h Mon May  8 06:03:42 2006
@@ -19,7 +19,7 @@
 /*!
  * \file
  *
- * \brief defaults for menuselect
+ * \brief public data structures and defaults for menuselect
  *
  */
 
@@ -37,6 +37,8 @@
 struct member {
 	/*! What will be sent to the makeopts file */
 	const char *name;
+	/*! Default setting */
+	const char *defaultenabled;
 	/*! This module is currently selected */
 	int enabled;
 	/*! This module has failed dependencies */

Modified: team/oej/jitterbuffer/channels/misdn/isdn_lib.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/channels/misdn/isdn_lib.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/channels/misdn/isdn_lib.c (original)
+++ team/oej/jitterbuffer/channels/misdn/isdn_lib.c Mon May  8 06:03:42 2006
@@ -2358,6 +2358,8 @@
 					/* I think we should send CC_RELEASE_CR, but am not sure*/
 					empty_chan_in_stack(stack, bc->channel);
 					empty_bc(bc);
+					bc_state_change(bc,BCHAN_CLEANED);
+
 					cb_log(-1, stack->port, "GOT IGNORE SETUP\n");
 
 					

Modified: team/oej/jitterbuffer/configs/func_odbc.conf.sample
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/configs/func_odbc.conf.sample?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/configs/func_odbc.conf.sample (original)
+++ team/oej/jitterbuffer/configs/func_odbc.conf.sample Mon May  8 06:03:42 2006
@@ -34,4 +34,5 @@
 dsn=mysql1
 read=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}'
 write=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})}'
+;prefix=OFFICE		; Changes this function from ODBC_PRESENCE to OFFICE_PRESENCE
 

Modified: team/oej/jitterbuffer/file.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/file.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/file.c (original)
+++ team/oej/jitterbuffer/file.c Mon May  8 06:03:42 2006
@@ -1056,6 +1056,7 @@
 					return -1;
 				case AST_CONTROL_RINGING:
 				case AST_CONTROL_ANSWER:
+				case AST_CONTROL_VIDUPDATE:
 					/* Unimportant */
 					break;
 				default:

Modified: team/oej/jitterbuffer/frame.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/frame.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/frame.c (original)
+++ team/oej/jitterbuffer/frame.c Mon May  8 06:03:42 2006
@@ -304,17 +304,17 @@
 struct ast_frame *ast_frisolate(struct ast_frame *fr)
 {
 	struct ast_frame *out;
+	void *newdata;
+	
 	if (!(fr->mallocd & AST_MALLOCD_HDR)) {
 		/* Allocate a new header if needed */
-		if (!(out = ast_frame_header_new())) {
+		if (!(out = ast_frame_header_new()))
 			return NULL;
-		}
 		out->frametype = fr->frametype;
 		out->subclass = fr->subclass;
 		out->datalen = fr->datalen;
 		out->samples = fr->samples;
 		out->offset = fr->offset;
-		out->src = NULL;
 		out->data = fr->data;
 #ifdef AST_JB
 		/* Copy the timing data */
@@ -326,25 +326,29 @@
 			out->seqno = fr->seqno;
 		}
 #endif /* AST_JB */
-	} else {
+	} else
 		out = fr;
-	}
+	
 	if (!(fr->mallocd & AST_MALLOCD_SRC)) {
 		if (fr->src)
 			out->src = strdup(fr->src);
 	} else
 		out->src = fr->src;
+	
 	if (!(fr->mallocd & AST_MALLOCD_DATA))  {
-		if (!(out->data = ast_malloc(fr->datalen + AST_FRIENDLY_OFFSET))) {
+		if (!(newdata = ast_malloc(fr->datalen + AST_FRIENDLY_OFFSET))) {
 			free(out);
 			return NULL;
 		}
-		out->data += AST_FRIENDLY_OFFSET;
+		newdata += AST_FRIENDLY_OFFSET;
 		out->offset = AST_FRIENDLY_OFFSET;
 		out->datalen = fr->datalen;
-		memcpy(out->data, fr->data, fr->datalen);
-	}
+		memcpy(newdata, fr->data, fr->datalen);
+		out->data = newdata;
+	}
+
 	out->mallocd = AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA;
+	
 	return out;
 }
 

Modified: team/oej/jitterbuffer/funcs/func_odbc.c
URL: http://svn.digium.com/view/asterisk/team/oej/jitterbuffer/funcs/func_odbc.c?rev=25434&r1=25433&r2=25434&view=diff
==============================================================================
--- team/oej/jitterbuffer/funcs/func_odbc.c (original)
+++ team/oej/jitterbuffer/funcs/func_odbc.c Mon May  8 06:03:42 2006
@@ -47,23 +47,21 @@
 #include "asterisk/module.h"
 #include "asterisk/config.h"
 #include "asterisk/res_odbc.h"
+#include "asterisk/app.h"
 
 static char *tdesc = "ODBC lookups";
 
 static char *config = "func_odbc.conf";
 
 struct acf_odbc_query {
-	char name[30];
+	AST_LIST_ENTRY(acf_odbc_query) list;
 	char dsn[30];
 	char sql_read[2048];
 	char sql_write[2048];
 	struct ast_custom_function *acf;
-	unsigned int deleteme:1;
-	struct acf_odbc_query *next;
 };
 
-static struct acf_odbc_query *queries = NULL;
-AST_MUTEX_DEFINE_STATIC(query_lock);
+AST_LIST_HEAD_STATIC(queries, acf_odbc_query);
 
 #ifdef NEEDTRACE
 static void acf_odbc_error(SQLHSTMT stmt, int res)
@@ -95,16 +93,16 @@
 	char *tracefile = "/tmp/odbc.trace";
 #endif
 
-	ast_mutex_lock(&query_lock);
-	for (query=queries; query; query = query->next) {
-		if (!strcasecmp(query->name, cmd + 5)) {
+	AST_LIST_LOCK(&queries);
+	AST_LIST_TRAVERSE(&queries, query, list) {
+		if (!strcmp(query->acf->name, cmd)) {
 			break;
 		}
 	}
 
 	if (!query) {
 		ast_log(LOG_ERROR, "No such function '%s'\n", cmd);
-		ast_mutex_unlock(&query_lock);
+		AST_LIST_UNLOCK(&queries);
 		return -1;
 	}
 
@@ -112,7 +110,7 @@
 
 	if (!obj) {
 		ast_log(LOG_ERROR, "No such DSN registered (or out of connections): %s (check res_odbc.conf)\n", query->dsn);
-		ast_mutex_unlock(&query_lock);
+		AST_LIST_UNLOCK(&queries);
 		return -1;
 	}
 
@@ -121,7 +119,7 @@
 
 	if (!s || !t) {
 		ast_log(LOG_ERROR, "Out of memory\n");
-		ast_mutex_unlock(&query_lock);
+		AST_LIST_UNLOCK(&queries);
 		return -1;
 	}
 
@@ -171,7 +169,7 @@
 	pbx_builtin_setvar_helper(chan, "VALUE", pbx_builtin_getvar_helper(ast, "VALUE"));
 
 	ast_channel_free(ast);
-	ast_mutex_unlock(&query_lock);
+	AST_LIST_UNLOCK(&queries);
 
 retry_write:
 #ifdef NEEDTRACE
@@ -242,7 +240,7 @@
 	struct odbc_obj *obj;
 	struct acf_odbc_query *query;
 	char *arg, sql[2048] = "", varname[15];
-	int count=0, res, x;
+	int count=0, res, x, buflen = 0;
 	SQLHSTMT stmt;
 	SQLSMALLINT colcount=0;
 	SQLINTEGER indicator;
@@ -251,16 +249,16 @@
 	char *tracefile = "/tmp/odbc.trace";
 #endif
 
-	ast_mutex_lock(&query_lock);
-	for (query=queries; query; query = query->next) {
-		if (!strcasecmp(query->name, cmd + 5)) {
+	AST_LIST_LOCK(&queries);
+	AST_LIST_TRAVERSE(&queries, query, list) {
+		if (!strcmp(query->acf->name, cmd)) {
 			break;
 		}
 	}
 
 	if (!query) {
 		ast_log(LOG_ERROR, "No such function '%s'\n", cmd);
-		ast_mutex_unlock(&query_lock);
+		AST_LIST_UNLOCK(&queries);
 		return -1;
 	}
 
@@ -268,7 +266,7 @@
 
 	if (!obj) {
 		ast_log(LOG_ERROR, "No such DSN registered (or out of connections): %s (check res_odbc.conf)\n", query->dsn);
-		ast_mutex_unlock(&query_lock);
+		AST_LIST_UNLOCK(&queries);
 		return -1;
 	}
 
@@ -292,7 +290,7 @@
 		pbx_builtin_setvar_helper(chan, varname, NULL);
 	}
 
-	ast_mutex_unlock(&query_lock);
+	AST_LIST_UNLOCK(&queries);
 
 	res = SQLAllocHandle (SQL_HANDLE_STMT, obj->con, &stmt);
 	if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
@@ -336,7 +334,7 @@
 	}
 
 	for (x = 0; x < colcount; x++) {
-		int buflen, coldatalen;
+		int i;
 		char coldata[256];
 
 		buflen = strlen(buf);
@@ -352,12 +350,24 @@
 			return -1;
 		}
 
-		strncat(buf + buflen, coldata, len - buflen);
-		coldatalen = strlen(coldata);
-		strncat(buf + buflen + coldatalen, ",", len - buflen - coldatalen);
+		/* Copy data, encoding '\' and ',' for the argument parser */
+		for (i = 0; i < sizeof(coldata); i++) {
+			if (coldata[i] == '\\' || coldata[i] == ',') {
+				buf[buflen++] = '\\';
+			}
+			buf[buflen++] = coldata[i];
+
+			if (buflen >= len - 2)
+				break;
+
+			if (coldata[i] == '\0')
+				break;
+		}
+
+		buf[buflen - 1] = ',';
 	}
 	/* Trim trailing comma */
-	buf[strlen(buf) - 1] = '\0';
+	buf[buflen - 1] = '\0';
 
 acf_out:
 	SQLFreeHandle(SQL_HANDLE_STMT, stmt);
@@ -400,11 +410,9 @@
 		return -1;
 	}
 
-	*query = calloc(1, sizeof(struct acf_odbc_query));
+	*query = ast_calloc(1, sizeof(struct acf_odbc_query));
 	if (! (*query))
 		return -1;
-
-	ast_copy_string((*query)->name, catg, sizeof((*query)->name));
 
 	if ((tmp = ast_variable_retrieve(cfg, catg, "dsn"))) {
 		ast_copy_string((*query)->dsn, tmp, sizeof((*query)->dsn));
@@ -420,54 +428,80 @@
 		ast_copy_string((*query)->sql_write, tmp, sizeof((*query)->sql_write));
 	}
 
-	(*query)->acf = calloc(1, sizeof(struct ast_custom_function));
-	if ((*query)->acf) {
+	(*query)->acf = ast_calloc(1, sizeof(struct ast_custom_function));
+	if (! (*query)->acf) {
+		free(*query);
+		return -1;
+	}
+
+	if ((tmp = ast_variable_retrieve(cfg, catg, "prefix")) && !ast_strlen_zero(tmp)) {
+		asprintf((char **)&((*query)->acf->name), "%s_%s", tmp, catg);
+	} else {
 		asprintf((char **)&((*query)->acf->name), "ODBC_%s", catg);
-		asprintf((char **)&((*query)->acf->syntax), "ODBC_%s(<arg1>[...[,<argN>]])", catg);
-		(*query)->acf->synopsis = "Runs the referenced query with the specified arguments";
-		if (!ast_strlen_zero((*query)->sql_read) && !ast_strlen_zero((*query)->sql_write)) {
-			asprintf((char **)&((*query)->acf->desc),
-						"Runs the following query, as defined in func_odbc.conf, performing\n"
-					   	"substitution of the arguments into the query as specified by ${ARG1},\n"
-						"${ARG2}, ... ${ARGn}.  When setting the function, the values are provided\n"
-						"either in whole as ${VALUE} or parsed as ${VAL1}, ${VAL2}, ... ${VALn}.\n"
-						"\nRead:\n%s\n\nWrite:\n%s\n",
-						(*query)->sql_read,

[... 767 lines stripped ...]


More information about the asterisk-commits mailing list