00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <string.h>
00026 #include <sys/types.h>
00027
00028 #include "asterisk.h"
00029
00030
00031
00032 #include "asterisk/channel.h"
00033 #include "asterisk/pbx.h"
00034 #include "asterisk/logger.h"
00035 #include "asterisk/utils.h"
00036 #include "asterisk/app.h"
00037 #include "asterisk/config.h"
00038
00039 static char *builtin_function_isnull(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
00040 {
00041 return data && *data ? "0" : "1";
00042 }
00043
00044 static char *builtin_function_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
00045 {
00046 return data && *data ? "1" : "0";
00047 }
00048
00049 static char *builtin_function_iftime(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
00050 {
00051 struct ast_timing timing;
00052 char *ret;
00053 char *expr;
00054 char *iftrue;
00055 char *iffalse;
00056
00057 if (!(data = ast_strdupa(data))) {
00058 ast_log(LOG_WARNING, "Memory Error!\n");
00059 return NULL;
00060 }
00061
00062 data = ast_strip_quoted(data, "\"", "\"");
00063 expr = strsep(&data, "?");
00064 iftrue = strsep(&data, ":");
00065 iffalse = data;
00066
00067 if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
00068 ast_log(LOG_WARNING, "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
00069 return NULL;
00070 }
00071
00072 if (!ast_build_timing(&timing, expr)) {
00073 ast_log(LOG_WARNING, "Invalid Time Spec.\n");
00074 return NULL;
00075 }
00076
00077 if (iftrue)
00078 iftrue = ast_strip_quoted(iftrue, "\"", "\"");
00079 if (iffalse)
00080 iffalse = ast_strip_quoted(iffalse, "\"", "\"");
00081
00082 if ((ret = ast_check_timing(&timing) ? iftrue : iffalse)) {
00083 ast_copy_string(buf, ret, len);
00084 ret = buf;
00085 }
00086
00087 return ret;
00088 }
00089
00090 static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
00091 {
00092 char *ret;
00093 char *expr;
00094 char *iftrue;
00095 char *iffalse;
00096
00097 if (!(data = ast_strdupa(data))) {
00098 ast_log(LOG_WARNING, "Memory Error!\n");
00099 return NULL;
00100 }
00101
00102 data = ast_strip_quoted(data, "\"", "\"");
00103 expr = strsep(&data, "?");
00104 iftrue = strsep(&data, ":");
00105 iffalse = data;
00106
00107 if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
00108 ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>])\n");
00109 return NULL;
00110 }
00111
00112 expr = ast_strip(expr);
00113 if (iftrue)
00114 iftrue = ast_strip_quoted(iftrue, "\"", "\"");
00115 if (iffalse)
00116 iffalse = ast_strip_quoted(iffalse, "\"", "\"");
00117
00118 if ((ret = pbx_checkcondition(expr) ? iftrue : iffalse)) {
00119 ast_copy_string(buf, ret, len);
00120 ret = buf;
00121 }
00122
00123 return ret;
00124 }
00125
00126 static char *builtin_function_set(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
00127 {
00128 char *varname;
00129 char *val;
00130
00131 if (!(data = ast_strdupa(data))) {
00132 ast_log(LOG_WARNING, "Memory Error!\n");
00133 return NULL;
00134 }
00135
00136 varname = strsep(&data, "=");
00137 val = data;
00138
00139 if (ast_strlen_zero(varname) || !val) {
00140 ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
00141 return NULL;
00142 }
00143
00144 varname = ast_strip(varname);
00145 val = ast_strip(val);
00146 pbx_builtin_setvar_helper(chan, varname, val);
00147 ast_copy_string(buf, val, len);
00148
00149 return buf;
00150 }
00151
00152 #ifndef BUILTIN_FUNC
00153 static
00154 #endif
00155 struct ast_custom_function isnull_function = {
00156 .name = "ISNULL",
00157 .synopsis = "NULL Test: Returns 1 if NULL or 0 otherwise",
00158 .syntax = "ISNULL(<data>)",
00159 .read = builtin_function_isnull,
00160 };
00161
00162 #ifndef BUILTIN_FUNC
00163 static
00164 #endif
00165 struct ast_custom_function set_function = {
00166 .name = "SET",
00167 .synopsis = "SET assigns a value to a channel variable",
00168 .syntax = "SET(<varname>=[<value>])",
00169 .read = builtin_function_set,
00170 };
00171
00172 #ifndef BUILTIN_FUNC
00173 static
00174 #endif
00175 struct ast_custom_function exists_function = {
00176 .name = "EXISTS",
00177 .synopsis = "Existence Test: Returns 1 if exists, 0 otherwise",
00178 .syntax = "EXISTS(<data>)",
00179 .read = builtin_function_exists,
00180 };
00181
00182 #ifndef BUILTIN_FUNC
00183 static
00184 #endif
00185 struct ast_custom_function if_function = {
00186 .name = "IF",
00187 .synopsis = "Conditional: Returns the data following '?' if true else the data following ':'",
00188 .syntax = "IF(<expr>?[<true>][:<false>])",
00189 .read = builtin_function_if,
00190 };
00191
00192
00193 #ifndef BUILTIN_FUNC
00194 static
00195 #endif
00196 struct ast_custom_function if_time_function = {
00197 .name = "IFTIME",
00198 .synopsis = "Temporal Conditional: Returns the data following '?' if true else the data following ':'",
00199 .syntax = "IFTIME(<timespec>?[<true>][:<false>])",
00200 .read = builtin_function_iftime,
00201 };