[asterisk-commits] oej: branch oej/minivoicemail r54137 - /team/oej/minivoicemail/apps/app_minivm.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon Feb 12 12:49:27 MST 2007


Author: oej
Date: Mon Feb 12 13:49:26 2007
New Revision: 54137

URL: http://svn.digium.com/view/asterisk?view=rev&rev=54137
Log:
Small code fixes only. Documented ideas about templates

Modified:
    team/oej/minivoicemail/apps/app_minivm.c

Modified: team/oej/minivoicemail/apps/app_minivm.c
URL: http://svn.digium.com/view/asterisk/team/oej/minivoicemail/apps/app_minivm.c?view=diff&rev=54137&r1=54136&r2=54137
==============================================================================
--- team/oej/minivoicemail/apps/app_minivm.c (original)
+++ team/oej/minivoicemail/apps/app_minivm.c Mon Feb 12 13:49:26 2007
@@ -36,6 +36,15 @@
  *	by userid and domain
  *
  *	Ideal Configuration :
+ *	E-mail templates are stored in separate files
+ *
+ * 	emailtemplate = <languagecode>,<filename>
+ * 	emailtemplate = se_sv, templates/email_sv_se.txt
+ * 	emailtemplate = us_en, templates/email_en_us.txt
+ * 	pagertemplate = se_sv, templates/email_sv_se.txt # Swedish
+ * 	pagertemplate = us_en, templates/pager_en_us.txt
+ *	
+ *	Language codes are like setlocale - langcode_countrycode
  *
  *	[account_name]
  *	user=olle
@@ -95,10 +104,6 @@
 #include "asterisk/linkedlists.h"
 #include "asterisk/callerid.h"
 
-/*--------------------- CUT HERE ---------------------------------
-	This code stays for copy/paste 
-	Will be removed finally
-*/
 #ifndef TRUE
 #define TRUE 1
 #endif
@@ -106,13 +111,6 @@
 #define FALSE 0
 #endif
 
-static int vmminmessage;
-static int vmmaxmessage;
-
-#define EXISTS(a,b,c,d) (ast_fileexists(c,NULL,d) > 0)
-#define RENAME(a,b,c,d,e,f,g,h) (rename_file(g,h));
-#define COPY(a,b,c,d,e,f,g,h) (copy_file(g,h));
-#define DELETE(a,b,c) (vm_delete(c))
 
 /* Many of these options doesn't apply to minivm */
 #define MVM_REVIEW		(1 << 0)	/*!< Review message */
@@ -135,7 +133,7 @@
     mailcmd= command in voicemail.conf */
 #define SENDMAIL "/usr/sbin/sendmail -t"
 
-#define INTRO "vm-intro"
+#define SOUND_INTRO "vm-intro"
 #define MAXMSG 100
 #define MAXMSGLIMIT 9999
 #define BASEMAXINLINE 256
@@ -153,12 +151,12 @@
 #define	CHUNKSIZE	65536
 
 #define VOICEMAIL_CONFIG "minivm.conf"
-#define VOICEMAIL_TEMPLATE_CONFIG "minivmtemplates.conf"
 #define ASTERISK_USERNAME "asterisk"
 static char MVM_SPOOL_DIR[AST_CONFIG_MAX_PATH];
 
 static char *tdesc = "Mini VoiceMail (A minimal Voicemail e-mail System)";
 static char *app = "MiniVM";		 /* Leave a message */
+
 enum {
 	OPT_SILENT =	   (1 << 0),
 	OPT_BUSY_GREETING =    (1 << 1),
@@ -249,11 +247,12 @@
 
 AST_MUTEX_DEFINE_STATIC(minivmlock);
 
-static int maxsilence;
-static int maxmsg;
-static int silencethreshold = 128;
-static char serveremail[80];
-static char mailcmd[160];	/* Configurable mail cmd */
+static int global_vmminmessage;		/*!< Minimum duration of messages */
+static int global_vmmaxmessage;		/*!< Maximum duration of message */
+static int global_maxsilence;		/*!< Maximum silence during recording */
+static int global_silencethreshold = 128;
+static char global_serveremail[80];	/*!< Senders email address for notification */
+static char global_mailcmd[160];	/*!< Configurable mail cmd */
 static char externnotify[160]; 
 
 static char default_vmformat[80];
@@ -539,96 +538,102 @@
 		}
 	}
 
