Thu Apr 28 2011 17:16:06

Asterisk developer's documentation


func_logic.c File Reference

Conditional logic dialplan functions. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
Include dependency graph for func_logic.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int acf_if (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int acf_import (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int exists (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int iftime (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int isnull (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int load_module (void)
static int set (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Logical dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_custom_function exists_function
static struct ast_custom_function if_function
static struct ast_custom_function if_time_function
static struct ast_custom_function import_function
static struct ast_custom_function isnull_function
static struct ast_custom_function set_function

Detailed Description

Conditional logic dialplan functions.

Author:
Anthony Minessale II

Definition in file func_logic.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 306 of file func_logic.c.

static void __unreg_module ( void  ) [static]

Definition at line 306 of file func_logic.c.

static int acf_if ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 166 of file func_logic.c.

References AST_APP_ARG, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_log(), AST_NONSTANDARD_APP_ARGS, ast_strip(), ast_strlen_zero(), LOG_WARNING, pbx_checkcondition(), and S_OR.

{
   AST_DECLARE_APP_ARGS(args1,
      AST_APP_ARG(expr);
      AST_APP_ARG(remainder);
   );
   AST_DECLARE_APP_ARGS(args2,
      AST_APP_ARG(iftrue);
      AST_APP_ARG(iffalse);
   );
   args2.iftrue = args2.iffalse = NULL; /* you have to set these, because if there is nothing after the '?',
                                 then args1.remainder will be NULL, not a pointer to a null string, and
                                 then any garbage in args2.iffalse will not be cleared, and you'll crash.
                                  -- and if you mod the ast_app_separate_args func instead, you'll really
                                 mess things up badly, because the rest of everything depends on null args
                                 for non-specified stuff. */
   
   AST_NONSTANDARD_APP_ARGS(args1, data, '?');
   AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');

   if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
      ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>])  (expr must be non-null, and either <true> or <false> must be non-null)\n");
      ast_log(LOG_WARNING, "      In this case, <expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
      return -1;
   }

   args1.expr = ast_strip(args1.expr);
   if (args2.iftrue)
      args2.iftrue = ast_strip(args2.iftrue);
   if (args2.iffalse)
      args2.iffalse = ast_strip(args2.iffalse);

   ast_copy_string(buf, pbx_checkcondition(args1.expr) ? (S_OR(args2.iftrue, "")) : (S_OR(args2.iffalse, "")), len);

   return 0;
}
static int acf_import ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 226 of file func_logic.c.

References AST_APP_ARG, ast_channel_unlock, AST_DECLARE_APP_ARGS, ast_get_channel_by_name_locked(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), pbx_substitute_variables_helper(), and s.

{
   AST_DECLARE_APP_ARGS(args,
      AST_APP_ARG(channel);
      AST_APP_ARG(varname);
   );
   AST_STANDARD_APP_ARGS(args, data);
   buf[0] = 0;
   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 int exists ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 122 of file func_logic.c.

Referenced by socket_process().

{
   strcpy(buf, data && *data ? "1" : "0");

   return 0;
}
static int iftime ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 130 of file func_logic.c.

References ast_build_timing(), ast_check_timing(), ast_copy_string(), ast_destroy_timing(), ast_log(), ast_strip_quoted(), ast_strlen_zero(), LOG_WARNING, S_OR, and strsep().

{
   struct ast_timing timing;
   char *expr;
   char *iftrue;
   char *iffalse;

   data = ast_strip_quoted(data, "\"", "\"");
   expr = strsep(&data, "?");
   iftrue = strsep(&data, ":");
   iffalse = data;

   if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
      ast_log(LOG_WARNING,
            "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
      return -1;
   }

   if (!ast_build_timing(&timing, expr)) {
      ast_log(LOG_WARNING, "Invalid Time Spec.\n");
      ast_destroy_timing(&timing);
      return -1;
   }

   if (iftrue)
      iftrue = ast_strip_quoted(iftrue, "\"", "\"");
   if (iffalse)
      iffalse = ast_strip_quoted(iffalse, "\"", "\"");

   ast_copy_string(buf, ast_check_timing(&timing) ? S_OR(iftrue, "") : S_OR(iffalse, ""), len);
   ast_destroy_timing(&timing);

   return 0;
}
static int isnull ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 114 of file func_logic.c.

{
   strcpy(buf, data && *data ? "0" : "1");

   return 0;
}
static int set ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 204 of file func_logic.c.

References ast_copy_string(), ast_log(), ast_strip(), ast_strlen_zero(), ast_channel::data, len(), LOG_WARNING, pbx_builtin_setvar_helper(), strsep(), and val.

{
   char *varname;
   char *val;

   varname = strsep(&data, "=");
   val = data;

   if (ast_strlen_zero(varname) || !val) {
      ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
      return -1;
   }

   varname = ast_strip(varname);
   val = ast_strip(val);
   pbx_builtin_setvar_helper(chan, varname, val);
   ast_copy_string(buf, val, len);

   return 0;
}

Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Logical dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 306 of file func_logic.c.

Definition at line 306 of file func_logic.c.

Initial value:
 {
   .name = "EXISTS",
   .read = exists,
}

Definition at line 258 of file func_logic.c.

Initial value:
 {
   .name = "IF",
   .read = acf_if,
}

Definition at line 263 of file func_logic.c.

Initial value:
 {
   .name = "IFTIME",
   .read = iftime,
}

Definition at line 268 of file func_logic.c.

Initial value:
 {
   .name = "IMPORT",
   .read = acf_import,
}

Definition at line 273 of file func_logic.c.

Initial value:
 {
   .name = "ISNULL",
   .read = isnull,
}

Definition at line 248 of file func_logic.c.

Initial value:
 {
   .name = "SET",
   .read = set,
}

Definition at line 253 of file func_logic.c.