[Asterisk-cvs] asterisk/apps app_hasnewvoicemail.c,1.16,1.17

kpfleming kpfleming
Tue Oct 4 21:42:01 CDT 2005


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

Modified Files:
	app_hasnewvoicemail.c 
Log Message:
add VMCOUNT() function to replace HasVoicemail/HasNewVoicemail apps (issue #5335)


Index: app_hasnewvoicemail.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_hasnewvoicemail.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- app_hasnewvoicemail.c	15 Sep 2005 15:44:26 -0000	1.16
+++ app_hasnewvoicemail.c	5 Oct 2005 01:37:48 -0000	1.17
@@ -48,7 +48,7 @@
 static char *app_hasvoicemail = "HasVoicemail";
 static char *hasvoicemail_synopsis = "Conditionally branches to priority + 101";
 static char *hasvoicemail_descrip =
-"HasVoicemail(vmbox[@context][:folder][|varname])\n"
+"HasVoicemail(vmbox[/folder][@context][|varname])\n"
 "  Branches to priority + 101, if there is voicemail in folder indicated."
 "  Optionally sets <varname> to the number of messages in that folder."
 "  Assumes folder of INBOX if not specified.\n";
@@ -65,82 +65,141 @@
 
 LOCAL_USER_DECL;
 
+static int hasvoicemail_internal(char *context, char *box, char *folder)
+{
+	char vmpath[256];
+	DIR *vmdir;
+	struct dirent *vment;
+	int count=0;
+
+	snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, box, folder);
+	if ((vmdir = opendir(vmpath))) {
+		/* No matter what the format of VM, there will always be a .txt file for each message. */
+		while ((vment = readdir(vmdir))) {
+			if (!strncmp(vment->d_name + 7, ".txt", 4)) {
+				count++;
+				break;
+			}
+		}
+		closedir(vmdir);
+	}
+	return count;
+}
+
 static int hasvoicemail_exec(struct ast_channel *chan, void *data)
 {
-	int res=0;
 	struct localuser *u;
-	char vmpath[256], *temps, *input, *varname = NULL, *vmbox, *context = "default";
+	char *temps, *input, *varname = NULL, *vmbox, *context = "default";
 	char *vmfolder;
-	DIR *vmdir;
-	struct dirent *vment;
 	int vmcount = 0;
+	static int dep_warning = 0;
 
 	if (!data) {
-		ast_log(LOG_WARNING, "HasVoicemail requires an argument (vm-box[@context][:folder]|varname)\n");
+		ast_log(LOG_WARNING, "HasVoicemail requires an argument (vm-box[/folder][@context]|varname)\n");
 		return -1;
 	}
-	LOCAL_USER_ADD(u);
+
+	if (!dep_warning) {
+		ast_log(LOG_WARNING, "The applications HasVoicemail and HasNewVoicemail have been deprecated.  Please use the VMCOUNT() function instead.\n");
+		dep_warning = 1;
+	}
 
 	input = ast_strdupa((char *)data);
-	if (input) {
-		temps = input;
-		if ((temps = strsep(&input, "|"))) {
-			if (input && !ast_strlen_zero(input))
-				varname = input;
-			input = temps;
-		}
-		if ((temps = strsep(&input, ":"))) {
-			if (input && !ast_strlen_zero(input))
-				vmfolder = input;
-			input = temps;
-		}
-		if ((vmbox = strsep(&input, "@")))
-			if (input && !ast_strlen_zero(input))
-				context = input;
-		if (!vmbox)
-			vmbox = input;
-		vmfolder = strchr(vmbox, '/');
-		if (vmfolder) {
-			*vmfolder = '\0';
-			vmfolder++;
-		} else
-			vmfolder = "INBOX";
-		snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, vmbox, vmfolder);
-		if (!(vmdir = opendir(vmpath))) {
-			ast_log(LOG_NOTICE, "Voice mailbox %s at %s does not exist\n", vmbox, vmpath);
-		} else {
+	if (! input) {
+		ast_log(LOG_ERROR, "Out of memory error\n");
+		return -1;
+	}
 
-			/* No matter what the format of VM, there will always be a .txt file for each message. */
-			while ((vment = readdir(vmdir)))
-				if (!strncmp(vment->d_name + 7,".txt",4))
-					vmcount++;
-			closedir(vmdir);
-		}
-		/* Set the count in the channel variable */
-		if (varname) {
-			char tmp[12];
-			snprintf(tmp, sizeof(tmp), "%d", vmcount);
-			pbx_builtin_setvar_helper(chan, varname, tmp);
-		}
+	LOCAL_USER_ADD(u);
 
-		if (vmcount > 0) {
-			/* Branch to the next extension */
-			if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) 
-				ast_log(LOG_WARNING, "VM box %s@%s has new voicemail, but extension %s, priority %d doesn't exist\n", vmbox, context, chan->exten, chan->priority + 101);
-		}
+	temps = input;
+	if ((temps = strsep(&input, "|"))) {
+		if (input && !ast_strlen_zero(input))
+			varname = input;
+		input = temps;
+	}
+
+	if ((vmbox = strsep(&input, "@")))
+		if (input && !ast_strlen_zero(input))
+			context = input;
+	if (!vmbox)
+		vmbox = input;
+
+	vmfolder = strchr(vmbox, '/');
+	if (vmfolder) {
+		*vmfolder = '\0';
+		vmfolder++;
 	} else {
-		ast_log(LOG_ERROR, "Out of memory error\n");
+		vmfolder = "INBOX";
+	}
+
+	vmcount = hasvoicemail_internal(context, vmbox, vmfolder);
+	/* Set the count in the channel variable */
+	if (varname) {
+		char tmp[12];
+		snprintf(tmp, sizeof(tmp), "%d", vmcount);
+		pbx_builtin_setvar_helper(chan, varname, tmp);
+	}
+
+	if (vmcount > 0) {
+		/* Branch to the next extension */
+		if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) 
+			ast_log(LOG_WARNING, "VM box %s@%s has new voicemail, but extension %s, priority %d doesn't exist\n", vmbox, context, chan->exten, chan->priority + 101);
 	}
 
 	LOCAL_USER_REMOVE(u);