-	if (p) {
-		gethostname(host, sizeof(host)-1);
-		if (strchr(srcemail, '@'))
-			ast_copy_string(who, srcemail, sizeof(who));
-		else {
-			snprintf(who, sizeof(who), "%s@%s", srcemail, host);
-		}
-		snprintf(dur, sizeof(dur), "%d:%02d", duration / 60, duration % 60);
-		time(&t);
-
-		/* Does this user have a timezone specified? */
-		if (!ast_strlen_zero(vmu->zonetag)) {
-			/* Find the zone in the list */
-			struct minivm_zone *z;
-
-			AST_LIST_LOCK(&minivm_zones);
-			AST_LIST_TRAVERSE(&minivm_zones, z, list) {
-				if (strcmp(z->name, vmu->zonetag)) 
-					continue;
-				the_zone = z;
-			}
-			AST_LIST_UNLOCK(&minivm_zones);
-		}
-
-		if (the_zone)
-			ast_localtime(&t,&tm,the_zone->timezone);
-		else
-			ast_localtime(&t,&tm,NULL);
-
-		strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", &tm);
-		fprintf(p, "Date: %s\n", date);
-
-		if (*pagerfromstring) {
-			struct ast_channel *ast = ast_channel_alloc(0);
-			if (ast) {
-				char *passdata;
-				int vmlen = strlen(fromstring)*3 + 200;
-				if ((passdata = alloca(vmlen))) {
-					memset(passdata, 0, vmlen);
-					prep_email_sub_vars(ast, vmu, context,mailbox,cidnum, cidname,dur,date);
-					pbx_substitute_variables_helper(ast,pagerfromstring,passdata,vmlen);
-					fprintf(p, "From: %s <%s>\n",passdata,who);
-				} else 
-					ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
-				ast_channel_free(ast);
-			} else ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
+	if (!p) {
+		ast_log(LOG_WARNING, "Unable to launch '%s'\n", global_mailcmd);
+		return -1;
+	}
+	gethostname(host, sizeof(host)-1);
+	if (strchr(srcemail, '@'))
+		ast_copy_string(who, srcemail, sizeof(who));
+	else 
+		snprintf(who, sizeof(who), "%s@%s", srcemail, host);
+
+	snprintf(dur, sizeof(dur), "%d:%02d", duration / 60, duration % 60);
+	time(&t);
+
+	/* Does this user have a timezone specified? */
+	if (!ast_strlen_zero(vmu->zonetag)) {
+		/* Find the zone in the list */
+		struct minivm_zone *z;
+
+		AST_LIST_LOCK(&minivm_zones);
+		AST_LIST_TRAVERSE(&minivm_zones, z, list) {
+			if (strcmp(z->name, vmu->zonetag)) 
+				continue;
+			the_zone = z;
+		}
+		AST_LIST_UNLOCK(&minivm_zones);
+	}
+
+	if (the_zone)
+		ast_localtime(&t,&tm,the_zone->timezone);
+	else
+		ast_localtime(&t,&tm,NULL);
+
+	strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", &tm);
+	fprintf(p, "Date: %s\n", date);
+
+	if (*pagerfromstring) {
+		struct ast_channel *ast = ast_channel_alloc(0);
+
+		if (ast) {
+			char *passdata;
+			int vmlen = strlen(fromstring)*3 + 200;
+			if ((passdata = alloca(vmlen))) {
+				memset(passdata, 0, vmlen);
+				prep_email_sub_vars(ast, vmu, context,mailbox,cidnum, cidname,dur,date);
+				pbx_substitute_variables_helper(ast,pagerfromstring,passdata,vmlen);
+				fprintf(p, "From: %s <%s>\n",passdata,who);
+			} else 
+				ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
+			ast_channel_free(ast);
 		} else
-			fprintf(p, "From: Asterisk PBX <%s>\n", who);
-		fprintf(p, "To: %s\n", pager);
-	       if (pagersubject) {
-		       struct ast_channel *ast = ast_channel_alloc(0);
-		       if (ast) {
-			       char *passdata;
-			       int vmlen = strlen(pagersubject)*3 + 200;
-			       if ((passdata = alloca(vmlen))) {
-				       memset(passdata, 0, vmlen);
-				       prep_email_sub_vars(ast,vmu,context,mailbox,cidnum, cidname,dur,date);
-				       pbx_substitute_variables_helper(ast,pagersubject,passdata,vmlen);
-				       fprintf(p, "Subject: %s\n\n",passdata);
-			       } else ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
-			       ast_channel_free(ast);
-		       } else ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
+			ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
+	} else
+		fprintf(p, "From: Asterisk PBX <%s>\n", who);
+	fprintf(p, "To: %s\n", pager);
+	if (pagersubject) {
+	       struct ast_channel *ast = ast_channel_alloc(0);
+	       if (ast) {
+		       char *passdata;
+		       int vmlen = strlen(pagersubject)*3 + 200;
+		       if ((passdata = alloca(vmlen))) {
+			       memset(passdata, 0, vmlen);
+			       prep_email_sub_vars(ast,vmu,context,mailbox,cidnum, cidname,dur,date);
+			       pbx_substitute_variables_helper(ast,pagersubject,passdata,vmlen);
+			       fprintf(p, "Subject: %s\n\n",passdata);
+		       } else
+				ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
+		       ast_channel_free(ast);
 	       } else
-		       fprintf(p, "Subject: New VM\n\n");
-		strftime(date, sizeof(date), "%A, %B %d, %Y at %r", &tm);
-	        if (pagerbody) {
-		       struct ast_channel *ast = ast_channel_alloc(0);
-		       if (ast) {
-			       char *passdata;
-			       int vmlen = strlen(pagerbody)*3 + 200;
-			       if ((passdata = alloca(vmlen))) {
-				       memset(passdata, 0, vmlen);
-				       prep_email_sub_vars(ast,vmu,context,mailbox,cidnum, cidname,dur,date);
-				       pbx_substitute_variables_helper(ast,pagerbody,passdata,vmlen);
-				       fprintf(p, "%s\n",passdata);
-			       } else ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
-			       ast_channel_free(ast);
-		       } else ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
-	       } else {
-		       fprintf(p, "New %s long msg in box %s\n"
-				       "from %s, on %s", dur, mailbox, (cidname ? cidname : (cidnum ? cidnum : "unknown")), date);
-	       }
-		fclose(p);
-		snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
-		ast_safe_system(tmp2);
-		ast_log(LOG_DEBUG, "Sent page to %s with command '%s'\n", pager, mailcmd);
+			ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
+	} else
+	       fprintf(p, "Subject: New VM\n\n");
+	strftime(date, sizeof(date), "%A, %B %d, %Y at %r", &tm);
+        if (pagerbody) {
+	       struct ast_channel *ast = ast_channel_alloc(0);
+	       if (ast) {
+		       char *passdata;
+		       int vmlen = strlen(pagerbody)*3 + 200;
+		       if ((passdata = alloca(vmlen))) {
+			       memset(passdata, 0, vmlen);
+			       prep_email_sub_vars(ast,vmu,context,mailbox,cidnum, cidname,dur,date);
+			       pbx_substitute_variables_helper(ast,pagerbody,passdata,vmlen);
+			       fprintf(p, "%s\n",passdata);
+		       } else
+				ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
+		       ast_channel_free(ast);
+	       } else
+			ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
 	} else {
-		ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
-		return -1;
-	}
+	       fprintf(p, "New %s long msg in box %s\n"
+			       "from %s, on %s", dur, mailbox, (cidname ? cidname : (cidnum ? cidnum : "unknown")), date);
+	}
+	fclose(p);
+	snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", global_mailcmd, tmp, tmp);
+	ast_safe_system(tmp2);
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Sent page to %s with command '%s'\n", pager, global_mailcmd);
 	return 0;
 }
 
@@ -776,7 +781,7 @@
 		}
 	}
 	if (!p) {
-		ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
+		ast_log(LOG_WARNING, "Unable to launch '%s'\n", global_mailcmd);
 		return -1;
 	}
 	/* Allocate channel used for chanvar substitution */
