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 |
Conditional logic dialplan functions.
Definition in 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 }
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().
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.
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().
00314 { 00315 int res = 0; 00316 00317 res |= ast_custom_function_unregister(&isnull_function); 00318 res |= ast_custom_function_unregister(&set_function); 00319 res |= ast_custom_function_unregister(&exists_function); 00320 res |= ast_custom_function_unregister(&if_function); 00321 res |= ast_custom_function_unregister(&if_time_function); 00322 res |= ast_custom_function_unregister(&import_function); 00323 00324 return res; 00325 }
struct ast_custom_function exists_function [static] |
{ .name = "EXISTS", .read = exists, .read_max = 2, }
Definition at line 291 of file func_logic.c.
struct ast_custom_function if_function [static] |
{ .name = "IF", .read = acf_if, }
Definition at line 297 of file func_logic.c.
struct ast_custom_function if_time_function [static] |
{ .name = "IFTIME", .read = iftime, }
Definition at line 302 of file func_logic.c.
struct ast_custom_function import_function [static] |
{ .name = "IMPORT", .read = import_read, .read2 = import_read2, }
Definition at line 307 of file func_logic.c.
struct ast_custom_function isnull_function [static] |
{ .name = "ISNULL", .read = isnull, .read_max = 2, }
Definition at line 279 of file func_logic.c.
struct ast_custom_function set_function [static] |
{ .name = "SET", .read = set, .read2 = set2, }
Definition at line 285 of file func_logic.c.