Merged revisions 45999 via svnmerge from
[asterisk/asterisk.git] / res / res_clioriginate.c
index e325cc3..44afd7b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 2005, Digium, Inc.
+ * Copyright (C) 2005 - 2006, Digium, Inc.
  *
  * Russell Bryant <russell@digium.com>
  *
 
 /*! 
  * \file
+ * \author Russell Bryant <russell@digium.com>
  *
  * \brief Originate calls via the CLI
  * 
  */
 
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision: 1.1 $");
-
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/logger.h"
@@ -42,10 +43,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision: 1.1 $");
 /*! The timeout for originated calls, in seconds */
 #define TIMEOUT 30
 
-STANDARD_USECOUNT_DECL;
-
-static char *tdesc = "Call origination from the CLI";
-
 static char orig_help[] = 
 "  There are two ways to use this command. A call can be originated between a\n"
 "channel and a specific application, or between a channel and an extension in\n"
@@ -64,11 +61,15 @@ static char orig_help[] =
 "used. If no extension is given, the 's' extension will be used.\n";
 
 static int handle_orig(int fd, int argc, char *argv[]);
-static char *complete_orig(char *line, char *word, int pos, int state);
+static char *complete_orig(const char *line, const char *word, int pos, int state);
 
-struct ast_cli_entry cli_orig = { { "originate", NULL }, handle_orig, "Originate a call", orig_help, complete_orig };
+struct ast_cli_entry cli_cliorig[] = {
+       { { "originate", NULL },
+       handle_orig, "Originate a call",
+       orig_help, complete_orig },
+};
 
-static int orig_app(const char *chan, const char *app, const char *appdata)
+static int orig_app(int fd, const char *chan, const char *app, const char *appdata)
 {
        char *chantech;
        char *chandata;
@@ -78,18 +79,19 @@ static int orig_app(const char *chan, const char *app, const char *appdata)
                return RESULT_SHOWUSAGE;
 
        chandata = ast_strdupa(chan);
+       
+       chantech = strsep(&chandata, "/");
        if (!chandata) {
-               ast_log(LOG_ERROR, "Out of Memory!\n");
-               return RESULT_FAILURE;
+               ast_cli(fd, "*** No data provided after channel type! ***\n");
+               return RESULT_SHOWUSAGE;
        }
-       chantech = strsep(&chandata, "/");
 
-       ast_pbx_outgoing_app(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, app, appdata, &reason, 1, NULL, NULL, NULL, NULL);
+       ast_pbx_outgoing_app(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, app, appdata, &reason, 1, NULL, NULL, NULL, NULL, NULL);
 
        return RESULT_SUCCESS;
 }
 
-static int orig_exten(const char *chan, const char *data)
+static int orig_exten(int fd, const char *chan, const char *data)
 {
        char *chantech;
        char *chandata;
@@ -98,18 +100,15 @@ static int orig_exten(const char *chan, const char *data)
        int reason = 0;
 
        chandata = ast_strdupa(chan);
+       
+       chantech = strsep(&chandata, "/");
        if (!chandata) {
-               ast_log(LOG_ERROR, "Out of Memory!\n");
-               return RESULT_FAILURE;
+               ast_cli(fd, "*** No data provided after channel type! ***\n");
+               return RESULT_SHOWUSAGE;
        }
-       chantech = strsep(&chandata, "/");
 
        if (!ast_strlen_zero(data)) {
                context = ast_strdupa(data);
-               if (!context) {
-                       ast_log(LOG_ERROR, "Out of Memory!\n");
-                       return RESULT_FAILURE;
-               }
                exten = strsep(&context, "@");
        }
 
@@ -118,7 +117,7 @@ static int orig_exten(const char *chan, const char *data)
        if (ast_strlen_zero(context))
                context = "default";
        
-       ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 1, NULL, NULL, NULL, NULL);
+       ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 1, NULL, NULL, NULL, NULL, NULL);
 
        return RESULT_SUCCESS;
 }
@@ -130,73 +129,47 @@ static int handle_orig(int fd, int argc, char *argv[])
        if (ast_strlen_zero(argv[1]) || ast_strlen_zero(argv[2]))
                return RESULT_SHOWUSAGE;
 
-       STANDARD_INCREMENT_USECOUNT;
+       /* ugly, can be removed when CLI entries have ast_module pointers */
+       ast_module_ref(ast_module_info->self);
 
        if (!strcasecmp("application", argv[2])) {
-               res = orig_app(argv[1], argv[3], argv[4]);      
+               res = orig_app(fd, argv[1], argv[3], argv[4]);  
        } else if (!strcasecmp("extension", argv[2])) {
-               res = orig_exten(argv[1], argv[3]);
+               res = orig_exten(fd, argv[1], argv[3]);
        } else
                res = RESULT_SHOWUSAGE;
 
-       STANDARD_DECREMENT_USECOUNT;
+       ast_module_unref(ast_module_info->self);
 
        return res;
 }
 
-static char *complete_orig(char *line, char *word, int pos, int state)
+static char *complete_orig(const char *line, const char *word, int pos, int state)
 {
-       int wordlen;
-       char *app = "application";
-       char *exten = "extension";
-       char *ret = NULL;
+       static char *choices[] = { "application", "extension", NULL };
+       char *ret;
 
-       if (pos != 2 || state)
+       if (pos != 2)
                return NULL;
 
-       STANDARD_INCREMENT_USECOUNT;
-
-       wordlen = strlen(word);
-
-       if (ast_strlen_zero(word)) {
-               /* show the options in alphabetical order */
-               if (!state)
-                       ret = strdup(app);
-               else
-                       ret = strdup(exten);
-       } else if (!strncasecmp(word, app, wordlen)) {
-               ret = strdup(app);
-       } else if (!strncasecmp(word, exten, wordlen)) {
-               ret = strdup(exten);
-       }
-
-       STANDARD_DECREMENT_USECOUNT;
+       /* ugly, can be removed when CLI entries have ast_module pointers */
+       ast_module_ref(ast_module_info->self);
+       ret = ast_cli_complete(word, choices, state);
+       ast_module_unref(ast_module_info->self);
 
        return ret;
 }
 
-int unload_module(void)
-{
-       return ast_cli_unregister(&cli_orig);
-}
-
-int load_module(void)
-{
-       return ast_cli_register(&cli_orig);
-}
-
-char *description(void)
-{
-       return tdesc;
-}
-
-int usecount(void)
+static int unload_module(void)
 {
+       ast_cli_unregister_multiple(cli_cliorig, sizeof(cli_cliorig) / sizeof(struct ast_cli_entry));
        return 0;
 }
 
-char *key()
+static int load_module(void)
 {
-       return ASTERISK_GPL_KEY;
+       ast_cli_register_multiple(cli_cliorig, sizeof(cli_cliorig) / sizeof(struct ast_cli_entry));
+       return 0;
 }
 
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call origination from the CLI");