@@ -897,10 +902,10 @@
 		fprintf(p, "\n\n--%s--\n.\n", bound);
 	}
 	fclose(p);
-	snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
+	snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", global_mailcmd, tmp, tmp);
 	ast_safe_system(tmp2);
 	if (option_debug)
-		ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", vmu->email, mailcmd);
+		ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", vmu->email, global_mailcmd);
 	ast_channel_free(ast);
 	return 0;
 }
@@ -995,7 +1000,7 @@
 	return res;
 }
 
-/*! Delete attribute file */
+/*! \brief Delete attribute file */
 static int vm_delete(char *file)
 {
 	char *txt;
@@ -1071,7 +1076,7 @@
 					ast_verbose(VERBOSE_PREFIX_3 "Recording the message\n");
 			}
 			if (recorded && outsidecaller) {
- 				cmd = ast_play_and_wait(chan, INTRO);
+ 				cmd = ast_play_and_wait(chan, SOUND_INTRO);
  				cmd = ast_play_and_wait(chan, "beep");
  			}
  			recorded = 1;
@@ -1080,7 +1085,7 @@
 				ast_channel_setoption(chan, AST_OPTION_RXGAIN, &record_gain, sizeof(record_gain), 0);
 			if (ast_test_flag(vmu, MVM_OPERATOR))
 				canceldtmf = "0";
