Mon Jun 27 16:51:14 2011

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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .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 339 of file func_logic.c.

static void __unreg_module ( void   )  [static]

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

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

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

00124 {
00125    strcpy(buf, data && *data ? "1" : "0");
00126 
00127    return 0;
00128 }

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().

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

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 234 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().

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

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

Definition at line 267 of file func_logic.c.

References import_helper().

00268 {
00269    return import_helper(chan, cmd, data, buf, NULL, len);
00270 }

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

Definition at line 272 of file func_logic.c.

References import_helper(), and str.

00273 {
00274    return import_helper(chan, cmd, data, NULL, str, len);
00275 }

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.

00116 {
00117    strcpy(buf, data && *data ? "0" : "1");
00118 
00119    return 0;
00120 }

static int load_module ( void   )  [static]

Definition at line 325 of file func_logic.c.

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

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

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

Referenced by set2().

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

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

Definition at line 226 of file func_logic.c.

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

00227 {
00228    if (len > -1) {
00229       ast_str_make_space(str, len == 0 ? strlen(data) : len);
00230    }
00231    return set(chan, cmd, data, ast_str_buffer(*str), ast_str_size(*str));
00232 }

static int unload_module ( void   )  [static]

Definition at line 311 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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 339 of file func_logic.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 339 of file func_logic.c.

struct ast_custom_function exists_function [static]

Initial value:

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

Definition at line 289 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 295 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 300 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 305 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 277 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 283 of file func_logic.c.

Referenced by load_module(), and unload_module().


Generated on Mon Jun 27 16:51:14 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7