Sat Mar 10 01:55:25 2012

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 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 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_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
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 343 of file func_logic.c.

static void __unreg_module ( void   )  [static]

Definition at line 343 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 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 }

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 exec(), exists(), and 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, S_OR, and strsep().

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_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(), pbx_substitute_variables_helper(), and str.

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 = alloca(strlen(args.varname) + 4);
00254          if (s) {
00255             sprintf(s, "${%s}", args.varname);
00256             ast_channel_lock(chan2);
00257             if (buf) {
00258                pbx_substitute_variables_helper(chan2, s, buf, len);
00259             } else {
00260                ast_str_substitute_variables(str, len, chan2, s);
00261             }
00262             ast_channel_unlock(chan2);
00263          }
00264          chan2 = ast_channel_unref(chan2);
00265       }
00266    }
00267 
00268    return 0;
00269 }

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

Definition at line 271 of file func_logic.c.

References import_helper().

00272 {
00273    return import_helper(chan, cmd, data, buf, NULL, len);
00274 }

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

Definition at line 276 of file func_logic.c.

References import_helper(), and str.

00277 {
00278    return import_helper(chan, cmd, data, NULL, str, len);
00279 }

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 329 of file func_logic.c.

References ast_custom_function_register, exists_function, if_function, if_time_function, import_function, isnull_function, and set_function.

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

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(), LOG_WARNING, pbx_builtin_setvar_helper(), and strsep().

Referenced by set2().

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(), ast_str_size(), set(), and str.

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 315 of file func_logic.c.

References ast_custom_function_unregister(), exists_function, if_function, if_time_function, import_function, isnull_function, and set_function.


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 343 of file func_logic.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 343 of file func_logic.c.

struct ast_custom_function exists_function [static]

Initial value:

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

Definition at line 293 of file func_logic.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function if_function [static]

Initial value:

 {
   .name = "IF",
   .read = acf_if,
}

Definition at line 299 of file func_logic.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function if_time_function [static]

Initial value:

 {
   .name = "IFTIME",
   .read = iftime,
}

Definition at line 304 of file func_logic.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function import_function [static]

Initial value:

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

Definition at line 309 of file func_logic.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function isnull_function [static]

Initial value:

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

Definition at line 281 of file func_logic.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function set_function [static]

Initial value:

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

Definition at line 287 of file func_logic.c.

Referenced by load_module(), and unload_module().


Generated on Sat Mar 10 01:55:25 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7