-			cmd = ast_play_and_record_full(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence, unlockdir, acceptdtmf, canceldtmf);
+			cmd = ast_play_and_record_full(chan, playfile, recordfile, maxtime, fmt, duration, global_silencethreshold, global_maxsilence, unlockdir, acceptdtmf, canceldtmf);
 			if (record_gain)
 				ast_channel_setoption(chan, AST_OPTION_RXGAIN, &zero_gain, sizeof(zero_gain), 0);
  			if (cmd == -1) {
@@ -1101,7 +1106,7 @@
  				cmd = vm_delete(recordfile);
  				break;
  			}
- 			else if (vmu->review && (cmd == 2 && *duration < (maxsilence + 3))) {
+ 			else if (vmu->review && (cmd == 2 && *duration < (global_maxsilence + 3))) {
  				/* Message is all silence */
  				if (option_verbose > 2)
 					ast_verbose(VERBOSE_PREFIX_3 "Nothing recorded\n");
@@ -1156,7 +1161,7 @@
 					cmd = '0';
 				} else {
 					ast_play_and_wait(chan, "vm-deleted");
-					DELETE(recordfile, -1, recordfile);
+					vm_delete(recordfile);
 					cmd = '0';
 				}
 			}
@@ -1234,7 +1239,7 @@
 	/* Attach only the first format */
 	fmt = ast_strdupa(fmt);
 	if (fmt) {
-		char *myserveremail = serveremail;
+		char *myserveremail = global_serveremail;
 
 		stringp = fmt;
 		strsep(&stringp, "|");
@@ -1251,7 +1256,7 @@
 	}
 
 	if (ast_test_flag(vmu, MVM_DELETE)) 
-		DELETE(todir, msgnum, fn);
+		vm_delete(fn);
 
 	manager_event(EVENT_FLAG_CALL, "MiniVoiceMail", "Action: Sent\rn\nMailbox: %s@%s\r\n", vmu->username, vmu->domain);
 	// this needs to come back at a later time
