[Asterisk-cvs] asterisk/apps app_voicemail.c,1.184,1.185

markster at lists.digium.com markster at lists.digium.com
Wed Dec 22 20:42:06 CST 2004


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv28178/apps

Modified Files:
	app_voicemail.c 
Log Message:
Use flags for voicemail (bug #3130)


Index: app_voicemail.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_voicemail.c,v
retrieving revision 1.184
retrieving revision 1.185
diff -u -d -r1.184 -r1.185
--- app_voicemail.c	22 Dec 2004 00:08:53 -0000	1.184
+++ app_voicemail.c	23 Dec 2004 01:37:48 -0000	1.185
@@ -73,6 +73,21 @@
 #define MAX_DATETIME_FORMAT	512
 #define MAX_NUM_CID_CONTEXTS 10
 
+#define VM_REVIEW		(1 << 0)
+#define VM_OPERATOR		(1 << 1)
+#define VM_SAYCID		(1 << 2)
+#define VM_SVMAIL		(1 << 3)
+#define VM_ENVELOPE		(1 << 4)
+#define VM_SAYDURATION		(1 << 5)
+#define VM_SKIPAFTERCMD 	(1 << 6)
+#define VM_FORCENAME		(1 << 7)	/* Have new users record their name */
+#define VM_FORCEGREET		(1 << 8)	/* Have new users record their greetings */
+#define VM_PBXSKIP		(1 << 9)
+#define VM_DIRECFORWARD 	(1 << 10)	/* directory_forward */
+#define VM_ATTACH		(1 << 11)
+#define VM_DELETE		(1 << 12)
+#define VM_ALLOCED		(1 << 13)
+
 static int load_config(void);
 
 /* Syntaxes supported, not really language codes.
@@ -142,17 +157,7 @@
 	char dialout[80];
 	char uniqueid[20];		/* Unique integer identifier */
 	char exit[80];
-	int attach;
-	int delete;
-	int alloced;
-	int saycid;
-	int svmail;
-	int review;
-	int operator;
-	int envelope;
-	int forcename;
-	int forcegreetings;
-	int sayduration;
+	int flags;			/* VM_ flags */	
 	int saydurationm;
 	struct ast_vm_user *next;
 };
@@ -279,7 +284,6 @@
 struct ast_vm_user *usersl;
 struct vm_zone *zones = NULL;
 struct vm_zone *zonesl = NULL;
-static int attach_voicemail;
 static int maxsilence;
 static int silencethreshold = 128;
 static char serveremail[80];
@@ -293,16 +297,10 @@
 static int skipms;
 static int maxlogins;
 
-static int reviewvm;
-static int calloper;
-static int saycidinfo;
-static int svmailinfo;
-static int hearenv;
-static int saydurationinfo;
+static struct ast_flags globalflags = {0};
+
 static int saydurationminfo;
-static int skipaftercmd;
-static int forcenm;
-static int forcegrt;
+
 static char dialcontext[80];
 static char callcontext[80];
 static char exitcontext[80];
@@ -311,14 +309,12 @@
 
 
 static char *emailbody = NULL;
-static int pbxskip = 0;
 static char *emailsubject = NULL;
 static char fromstring[100];
 static char pagerfromstring[100];
 static char emailtitle[100];
 static char charset[32] = "ISO-8859-1";
 
-static int directory_forward;
 static char adsifdn[4] = "\x00\x00\x00\x0F";
 static char adsisec[4] = "\x9B\xDB\xF7\xAC";
 static int adsiver = 1;
