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: 191140 $")
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 set2(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
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 }
00233
00234 static int import_helper(struct ast_channel *chan, const char *cmd, char *data, char *buf, struct ast_str **str, ssize_t len)
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 }
00266
00267 static int import_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
00268 {
00269 return import_helper(chan, cmd, data, buf, NULL, len);
00270 }
00271
00272 static int import_read2(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
00273 {
00274 return import_helper(chan, cmd, data, NULL, str, len);
00275 }
00276
00277 static struct ast_custom_function isnull_function = {
00278 .name = "ISNULL",
00279 .read = isnull,
00280 .read_max = 2,
00281 };
00282
00283 static struct ast_custom_function set_function = {
00284 .name = "SET",
00285 .read = set,
00286 .read2 = set2,
00287 };
00288
00289 static struct ast_custom_function exists_function = {
00290 .name = "EXISTS",
00291 .read = exists,
00292 .read_max = 2,
00293 };
00294
00295 static struct ast_custom_function if_function = {
00296 .name = "IF",
00297 .read = acf_if,
00298 };
00299
00300 static struct ast_custom_function if_time_function = {
00301 .name = "IFTIME",
00302 .read = iftime,
00303 };
00304
00305 static struct ast_custom_function import_function = {
00306 .name = "IMPORT",
00307 .read = import_read,
00308 .read2 = import_read2,
00309 };
00310
00311 static int unload_module(void)
00312 {
00313 int res = 0;
00314
00315 res |= ast_custom_function_unregister(&isnull_function);
00316 res |= ast_custom_function_unregister(&set_function);
00317 res |= ast_custom_function_unregister(&exists_function);
00318 res |= ast_custom_function_unregister(&if_function);
00319 res |= ast_custom_function_unregister(&if_time_function);
00320 res |= ast_custom_function_unregister(&import_function);
00321
00322 return res;
00323 }
00324
00325 static int load_module(void)
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 }
00338
00339 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Logical dialplan functions");