Merge the dialplan_aesthetics branch. Most of this patch simply converts applications
[asterisk/asterisk.git] / funcs / func_logic.c
index aebcb4c..92c4f8b 100644 (file)
  * \brief Conditional logic dialplan functions
  * 
  * \author Anthony Minessale II
+ *
+ * \ingroup functions
  */
 
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
 #include "asterisk/module.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
@@ -37,7 +40,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/utils.h"
 #include "asterisk/app.h"
 
-static int isnull(struct ast_channel *chan, char *cmd, char *data,
+static int isnull(struct ast_channel *chan, const char *cmd, char *data,
                  char *buf, size_t len)
 {
        strcpy(buf, data && *data ? "0" : "1");
@@ -45,7 +48,7 @@ static int isnull(struct ast_channel *chan, char *cmd, char *data,
        return 0;
 }
 
-static int exists(struct ast_channel *chan, char *cmd, char *data, char *buf,
+static int exists(struct ast_channel *chan, const char *cmd, char *data, char *buf,
                  size_t len)
 {
        strcpy(buf, data && *data ? "1" : "0");
@@ -53,7 +56,7 @@ static int exists(struct ast_channel *chan, char *cmd, char *data, char *buf,
        return 0;
 }
 
-static int iftime(struct ast_channel *chan, char *cmd, char *data, char *buf,
+static int iftime(struct ast_channel *chan, const char *cmd, char *data, char *buf,
                  size_t len)
 {
        struct ast_timing timing;
@@ -87,7 +90,7 @@ static int iftime(struct ast_channel *chan, char *cmd, char *data, char *buf,
        return 0;
 }
 
-static int acf_if(struct ast_channel *chan, char *cmd, char *data, char *buf,
+static int acf_if(struct ast_channel *chan, const char *cmd, char *data, char *buf,
                  size_t len)
 {
        char *expr;
@@ -110,12 +113,12 @@ static int acf_if(struct ast_channel *chan, char *cmd, char *data, char *buf,
        if (iffalse)
                iffalse = ast_strip_quoted(iffalse, "\"", "\"");
 
-       ast_copy_string(buf, ast_true(expr) ? iftrue : iffalse, len);
+       ast_copy_string(buf, pbx_checkcondition(expr) ? (S_OR(iftrue, "")) : (S_OR(iffalse, "")), len);
 
        return 0;
 }
 
-static int set(struct ast_channel *chan, char *cmd, char *data, char *buf,
+static int set(struct ast_channel *chan, const char *cmd, char *data, char *buf,
               size_t len)
 {
        char *varname;
@@ -137,6 +140,29 @@ static int set(struct ast_channel *chan, char *cmd, char *data, char *buf,
        return 0;
 }
 
+static int acf_import(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+       AST_DECLARE_APP_ARGS(args,
+               AST_APP_ARG(channel);
+               AST_APP_ARG(varname);
+       );
+       AST_STANDARD_APP_ARGS(args, data);
+       memset(buf, 0, len);
+
+       if (!ast_strlen_zero(args.varname)) {
+               struct ast_channel *chan2 = ast_get_channel_by_name_locked(args.channel);
+               if (chan2) {
+                       char *s = alloca(strlen(args.varname) + 4);
+                       if (s) {
+                               sprintf(s, "${%s}", args.varname);
+                               pbx_substitute_variables_helper(chan2, s, buf, len);
+                       }
+                       ast_channel_unlock(chan2);
+               }
+       }
+       return 0;
+}
+
 static struct ast_custom_function isnull_function = {
        .name = "ISNULL",
        .synopsis = "NULL Test: Returns 1 if NULL or 0 otherwise",
@@ -161,7 +187,7 @@ static struct ast_custom_function exists_function = {
 static struct ast_custom_function if_function = {
        .name = "IF",
        .synopsis =
-               "Conditional: Returns the data following '?' if true else the data following ':'",
+               "Conditional: Returns the data following '?' if true, else the data following ':'",
        .syntax = "IF(<expr>?[<true>][:<false>])",
        .read = acf_if,
 };
@@ -169,14 +195,20 @@ static struct ast_custom_function if_function = {
 static struct ast_custom_function if_time_function = {
        .name = "IFTIME",
        .synopsis =
-               "Temporal Conditional: Returns the data following '?' if true else the data following ':'",
+               "Temporal Conditional: Returns the data following '?' if true, else the data following ':'",
        .syntax = "IFTIME(<timespec>?[<true>][:<false>])",
        .read = iftime,
 };
 
-static char *tdesc = "Logical dialplan functions";
+static struct ast_custom_function import_function = {
+       .name = "IMPORT",
+       .synopsis =
+               "Retrieve the value of a variable from another channel\n",
+       .syntax = "IMPORT(channel,variable)",
+       .read = acf_import,
+};
 
-static int unload_module(void *mod)
+static int unload_module(void)
 {
        int res = 0;
 
@@ -185,11 +217,12 @@ static int unload_module(void *mod)
        res |= ast_custom_function_unregister(&exists_function);
        res |= ast_custom_function_unregister(&if_function);
        res |= ast_custom_function_unregister(&if_time_function);
+       res |= ast_custom_function_unregister(&import_function);
 
        return res;
 }
 
-static int load_module(void *mod)
+static int load_module(void)
 {
        int res = 0;
 
@@ -198,18 +231,9 @@ static int load_module(void *mod)
        res |= ast_custom_function_register(&exists_function);
        res |= ast_custom_function_register(&if_function);
        res |= ast_custom_function_register(&if_time_function);
+       res |= ast_custom_function_register(&import_function);
 
        return res;
 }
 
-static const char *description(void)
-{
-       return tdesc;
-}
-
-static const char *key(void)
-{
-       return ASTERISK_GPL_KEY;
-}
-
-STD_MOD(MOD_1 | NO_USECOUNT, NULL, NULL, NULL);
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Logical dialplan functions");