@@ -329,25 +325,9 @@
 
 static void populate_defaults(struct ast_vm_user *vmu)
 {
-	vmu->attach = -1;
-	if (reviewvm)
-		vmu->review = 1;
-	if (calloper)
-		vmu->operator = 1;
-	if (saycidinfo)
-		vmu->saycid = 1;
-	if (svmailinfo)
-		vmu->svmail = 1; 
-	if (hearenv)
-		vmu->envelope = 1;
-	if (saydurationinfo)
-		vmu->sayduration = 1;
+	ast_copy_flags(vmu, (&globalflags), VM_ATTACH|VM_REVIEW|VM_OPERATOR|VM_SAYCID|VM_SVMAIL|VM_SAYDURATION|VM_FORCENAME|VM_FORCEGREET);	
 	if (saydurationminfo>0)
 		vmu->saydurationm = saydurationminfo;
-	if (forcenm)
-		vmu->forcename = 1;
-	if (forcegrt)
-		vmu->forcegreetings = 1;
 	if (callcontext)
 		strncpy(vmu->callback, callcontext, sizeof(vmu->callback) -1);
 	if (dialcontext)
@@ -360,10 +340,7 @@
 {
 	int x;
 	if (!strcasecmp(var, "attach")) {
-		if (ast_true(value))
-			vmu->attach = 1;
-		else
-			vmu->attach = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_ATTACH);	
 	} else if (!strcasecmp(var, "serveremail")) {
 		strncpy(vmu->serveremail, value, sizeof(vmu->serveremail) - 1);
 	} else if (!strcasecmp(var, "language")) {
@@ -371,37 +348,19 @@
 	} else if (!strcasecmp(var, "tz")) {
 		strncpy(vmu->zonetag, value, sizeof(vmu->zonetag) - 1);
 	} else if (!strcasecmp(var, "delete")) {
-		vmu->delete = ast_true(value);
+		ast_set2_flag(vmu, ast_true(value), VM_DELETE);	
 	} else if (!strcasecmp(var, "saycid")){
-		if (ast_true(value))
-			vmu->saycid = 1;
-		else
-			vmu->saycid = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_SAYCID);	
 	} else if (!strcasecmp(var,"sendvoicemail")){
-		if (ast_true(value))
-			vmu->svmail =1;
-		else
-			vmu->svmail =0;
+		ast_set2_flag(vmu, ast_true(value), VM_SVMAIL);	
 	} else if (!strcasecmp(var, "review")){
-		if (ast_true(value))
-			vmu->review = 1;
-		else
-			vmu->review = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_REVIEW);	
 	} else if (!strcasecmp(var, "operator")){
-		if (ast_true(value))
-			vmu->operator = 1;
-		else
-			vmu->operator = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_OPERATOR);	
 	} else if (!strcasecmp(var, "envelope")){
-		if (ast_true(value))
-			vmu->envelope = 1;
-		else
-			vmu->envelope = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_ENVELOPE);	
 	} else if (!strcasecmp(var, "sayduration")){
-		if(ast_true(value))
-			vmu->sayduration = 1;
-		else
-			vmu->sayduration = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_SAYDURATION);	
 	} else if (!strcasecmp(var, "saydurationm")){
 		if (sscanf(value, "%d", &x) == 1) {
 			vmu->saydurationm = x;
@@ -409,15 +368,9 @@
 			ast_log(LOG_WARNING, "Invalid min duration for say duration\n");
 		}
 	} else if (!strcasecmp(var, "forcename")){
-		if (ast_true(value))
-			vmu->forcename = 1;
-		else
-			vmu->forcename = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_FORCENAME);	
 	} else if (!strcasecmp(var, "forcegreetings")){
-		if (ast_true(value))
-			vmu->forcegreetings = 1;
-		else
-			vmu->forcegreetings = 0;
+		ast_set2_flag(vmu, ast_true(value), VM_FORCEGREET);	
 	} else if (!strcasecmp(var, "callback")) {
 		strncpy(vmu->callback, value, sizeof(vmu->callback) -1);
 	} else if (!strcasecmp(var, "dialout")) {
@@ -466,7 +419,7 @@
 	if (retval) {
 		memset(retval, 0, sizeof(struct ast_vm_user));
 		if (!ivm)
-			retval->alloced=1;
+			ast_set_flag(retval, VM_ALLOCED);	
 		if (mailbox) 
 			strncpy(retval->mailbox, mailbox, sizeof(retval->mailbox) - 1);
 		if (context) 
@@ -522,10 +475,7 @@
 			vmu = malloc(sizeof(struct ast_vm_user));
 		if (vmu) {
 			memcpy(vmu, cur, sizeof(struct ast_vm_user));
-			if (ivm)
-				vmu->alloced = 0;
-			else
-				vmu->alloced = 1;
+			ast_set2_flag(vmu, ivm, VM_ALLOCED);	
 			vmu->next = NULL;
 		}
 	} else
@@ -1580,7 +1530,7 @@
 	}
 	if (!strcmp(format, "wav49"))
 		format = "WAV";