@@ -1389,7 +1394,7 @@
 		res = 0;
 	}
 	if (!res && !ast_test_flag(options, OPT_SILENT)) {
-		res = ast_streamfile(chan, INTRO, chan->language);
+		res = ast_streamfile(chan, SOUND_INTRO, chan->language);
 		if (!res)
 			res = ast_waitstream(chan, ecodes);
 		if (res == '#') {
@@ -1493,12 +1498,12 @@
 	} else
 		ast_log(LOG_WARNING, "Error opening text file for output\n");
 
-	res = play_record_review(chan, NULL, tmptxtfile, 2000, fmt, 1, vmu, &duration, NULL, options->record_gain);
+	res = play_record_review(chan, NULL, tmptxtfile, global_vmmaxmessage, fmt, 1, vmu, &duration, NULL, options->record_gain);
 
 	if (txt) {
-		if (duration < vmminmessage) {
+		if (duration < global_vmminmessage) {
 			if (option_verbose > 2) 
-				ast_verbose( VERBOSE_PREFIX_3 "Recording was %d seconds long but needs to be at least %d - abandoning\n", duration, vmminmessage);
+				ast_verbose( VERBOSE_PREFIX_3 "Recording was %d seconds long but needs to be at least %d - abandoning\n", duration, global_vmminmessage);
 			fclose(txt);
 			ast_filedelete(tmptxtfile, NULL);
 			unlink(tmptxtfile);
@@ -1518,7 +1523,7 @@
 			} else {
 				for (;;) {
 					make_file(fn, sizeof(fn), dir, msgnum);
-					if (!EXISTS(dir, msgnum, fn, NULL))
+					if (!(ast_fileexists(fn, NULL, NULL) >0))
 						break;
 					msgnum++;
 				}
@@ -1544,7 +1549,7 @@
 	} else if (res > 0)
 		res = 0;
 
-	if (duration < vmminmessage)
+	if (duration < global_vmminmessage)
 		/* XXX We should really give a prompt too short/option start again, with leave_vm_out called only after a timeout XXX */
 		pbx_builtin_setvar_helper(chan, "MINIVMSTATUS", "FAILED");
 	else
@@ -1765,11 +1770,11 @@
 
 	/* First, set some default settings */
 	externnotify[0] = '\0';
-	silencethreshold = 256;
-	vmmaxmessage = 2000;
-	vmminmessage = 0;
-	strcpy(mailcmd, SENDMAIL);
-	maxsilence = 0;
+	global_silencethreshold = 256;
+	global_vmmaxmessage = 2000;
+	global_vmminmessage = 0;
+	strcpy(global_mailcmd, SENDMAIL);
+	global_maxsilence = 0;
 	global_saydurationminfo = 2;
 	skipms = 3000;
 
@@ -1793,12 +1798,12 @@
 
 	/* Mail command */
 	if ((astmailcmd = ast_variable_retrieve(cfg, "general", "mailcmd")))
-		ast_copy_string(mailcmd, astmailcmd, sizeof(mailcmd)); /* User setting */
+		ast_copy_string(global_mailcmd, astmailcmd, sizeof(global_mailcmd)); /* User setting */
 
 	if ((silencestr = ast_variable_retrieve(cfg, "general", "maxsilence"))) {
-		maxsilence = atoi(silencestr);
-		if (maxsilence > 0)
-			maxsilence *= 1000;
+		global_maxsilence = atoi(silencestr);
+		if (global_maxsilence > 0)
+			global_maxsilence *= 1000;
 	}
 		
 	/* Load date format config for voicemail mail */
@@ -1812,15 +1817,15 @@
 
 	/* Silence treshold */
 	if ((thresholdstr = ast_variable_retrieve(cfg, "general", "silencethreshold")))
-		silencethreshold = atoi(thresholdstr);
+		global_silencethreshold = atoi(thresholdstr);
 		
 	if (!(astemail = ast_variable_retrieve(cfg, "general", "serveremail"))) 
 		astemail = ASTERISK_USERNAME;
-	ast_copy_string(serveremail, astemail, sizeof(serveremail));
+	ast_copy_string(global_serveremail, astemail, sizeof(global_serveremail));
 		
 	if ((s = ast_variable_retrieve(cfg, "general", "maxmessage"))) {
 		if (sscanf(s, "%d", &x) == 1) {
-			vmmaxmessage = x;
+			global_vmmaxmessage = x;
 		} else {
 			ast_log(LOG_WARNING, "Invalid max message time length\n");
 		}
@@ -1828,8 +1833,8 @@
 
 	if ((s = ast_variable_retrieve(cfg, "general", "minmessage"))) {
 		if (sscanf(s, "%d", &x) == 1) {
-			vmminmessage = x;
-			if (maxsilence <= vmminmessage)
+			global_vmminmessage = x;
+			if (global_maxsilence <= global_vmminmessage)
 				ast_log(LOG_WARNING, "maxsilence should be less than minmessage or you may get empty messages\n");
 		} else {
 			ast_log(LOG_WARNING, "Invalid min message time length\n");



More information about the asterisk-commits mailing list