Thu Sep 7 01:03:29 2017

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"

Go to the source code of this file.

Functions

static int acf_if (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Logical dialplan functions")
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 import_helper (struct ast_channel *chan, const char *cmd, char *data, char *buf, struct ast_str **str, ssize_t len)
static int import_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int import_read2 (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_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 set2 (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
static int unload_module (void)

Variables

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 int acf_if ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 170 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.

00172 {
00173    AST_DECLARE_APP_ARGS(args1,
00174       AST_APP_ARG(expr);
00175       AST_APP_ARG(remainder);
00176    );
00177    AST_DECLARE_APP_ARGS(args2,
00178       AST_APP_ARG(iftrue);
00179       AST_APP_ARG(iffalse);
00180    );
00181    args2.iftrue = args2.iffalse = NULL; /* you have to set these, because if there is nothing after the '?',
00182                                  then args1.remainder will be NULL, not a pointer to a null string, and
00183                                  then any garbage in args2.iffalse will not be cleared, and you'll crash.
00184                                   -- and if you mod the ast_app_separate_args func instead, you'll really
00185                                  mess things up badly, because the rest of everything depends on null args
00186                                  for non-specified stuff. */
00187    
00188    AST_NONSTANDARD_APP_ARGS(args1, data, '?');
00189    AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
00190 
00191    if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
00192       ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>])  (expr must be non-null, and either <true> or <false> must be non-null)\n");
00193       ast_log(LOG_WARNING, "      In this case, <expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
00194       return -1;
00195    }
00196 
00197    args1.expr = ast_strip(args1.expr);
00198    if (args2.iftrue)
00199       args2.iftrue = ast_strip(args2.iftrue);
00200    if (args2.iffalse)
00201       args2.iffalse = ast_strip(args2.iffalse);
00202 
00203    ast_copy_string(buf, pbx_checkcondition(args1.expr) ? (S_OR(args2.iftrue, "")) : (S_OR(args2.iffalse, "")), len);
00204 
00205    return 0;
00206 }

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Logical dialplan functions"   
)
static int exists ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 126 of file func_logic.c.

Referenced by socket_process().

00128 {
00129    strcpy(buf, data && *data ? "1" : "0");
00130 
00131    return 0;
00132 }

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

Definition at line 134 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, and S_OR.

00136 {
00137    struct ast_timing timing;
00138    char *expr;
00139    char *iftrue;
00140    char *iffalse;
00141 
00142    data = ast_strip_quoted(data, "\"", "\"");
00143    expr = strsep(&data, "?");
00144    iftrue = strsep(&data, ":");
00145    iffalse = data;
00146 
00147    if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
00148       ast_log(LOG_WARNING,
00149             "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
00150       return -1;
00151    }
00152 
00153    if (!ast_build_timing(&timing, expr)) {
00154       ast_log(LOG_WARNING, "Invalid Time Spec.\n");
00155       ast_destroy_timing(&timing);
00156       return -1;
00157    }
00158 
00159    if (iftrue)
00160       iftrue = ast_strip_quoted(iftrue, "\"", "\"");
00161    if (iffalse)
00162       iffalse = ast_strip_quoted(iffalse, "\"", "\"");
00163 
00164    ast_copy_string(buf, ast_check_timing(&timing) ? S_OR(iftrue, "") : S_OR(iffalse, ""), len);
00165    ast_destroy_timing(&timing);
00166 
00167    return 0;
00168 }

static int import_helper ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
struct ast_str **  str,
ssize_t  len 
) [static]

Definition at line 238 of file func_logic.c.