-	ast_log(LOG_DEBUG, "Attaching file '%s', format '%s', uservm is '%d', global is %d\n", attach, format, attach_user_voicemail, attach_voicemail);
+	ast_log(LOG_DEBUG, "Attaching file '%s', format '%s', uservm is '%d', global is %d\n", attach, format, attach_user_voicemail, ast_test_flag((&globalflags), VM_ATTACH));
 	/* Make a temporary file instead of piping directly to sendmail, in case the mail
 	   command hangs */
 	pfd = mkstemp(tmp);
@@ -1656,7 +1606,7 @@
 		if (*emailtitle) {
 			fprintf(p, emailtitle, msgnum + 1, mailbox) ;
 			fprintf(p,"\n") ;
-		} else if (pbxskip)
+		} else if (ast_test_flag((&globalflags), VM_PBXSKIP))
 			fprintf(p, "Subject: New message %d in mailbox %s\n", msgnum + 1, mailbox);
 		else
 			fprintf(p, "Subject: [PBX]: New message %d in mailbox %s\n", msgnum + 1, mailbox);
@@ -1852,7 +1802,7 @@
 
 static void free_user(struct ast_vm_user *vmu)
 {
-	if (vmu->alloced)
+	if (ast_test_flag(vmu, VM_ALLOCED))
 		free(vmu);
 }
 