-	return res;
+	return 0;
 }
 
+static char *acf_vmcount_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+{
+	struct localuser *u;
+	char *args, *context, *box, *folder;
+
+	LOCAL_USER_ACF_ADD(u);
+
+	args = ast_strdupa(data);
+	if (!args) {
+		ast_log(LOG_ERROR, "Out of memory");
+		LOCAL_USER_REMOVE(u);
+		return "";
+	}
+
+	box = strsep(&args, "|");
+	if (strchr(box, '@')) {
+		context = box;
+		box = strsep(&context, "@");
+	} else {
+		context = "default";
+	}
+
+	if (args) {
+		folder = args;
+	} else {
+		folder = "INBOX";
+	}
+
+	snprintf(buf, len, "%d", hasvoicemail_internal(context, box, folder));
+	LOCAL_USER_REMOVE(u);
+	return buf;
+}
+
+struct ast_custom_function acf_vmcount = {
+	.name = "VMCOUNT",
+	.synopsis = "Counts the voicemail in a specified mailbox",
+	.syntax = "VMCOUNT(vmbox[@context][|folder])",
+	.desc =
+"  context - defaults to \"default\"\n"
+"  folder  - defaults to \"INBOX\"\n",
+	.read = acf_vmcount_exec,
+};
+
 int unload_module(void)
 {
 	int res;
 	STANDARD_HANGUP_LOCALUSERS;
-	res = ast_unregister_application(app_hasvoicemail);
+	res = ast_custom_function_unregister(&acf_vmcount);
+	res |= ast_unregister_application(app_hasvoicemail);
 	res |= ast_unregister_application(app_hasnewvoicemail);
 	return res;
 }
@@ -148,7 +207,8 @@
 int load_module(void)
 {
 	int res;
-	res = ast_register_application(app_hasvoicemail, hasvoicemail_exec, hasvoicemail_synopsis, hasvoicemail_descrip);
+	res = ast_custom_function_register(&acf_vmcount);
+	res |= ast_register_application(app_hasvoicemail, hasvoicemail_exec, hasvoicemail_synopsis, hasvoicemail_descrip);
 	res |= ast_register_application(app_hasnewvoicemail, hasvoicemail_exec, hasnewvoicemail_synopsis, hasnewvoicemail_descrip);
 	return res;
 }




More information about the svn-commits mailing list