References args, ast_alloca, AST_APP_ARG, ast_channel_get_by_name(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, ast_str_substitute_variables(), ast_strlen_zero(), and pbx_substitute_variables_helper().

Referenced by import_read(), and import_read2().

00239 {
00240    AST_DECLARE_APP_ARGS(args,
00241       AST_APP_ARG(channel);
00242       AST_APP_ARG(varname);
00243    );
00244    AST_STANDARD_APP_ARGS(args, data);
00245    if (buf) {
00246       *buf = '\0';
00247    }
00248 
00249    if (!ast_strlen_zero(args.varname)) {
00250       struct ast_channel *chan2;
00251 
00252       if ((chan2 = ast_channel_get_by_name(args.channel))) {
00253          char *s = ast_alloca(strlen(args.varname) + 4);
00254          sprintf(s, "${%s}", args.varname);
00255          ast_channel_lock(chan2);
00256          if (buf) {
00257             pbx_substitute_variables_helper(chan2, s, buf, len);
00258          } else {
00259             ast_str_substitute_variables(str, len, chan2, s);
00260          }
00261          ast_channel_unlock(chan2);
00262          chan2 = ast_channel_unref(chan2);
00263       }
00264    }
00265 
00266    return 0;
00267 }

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

Definition at line 269 of file func_logic.c.

References import_helper().

00270 {
00271    return import_helper(chan, cmd, data, buf, NULL, len);
00272 }

static int import_read2 ( struct ast_channel chan,
const char *  cmd,
char *  data,
struct ast_str **  str,
ssize_t  len 
) [static]

Definition at line 274 of file func_logic.c.

References import_helper().

00275 {
00276    return import_helper(chan, cmd, data, NULL, str, len);
00277 }

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

Definition at line 118 of file func_logic.c.

00120 {
00121    strcpy(buf, data && *data ? "0" : "1");
00122 
00123    return 0;
00124 }

static int load_module ( void   )  [static]

Definition at line 327 of file func_logic.c.

References ast_custom_function_register.

00328 {
00329    int res = 0;
00330 
00331    res |= ast_custom_function_register(&isnull_function);
00332    res |= ast_custom_function_register(&set_function);
00333    res |= ast_custom_function_register(&exists_function);
00334    res |= ast_custom_function_register(&if_function);
00335    res |= ast_custom_function_register(&if_time_function);
00336    res |= ast_custom_function_register(&import_function);
00337 
00338    return res;
00339 }

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

Definition at line 208 of file func_logic.c.

References ast_copy_string(), ast_log(), ast_strip(), ast_strlen_zero(), len(), LOG_WARNING, and pbx_builtin_setvar_helper().

00210 {
00211    char *varname;
00212    char *val;
00213 
00214    varname = strsep(&data, "=");
00215    val = data;
00216 
00217    if (ast_strlen_zero(varname) || !val) {
00218       ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
00219       return -1;
00220    }
00221 
00222    varname = ast_strip(varname);
00223    val = ast_strip(val);
00224    pbx_builtin_setvar_helper(chan, varname, val);
00225    ast_copy_string(buf, val, len);
00226 
00227    return 0;
00228 }

static int set2 ( struct ast_channel chan,
const char *  cmd,
char *  data,
struct ast_str **  str,
ssize_t  len 
) [static]

Definition at line 230 of file func_logic.c.

References ast_str_buffer(), ast_str_make_space(), and ast_str_size().

00231 {
00232    if (len > -1) {
00233       ast_str_make_space(str, len == 0 ? strlen(data) : len);
00234    }
00235    return set(chan, cmd, data, ast_str_buffer(*str), ast_str_size(*str));
00236 }

static int unload_module ( void   )  [static]

Definition at line 313 of file func_logic.c.

References ast_custom_function_unregister().


Variable Documentation

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

Definition at line 291 of file func_logic.c.

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

Definition at line 297 of file func_logic.c.

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

Definition at line 302 of file func_logic.c.

Initial value:
 {
   .name = "IMPORT",
   .read = import_read,
   .read2 = import_read2,
}

Definition at line 307 of file func_logic.c.

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

Definition at line 279 of file func_logic.c.

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

Definition at line 285 of file func_logic.c.


Generated on 7 Sep 2017 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1