@@ -2087,7 +2037,7 @@
 		/* Check for a '0' here */
 		if (res == '0') {
 			transfer:
-			if (vmu->operator) {
+			if (ast_test_flag(vmu, VM_OPERATOR)) {
 				strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
 				if (!ast_strlen_zero(vmu->exit)) {
 					strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
@@ -2860,10 +2810,9 @@
 		strsep(&stringp, "|");
 
 		if (!ast_strlen_zero(vmu->email)) {
-			int attach_user_voicemail = attach_voicemail;
+			int attach_user_voicemail = ast_test_flag((&globalflags), VM_ATTACH);
 			char *myserveremail = serveremail;
-			if (vmu->attach > -1)
-				attach_user_voicemail = vmu->attach;
+			attach_user_voicemail = ast_test_flag(vmu, VM_ATTACH);
 			if (!ast_strlen_zero(vmu->serveremail))
 				myserveremail = vmu->serveremail;
 			sendmail(myserveremail, vmu, msgnum, vmu->mailbox, cidnum, cidname, fn, fmt, duration, attach_user_voicemail);
@@ -2879,7 +2828,7 @@
 		ast_log(LOG_ERROR, "Out of memory\n");
 	}
 
-	if (vmu->delete) {
+	if (ast_test_flag(vmu, VM_DELETE)) {
 		DELETE(todir, msgnum, fn);
 	}
 
@@ -2914,7 +2863,7 @@
 	while (!res && !valid_extensions) {
 		
 		int use_directory = 0;
-		if( directory_forward ) {
+		if(ast_test_flag((&globalflags), VM_DIRECFORWARD)) {
 			int done = 0;
 			int retries = 0;
 			cmd=0;
@@ -2981,7 +2930,7 @@
 				
 			} else {
 				ast_log(LOG_WARNING, "Could not find the Directory application, disabling directory_forward\n");
-				directory_forward = 0;
+				ast_clear_flag((&globalflags), VM_DIRECFORWARD);	
 			}
 		} else 	{
 			/* Ask for an extension */
@@ -3070,10 +3019,9 @@
 					else
 						duration = 0;
 					if (!ast_strlen_zero(vmtmp->email)) {
-						int attach_user_voicemail = attach_voicemail;
+						int attach_user_voicemail = ast_test_flag((&globalflags), VM_ATTACH);
 						char *myserveremail = serveremail;
-						if (vmtmp->attach > -1)
-							attach_user_voicemail = vmtmp->attach;
+						attach_user_voicemail = ast_test_flag(vmtmp, VM_ATTACH);
 						if (!ast_strlen_zero(vmtmp->serveremail))
 							myserveremail = vmtmp->serveremail;
 						sendmail(myserveremail, vmtmp, todircount, vmtmp->mailbox, chan->cid.cid_num, chan->cid.cid_name, fn, tmp, duration, attach_user_voicemail);
@@ -3334,11 +3282,11 @@
 
 	if (!res)
 		res = play_message_category(chan, category);
-	if ((!res)&&(vmu->envelope))
+	if ((!res) && (ast_test_flag(vmu, VM_ENVELOPE)))
 		res = play_message_datetime(chan, vmu, origtime, filename);
-	if ((!res)&&(vmu->saycid))
+	if ((!res) && (ast_test_flag(vmu, VM_SAYCID)))
 		res = play_message_callerid(chan, vms, cid, context, 0);
-        if ((!res)&&(vmu->sayduration))
+        if ((!res) && (ast_test_flag(vmu, VM_SAYDURATION)))
                 res = play_message_duration(chan, vms, duration, vmu->saydurationm);
 	/* Allow pressing '1' to skip envelope / callerid */
 	if (res == '1')
@@ -4015,7 +3963,7 @@
 	cmd = ast_play_and_wait(chan,"vm-passchanged");
 
 	/* If forcename is set, have the user record their name */	
-	if (vmu->forcename) {
+	if (ast_test_flag(vmu, VM_FORCENAME)) {
 		snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/greet",vmu->context, vms->username);
 		cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
 		if (cmd < 0 || cmd == 't' || cmd == '#')
@@ -4023,7 +3971,7 @@
 	}
 
 	/* If forcegreetings is set, have the user record their greetings */
-	if (vmu->forcegreetings) {
+	if (ast_test_flag(vmu, VM_FORCEGREET)) {
 		snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/unavail",vmu->context, vms->username);
 		cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
 		if (cmd < 0 || cmd == 't' || cmd == '#')
@@ -4510,7 +4458,7 @@
 
 		/* Check to see if this is a new user */
 		if (!strcasecmp(vmu->mailbox, vmu->password) && 
-			(vmu->forcename || vmu->forcegreetings)) {
+			(ast_test_flag(vmu, VM_FORCENAME | VM_FORCEGREET))) {
 			if (ast_play_and_wait(chan, "vm-newuser") == -1)
 				ast_log(LOG_WARNING, "Couldn't stream new user file\n");
 			cmd = vm_newuser(chan, vmu, &vms, vmfmts);
@@ -4604,7 +4552,7 @@
 						break;
 
 					case '5': /* Leave VoiceMail */
-						if (vmu->svmail)
+						if (ast_test_flag(vmu, VM_SVMAIL))
 							cmd = forward_message(chan, context, vms.curdir, vms.curmsg, vmu, vmfmts,1);
 						else
 							cmd = ast_play_and_wait(chan,"vm-sorry");
@@ -4630,7 +4578,7 @@
 						if (!ast_strlen_zero(vmu->dialout) && !cmd) {
 							cmd = ast_play_and_wait(chan, "vm-tomakecall");
 						}
-						if (vmu->svmail&&!cmd)
+						if (ast_test_flag(vmu, VM_SVMAIL) && !cmd)
 							cmd=ast_play_and_wait(chan, "vm-leavemsg");
 						if (!cmd)
 							cmd = ast_play_and_wait(chan, "vm-starmain");
@@ -4676,7 +4624,7 @@
 					cmd = ast_play_and_wait(chan, "vm-deleted");
 				else
 					cmd = ast_play_and_wait(chan, "vm-undeleted");
-				if (skipaftercmd) {
+				if (ast_test_flag((&globalflags), VM_SKIPAFTERCMD)) {
 					if (vms.curmsg < vms.lastmsg) {
 						vms.curmsg++;
 						cmd = play_message(chan, vmu, &vms);
@@ -4717,7 +4665,7 @@
 				snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
 				if (!cmd)
 					cmd = vm_play_folder_name(chan, vms.fn);
-				if (skipaftercmd) {
+				if (ast_test_flag((&globalflags), VM_SKIPAFTERCMD)) {
 					if (vms.curmsg < vms.lastmsg) {
 						vms.curmsg++;
 						cmd = play_message(chan, vmu, &vms);
@@ -5081,7 +5029,7 @@
 	while (cur) {
 		l = cur;
 		cur = cur->next;
-		l->alloced = 1;
+		ast_set_flag(l, VM_ALLOCED);	
 		free_user(l);
 	}
 	zcur = zones;
@@ -5099,10 +5047,9 @@
 		/* General settings */
 
 		/* Attach voice message to mail message ? */
-		attach_voicemail = 1;
 		if (!(astattach = ast_variable_retrieve(cfg, "general", "attach"))) 
 			astattach = "yes";
-		attach_voicemail = ast_true(astattach);
+		ast_set2_flag((&globalflags), ast_true(astattach), VM_ATTACH);	
 
 #ifdef USE_ODBC_STORAGE
 		strncpy(odbc_database, "asterisk", sizeof(odbc_database) - 1);
@@ -5196,16 +5143,14 @@
 		}
 
 		/* Force new user to record name ? */
-		forcenm = 0;
 		if (!(astattach = ast_variable_retrieve(cfg, "general", "forcename"))) 
 			astattach = "no";
-		forcenm = ast_true(astattach);
+		ast_set2_flag((&globalflags), ast_true(astattach), VM_FORCENAME);
 
 		/* Force new user to record greetings ? */
-		forcegrt = 0;
 		if (!(astattach = ast_variable_retrieve(cfg, "general", "forcegreetings"))) 
 			astattach = "no";
-		forcegrt = ast_true(astattach);
+		ast_set2_flag((&globalflags), ast_true(astattach), VM_FORCEGREET);
 
 		if ((s = ast_variable_retrieve(cfg, "general", "cidinternalcontexts"))){
 			ast_log(LOG_DEBUG,"VM_CID Internal context string: %s\n",s);
@@ -5222,47 +5167,41 @@
 				}
 			}
 		}
-		reviewvm = 0;
 		if (!(astreview = ast_variable_retrieve(cfg, "general", "review"))){
 			ast_log(LOG_DEBUG,"VM Review Option disabled globally\n");
 			astreview = "no";
 		}
-		reviewvm = ast_true(astreview);
+		ast_set2_flag((&globalflags), ast_true(astreview), VM_REVIEW);	
 
-		calloper = 0;
 		if (!(astcallop = ast_variable_retrieve(cfg, "general", "operator"))){
 			ast_log(LOG_DEBUG,"VM Operator break disabled globally\n");
 			astcallop = "no";
 		}
-		calloper = ast_true(astcallop);
+		ast_set2_flag((&globalflags), ast_true(astcallop), VM_OPERATOR);	
 
-		saycidinfo = 0;
 		if (!(astsaycid = ast_variable_retrieve(cfg, "general", "saycid"))) {
 			ast_log(LOG_DEBUG,"VM CID Info before msg disabled globally\n");
 			astsaycid = "no";
 		} 
-		saycidinfo = ast_true(astsaycid);
+		ast_set2_flag((&globalflags), ast_true(astsaycid), VM_SAYCID);	
 
-		svmailinfo =0;
 		if (!(send_voicemail = ast_variable_retrieve(cfg,"general", "sendvoicemail"))){
 			ast_log(LOG_DEBUG,"Send Voicemail msg disabled globally\n");
 			send_voicemail = "no";
 		}
-		svmailinfo=ast_true(send_voicemail);
+		ast_set2_flag((&globalflags), ast_true(send_voicemail), VM_SVMAIL);
 	
-		hearenv = 1;
 		if (!(asthearenv = ast_variable_retrieve(cfg, "general", "envelope"))) {
 			ast_log(LOG_DEBUG,"ENVELOPE before msg enabled globally\n");
 			asthearenv = "yes";
 		}
-		hearenv = ast_true(asthearenv);	
+		ast_set2_flag((&globalflags), ast_true(asthearenv), VM_ENVELOPE);	
 
-		saydurationinfo = 0;
 		if (!(astsaydurationinfo = ast_variable_retrieve(cfg, "general", "sayduration"))) {
 			ast_log(LOG_DEBUG,"Duration info before msg enabled globally\n");
 			astsaydurationinfo = "yes";
 		}
-		saydurationinfo = ast_true(astsaydurationinfo);	
+		ast_set2_flag((&globalflags), ast_true(astsaydurationinfo), VM_SAYDURATION);	
 
 		saydurationminfo = 2;
 		if ((astsaydurationminfo = ast_variable_retrieve(cfg, "general", "saydurationm"))) {
@@ -5273,12 +5212,11 @@
 			}
 		}
 
-		skipaftercmd = 0;
 		if (!(astskipcmd = ast_variable_retrieve(cfg, "general", "nextaftercmd"))) {
 			ast_log(LOG_DEBUG,"We are not going to skip to the next msg after save/delete\n");
 			astskipcmd = "no";
 		}
-		skipaftercmd = ast_true(astskipcmd);
+		ast_set2_flag((&globalflags), ast_true(astskipcmd), VM_SKIPAFTERCMD);
 
 		if ((dialoutcxt = ast_variable_retrieve(cfg, "general", "dialout"))) {
 			strncpy(dialcontext, dialoutcxt, sizeof(dialcontext) - 1);
@@ -5301,10 +5239,9 @@
 			exitcontext[0] = '\0';
 		}
 
-		directory_forward = 0;
 		if (!(astdirfwd = ast_variable_retrieve(cfg, "general", "usedirectory"))) 
 			astdirfwd = "no";
-		directory_forward = ast_true(astdirfwd);
+		ast_set2_flag((&globalflags), ast_true(astdirfwd), VM_DIRECFORWARD);	
 
 		cat = ast_category_browse(cfg, NULL);
 		while (cat) {
@@ -5370,7 +5307,7 @@
 			emailsubject = NULL;
 		}
 		if ((s=ast_variable_retrieve(cfg, "general", "pbxskip")))
-			pbxskip = ast_true(s);
+			ast_set2_flag((&globalflags), ast_true(s), VM_PBXSKIP);
 		if ((s=ast_variable_retrieve(cfg, "general", "fromstring")))
 			strncpy(fromstring,s,sizeof(fromstring)-1);
 		if ((s=ast_variable_retrieve(cfg, "general", "pagerfromstring")))
@@ -5814,7 +5751,7 @@
 			/* If the caller is an ouside caller, and the review option is enabled,
 			   allow them to review the message, but let the owner of the box review
 			   their OGM's */
-			if (outsidecaller && !vmu->review)
+			if (outsidecaller && !ast_test_flag(vmu, VM_REVIEW))
 				return cmd;
  			if (message_exists) {
  				cmd = ast_play_and_wait(chan, "vm-review");
@@ -5825,7 +5762,7 @@
  					cmd = ast_waitfordigit(chan, 600);
  			}
  			
- 			if (!cmd && outsidecaller && vmu->operator) {
+ 			if (!cmd && outsidecaller && ast_test_flag(vmu, VM_OPERATOR)) {
  				cmd = ast_play_and_wait(chan, "vm-reachoper");
  				if (!cmd)
  					cmd = ast_waitfordigit(chan, 600);




More information about the svn-commits mailing list