Fri Jul 15 2011 12:01:53

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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Logical dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Logical dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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.