Use argument macro in app_dictate #6222
[asterisk/asterisk.git] / apps / app_dictate.c
old mode 100755 (executable)
new mode 100644 (file)
index bf17432..3935c81
  *
  * \brief Virtual Dictation Machine Application For Asterisk
  *
+ * \author Anthony Minessale II <anthmct@yahoo.com>
+ *
+ * \ingroup applications
  */
 
 #include <stdlib.h>
-#include <unistd.h>
+#include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #include <sys/stat.h>  /* for mkdir */
 
 #include "asterisk.h"
@@ -45,7 +49,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 static char *tdesc = "Virtual Dictation Machine";
 static char *app = "Dictate";
 static char *synopsis = "Virtual Dictation Machine";
-static char *desc = "  Dictate([<base_dir>])\n"
+static char *desc = "  Dictate([<base_dir>[|<filename>]])\n"
 "Start dictation machine using optional base dir for files.\n";
 
 
@@ -78,7 +82,12 @@ static int play_and_wait(struct ast_channel *chan, char *file, char *digits)
 
 static int dictate_exec(struct ast_channel *chan, void *data)
 {
-       char *mydata, *argv[2], *path = NULL, filein[256];
+       char *path = NULL, filein[256], *filename = "";
+       char *parse;
+       AST_DECLARE_APP_ARGS(args,
+               AST_APP_ARG(base);
+               AST_APP_ARG(filename);
+       );
        char dftbase[256];
        char *base;
        struct ast_flags flags = {0};
@@ -87,7 +96,6 @@ static int dictate_exec(struct ast_channel *chan, void *data)
        struct localuser *u;
        int ffactor = 320 * 80,
                res = 0,
-               argc = 0,
                done = 0,
                oldr = 0,
                lastop = 0,
@@ -101,16 +109,24 @@ static int dictate_exec(struct ast_channel *chan, void *data)
        LOCAL_USER_ADD(u);
        
        snprintf(dftbase, sizeof(dftbase), "%s/dictate", ast_config_AST_SPOOL_DIR);
-       if (data && !ast_strlen_zero(data) && (mydata = ast_strdupa(data))) {
-               argc = ast_separate_app_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
-       }
+       if (!ast_strlen_zero(data)) {
+               parse = ast_strdupa(data);
+               if (!parse) {
+                       ast_log(LOG_ERROR, "Out of memory!\n");
+                       return -1;
+               }
+               AST_STANDARD_APP_ARGS(args, parse);
+       } else
+               args.argc = 0;
        
-       if (argc) {
-               base = argv[0];
+       if (args.argc && !ast_strlen_zero(args.base)) {
+               base = args.base;
        } else {
                base = dftbase;
        }
-
+       if (args.argc > 1 && args.filename) {
+               filename = args.filename;
+       } 
        oldr = chan->readformat;
        if ((res = ast_set_read_format(chan, AST_FORMAT_SLINEAR)) < 0) {
                ast_log(LOG_WARNING, "Unable to set to linear mode.\n");
@@ -120,13 +136,17 @@ static int dictate_exec(struct ast_channel *chan, void *data)
 
        ast_answer(chan);
        ast_safe_sleep(chan, 200);
-       for(res = 0; !res;) {
-               if (ast_app_getdata(chan, "dictate/enter_filename", filein, sizeof(filein), 0) || 
-                       ast_strlen_zero(filein)) {
-                       res = -1;
-                       break;
+       for (res = 0; !res;) {
+               if (ast_strlen_zero(filename)) {
+                       if (ast_app_getdata(chan, "dictate/enter_filename", filein, sizeof(filein), 0) || 
+                               ast_strlen_zero(filein)) {
+                               res = -1;
+                               break;
+                       }
+               } else {
+                       ast_copy_string(filein, filename, sizeof(filein));
+                       filename = "";
                }
-               
                mkdir(base, 0755);
                len = strlen(base) + strlen(filein) + 2;
                if (!path || len > maxlen) {