00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "asterisk.h"
00028
00029 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 168547 $")
00030
00031 #include "asterisk/module.h"
00032 #include "asterisk/channel.h"
00033 #include "asterisk/pbx.h"
00034 #include "asterisk/utils.h"
00035 #include "asterisk/app.h"
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 static int isnull(struct ast_channel *chan, const char *cmd, char *data,
00115 char *buf, size_t len)
00116 {
00117 strcpy(buf, data && *data ? "0" : "1");
00118
00119 return 0;
00120 }
00121
00122 static int exists(struct ast_channel *chan, const char *cmd, char *data, char *buf,
00123 size_t len)
00124 {
00125 strcpy(buf, data && *data ? "1" : "0");
00126
00127 return 0;
00128 }
00129
00130 static int iftime(struct ast_channel *chan, const char *cmd, char *data, char *buf,
00131 size_t len)
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 }
00165
00166 static int acf_if(struct ast_channel *chan, const char *cmd, char *data, char *buf,
00167 size_t len)
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;
00178
00179
00180
00181
00182
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 }
00203
00204 static int set(struct ast_channel *chan, const char *cmd, char *data, char *buf,
00205 size_t len)
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 }
00225
00226 static int acf_import(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
00227 {
00228 AST_DECLARE_APP_ARGS(args,
00229 AST_APP_ARG(channel);
00230 AST_APP_ARG(varname);
00231 );
00232 AST_STANDARD_APP_ARGS(args, data);
00233 buf[0] = 0;
00234 if (!ast_strlen_zero(args.varname)) {
00235 struct ast_channel *chan2 = ast_get_channel_by_name_locked(args.channel);
00236 if (chan2) {
00237 char *s = alloca(strlen(args.varname) + 4);
00238 if (s) {
00239 sprintf(s, "${%s}", args.varname);
00240 pbx_substitute_variables_helper(chan2, s, buf, len);
00241 }
00242 ast_channel_unlock(chan2);
00243 }
00244 }
00245 return 0;
00246 }
00247
00248 static struct ast_custom_function isnull_function = {
00249 .name = "ISNULL",
00250 .read = isnull,
00251 };
00252
00253 static struct ast_custom_function set_function = {
00254 .name = "SET",
00255 .read = set,
00256 };
00257
00258 static struct ast_custom_function exists_function = {
00259 .name = "EXISTS",
00260 .read = exists,
00261 };
00262
00263 static struct ast_custom_function if_function = {
00264 .name = "IF",
00265 .read = acf_if,
00266 };
00267
00268 static struct ast_custom_function if_time_function = {
00269 .name = "IFTIME",
00270 .read = iftime,
00271 };
00272
00273 static struct ast_custom_function import_function = {
00274 .name = "IMPORT",
00275 .read = acf_import,
00276 };
00277
00278 static int unload_module(void)
00279 {
00280 int res = 0;
00281
00282 res |= ast_custom_function_unregister(&isnull_function);
00283 res |= ast_custom_function_unregister(&set_function);
00284 res |= ast_custom_function_unregister(&exists_function);
00285 res |= ast_custom_function_unregister(&if_function);
00286 res |= ast_custom_function_unregister(&if_time_function);
00287 res |= ast_custom_function_unregister(&import_function);
00288
00289 return res;
00290 }
00291
00292 static int load_module(void)
00293 {
00294 int res = 0;
00295
00296 res |= ast_custom_function_register(&isnull_function);
00297 res |= ast_custom_function_register(&set_function);
00298 res |= ast_custom_function_register(&exists_function);
00299 res |= ast_custom_function_register(&if_function);
00300 res |= ast_custom_function_register(&if_time_function);
00301 res |= ast_custom_function_register(&import_function);
00302
00303 return res;
00304 }
00305
00306 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Logical dialplan functions");