#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/linkedlists.h"
#include "asterisk/devicestate.h"
#include "asterisk/cli.h"
#include "asterisk/astdb.h"
#include "asterisk/app.h"
Go to the source code of this file.
Enumerations | |
enum | { HINT_OPT_NAME = (1 << 0) } |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static enum ast_device_state | custom_devstate_callback (const char *data) |
static int | devstate_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | devstate_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
static char * | handle_cli_devstate_change (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_cli_devstate_list (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_cli_funcdevstate_list (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static int | hint_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | load_module (void) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Gets or sets a device state in the dialplan" , .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 = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static const char | astdb_family [] = "CustomDevstate" |
static struct ast_cli_entry | cli_funcdevstate [] |
static struct ast_cli_entry | cli_funcdevstate_list_deprecated = { .handler = handle_cli_funcdevstate_list , .summary = "List currently known custom device states" ,__VA_ARGS__ } |
static struct ast_custom_function | devstate_function |
static struct ast_custom_function | hint_function |
static struct ast_app_option | hint_options [128] = { [ 'n' ] = { .flag = HINT_OPT_NAME }, } |
Definition in file func_devstate.c.
anonymous enum |
static void __reg_module | ( | void | ) | [static] |
Definition at line 374 of file func_devstate.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 374 of file func_devstate.c.
static enum ast_device_state custom_devstate_callback | ( | const char * | data | ) | [static] |
Definition at line 131 of file func_devstate.c.
References ast_db_get(), ast_devstate_val(), and buf.
Referenced by load_module().
00132 { 00133 char buf[256] = ""; 00134 00135 ast_db_get(astdb_family, data, buf, sizeof(buf)); 00136 00137 return ast_devstate_val(buf); 00138 }
static int devstate_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 49 of file func_devstate.c.
References ast_copy_string(), ast_device_state(), and ast_devstate_str().
00050 { 00051 ast_copy_string(buf, ast_devstate_str(ast_device_state(data)), len); 00052 00053 return 0; 00054 }
static int devstate_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
Definition at line 56 of file func_devstate.c.
References ast_db_put(), ast_device_state(), AST_DEVICE_UNKNOWN, ast_devstate_changed(), ast_devstate_val(), ast_log(), ast_strlen_zero(), len(), LOG_ERROR, and LOG_WARNING.
00057 { 00058 size_t len = strlen("Custom:"); 00059 enum ast_device_state state_val; 00060 00061 if (strncasecmp(data, "Custom:", len)) { 00062 ast_log(LOG_WARNING, "The DEVICE_STATE function can only be used to set 'Custom:' device state!\n"); 00063 return -1; 00064 } 00065 data += len; 00066 if (ast_strlen_zero(data)) { 00067 ast_log(LOG_WARNING, "DEVICE_STATE function called with no custom device name!\n"); 00068 return -1; 00069 } 00070 00071 state_val = ast_devstate_val(value); 00072 00073 if (state_val == AST_DEVICE_UNKNOWN) { 00074 ast_log(LOG_ERROR, "DEVICE_STATE function given invalid state value '%s'\n", value); 00075 return -1; 00076 } 00077 00078 ast_db_put(astdb_family, data, value); 00079 00080 ast_devstate_changed(state_val, "Custom:%s", data); 00081 00082 return 0; 00083 }
static char* handle_cli_devstate_change | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 228 of file func_devstate.c.
References ast_cli_args::argc, ast_cli_entry::args, ast_cli_args::argv, ast_cli(), ast_cli_complete(), ast_db_put(), ast_device_state(), AST_DEVICE_UNKNOWN, ast_devstate_changed(), ast_devstate_val(), ast_strlen_zero(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, len(), ast_cli_args::n, ast_cli_args::pos, ast_cli_entry::usage, and ast_cli_args::word.
00229 { 00230 size_t len; 00231 const char *dev, *state; 00232 enum ast_device_state state_val; 00233 00234 switch (cmd) { 00235 case CLI_INIT: 00236 e->command = "devstate change"; 00237 e->usage = 00238 "Usage: devstate change <device> <state>\n" 00239 " Change a custom device to a new state.\n" 00240 " The possible values for the state are:\n" 00241 "UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING\n" 00242 "RINGINUSE | ONHOLD\n", 00243 "\n" 00244 "Examples:\n" 00245 " devstate change Custom:mystate1 INUSE\n" 00246 " devstate change Custom:mystate1 NOT_INUSE\n" 00247 " \n"; 00248 return NULL; 00249 case CLI_GENERATE: 00250 { 00251 static char * const cmds[] = { "UNKNOWN", "NOT_INUSE", "INUSE", "BUSY", 00252 "UNAVAILABLE", "RINGING", "RINGINUSE", "ONHOLD", NULL }; 00253 00254 if (a->pos == e->args + 1) 00255 return ast_cli_complete(a->word, cmds, a->n); 00256 00257 return NULL; 00258 } 00259 } 00260 00261 if (a->argc != e->args + 2) 00262 return CLI_SHOWUSAGE; 00263 00264 len = strlen("Custom:"); 00265 dev = a->argv[e->args]; 00266 state = a->argv[e->args + 1]; 00267 00268 if (strncasecmp(dev, "Custom:", len)) { 00269 ast_cli(a->fd, "The devstate command can only be used to set 'Custom:' device state!\n"); 00270 return CLI_FAILURE; 00271 } 00272 00273 dev += len; 00274 if (ast_strlen_zero(dev)) 00275 return CLI_SHOWUSAGE; 00276 00277 state_val = ast_devstate_val(state); 00278 00279 if (state_val == AST_DEVICE_UNKNOWN) 00280 return CLI_SHOWUSAGE; 00281 00282 ast_cli(a->fd, "Changing %s to %s\n", dev, state); 00283 00284 ast_db_put(astdb_family, dev, state); 00285 00286 ast_devstate_changed(state_val, "Custom:%s", dev); 00287 00288 return CLI_SUCCESS; 00289 }
static char* handle_cli_devstate_list | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 184 of file func_devstate.c.
References ast_cli_args::argc, ast_cli_entry::args, ast_cli(), ast_db_freetree(), ast_db_gettree(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_db_entry::data, ast_cli_args::fd, ast_db_entry::key, ast_db_entry::next, and ast_cli_entry::usage.
00185 { 00186 struct ast_db_entry *db_entry, *db_tree; 00187 00188 switch (cmd) { 00189 case CLI_INIT: 00190 e->command = "devstate list"; 00191 e->usage = 00192 "Usage: devstate list\n" 00193 " List all custom device states that have been set by using\n" 00194 " the DEVICE_STATE dialplan function.\n"; 00195 return NULL; 00196 case CLI_GENERATE: 00197 return NULL; 00198 } 00199 00200 if (a->argc != e->args) 00201 return CLI_SHOWUSAGE; 00202 00203 ast_cli(a->fd, "\n" 00204 "---------------------------------------------------------------------\n" 00205 "--- Custom Device States --------------------------------------------\n" 00206 "---------------------------------------------------------------------\n" 00207 "---\n"); 00208 00209 db_entry = db_tree = ast_db_gettree(astdb_family, NULL); 00210 for (; db_entry; db_entry = db_entry->next) { 00211 const char *dev_name = strrchr(db_entry->key, '/') + 1; 00212 if (dev_name <= (const char *) 1) 00213 continue; 00214 ast_cli(a->fd, "--- Name: 'Custom:%s' State: '%s'\n" 00215 "---\n", dev_name, db_entry->data); 00216 } 00217 ast_db_freetree(db_tree); 00218 db_tree = NULL; 00219 00220 ast_cli(a->fd, 00221 "---------------------------------------------------------------------\n" 00222 "---------------------------------------------------------------------\n" 00223 "\n"); 00224 00225 return CLI_SUCCESS; 00226 }
static char* handle_cli_funcdevstate_list | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 140 of file func_devstate.c.
References ast_cli_args::argc, ast_cli_entry::args, ast_cli(), ast_db_freetree(), ast_db_gettree(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_db_entry::data, ast_cli_args::fd, ast_db_entry::key, ast_db_entry::next, and ast_cli_entry::usage.
00141 { 00142 struct ast_db_entry *db_entry, *db_tree; 00143 00144 switch (cmd) { 00145 case CLI_INIT: 00146 e->command = "funcdevstate list"; 00147 e->usage = 00148 "Usage: funcdevstate list\n" 00149 " List all custom device states that have been set by using\n" 00150 " the DEVICE_STATE dialplan function.\n"; 00151 return NULL; 00152 case CLI_GENERATE: 00153 return NULL; 00154 } 00155 00156 if (a->argc != e->args) 00157 return CLI_SHOWUSAGE; 00158 00159 ast_cli(a->fd, "\n" 00160 "---------------------------------------------------------------------\n" 00161 "--- Custom Device States --------------------------------------------\n" 00162 "---------------------------------------------------------------------\n" 00163 "---\n"); 00164 00165 db_entry = db_tree = ast_db_gettree(astdb_family, NULL); 00166 for (; db_entry; db_entry = db_entry->next) { 00167 const char *dev_name = strrchr(db_entry->key, '/') + 1; 00168 if (dev_name <= (const char *) 1) 00169 continue; 00170 ast_cli(a->fd, "--- Name: 'Custom:%s' State: '%s'\n" 00171 "---\n", dev_name, db_entry->data); 00172 } 00173 ast_db_freetree(db_tree); 00174 db_tree = NULL; 00175 00176 ast_cli(a->fd, 00177 "---------------------------------------------------------------------\n" 00178 "---------------------------------------------------------------------\n" 00179 "\n"); 00180 00181 return CLI_SUCCESS; 00182 }
static int hint_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 93 of file func_devstate.c.
References AST_APP_ARG, ast_app_parse_options(), AST_DECLARE_APP_ARGS, ast_get_hint(), ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_test_flag, chan, context, exten, HINT_OPT_NAME, hint_options, LOG_WARNING, and strsep().
00094 { 00095 char *exten, *context; 00096 AST_DECLARE_APP_ARGS(args, 00097 AST_APP_ARG(exten); 00098 AST_APP_ARG(options); 00099 ); 00100 struct ast_flags opts = { 0, }; 00101 int res; 00102 00103 if (ast_strlen_zero(data)) { 00104 ast_log(LOG_WARNING, "The HINT function requires an extension\n"); 00105 return -1; 00106 } 00107 00108 AST_STANDARD_APP_ARGS(args, data); 00109 00110 if (ast_strlen_zero(args.exten)) { 00111 ast_log(LOG_WARNING, "The HINT function requires an extension\n"); 00112 return -1; 00113 } 00114 00115 context = exten = args.exten; 00116 strsep(&context, "@"); 00117 if (ast_strlen_zero(context)) 00118 context = "default"; 00119 00120 if (!ast_strlen_zero(args.options)) 00121 ast_app_parse_options(hint_options, &opts, NULL, args.options); 00122 00123 if (ast_test_flag(&opts, HINT_OPT_NAME)) 00124 res = ast_get_hint(NULL, 0, buf, len, chan, context, exten); 00125 else 00126 res = ast_get_hint(buf, len, NULL, 0, chan, context, exten); 00127 00128 return !res; /* ast_get_hint returns non-zero on success */ 00129 }
static int load_module | ( | void | ) | [static] |
Definition at line 348 of file func_devstate.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_custom_function_register, ast_db_freetree(), ast_db_gettree(), ast_devstate_changed(), ast_devstate_prov_add(), ast_devstate_val(), cli_funcdevstate, custom_devstate_callback(), ast_db_entry::data, devstate_function, hint_function, ast_db_entry::key, and ast_db_entry::next.
00349 { 00350 int res = 0; 00351 struct ast_db_entry *db_entry, *db_tree; 00352 00353 /* Populate the device state cache on the system with all of the currently 00354 * known custom device states. */ 00355 db_entry = db_tree = ast_db_gettree(astdb_family, NULL); 00356 for (; db_entry; db_entry = db_entry->next) { 00357 const char *dev_name = strrchr(db_entry->key, '/') + 1; 00358 if (dev_name <= (const char *) 1) 00359 continue; 00360 ast_devstate_changed(ast_devstate_val(db_entry->data), 00361 "Custom:%s\n", dev_name); 00362 } 00363 ast_db_freetree(db_tree); 00364 db_tree = NULL; 00365 00366 res |= ast_custom_function_register(&devstate_function); 00367 res |= ast_custom_function_register(&hint_function); 00368 res |= ast_devstate_prov_add("Custom", custom_devstate_callback); 00369 res |= ast_cli_register_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate)); 00370 00371 return res; 00372 }
static int unload_module | ( | void | ) | [static] |
Definition at line 336 of file func_devstate.c.
References ARRAY_LEN, ast_cli_unregister_multiple(), ast_custom_function_unregister(), ast_devstate_prov_del(), cli_funcdevstate, devstate_function, and hint_function.
00337 { 00338 int res = 0; 00339 00340 res |= ast_custom_function_unregister(&devstate_function); 00341 res |= ast_custom_function_unregister(&hint_function); 00342 res |= ast_devstate_prov_del("Custom"); 00343 res |= ast_cli_unregister_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate)); 00344 00345 return res; 00346 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Gets or sets a device state in the dialplan" , .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 = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 374 of file func_devstate.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 374 of file func_devstate.c.
const char astdb_family[] = "CustomDevstate" [static] |
Definition at line 47 of file func_devstate.c.
struct ast_cli_entry cli_funcdevstate[] [static] |
Initial value:
{ { .handler = handle_cli_devstate_list , .summary = "List currently known custom device states" ,__VA_ARGS__ } .deprecate_cmd = &cli_funcdevstate_list_deprecated), { .handler = handle_cli_devstate_change , .summary = "Change a custom device state" ,__VA_ARGS__ }, }
Definition at line 292 of file func_devstate.c.
Referenced by load_module(), and unload_module().
struct ast_cli_entry cli_funcdevstate_list_deprecated = { .handler = handle_cli_funcdevstate_list , .summary = "List currently known custom device states" ,__VA_ARGS__ } [static] |
Definition at line 291 of file func_devstate.c.
struct ast_custom_function devstate_function [static] |
struct ast_custom_function hint_function [static] |
struct ast_app_option hint_options[128] = { [ 'n' ] = { .flag = HINT_OPT_NAME }, } [static] |