Manually controlled blinky lights. More...
#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 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 __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Gets or sets a device state in the dialplan" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .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_custom_function | devstate_function |
static struct ast_custom_function | hint_function |
static struct ast_app_option | hint_options [128] = { [ 'n' ] = { .flag = HINT_OPT_NAME }, } |
Manually controlled blinky lights.
Definition in file func_devstate.c.
anonymous enum |
Definition at line 136 of file func_devstate.c.
{ HINT_OPT_NAME = (1 << 0), };
static void __reg_module | ( | void | ) | [static] |
Definition at line 352 of file func_devstate.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 352 of file func_devstate.c.
static enum ast_device_state custom_devstate_callback | ( | const char * | data | ) | [static] |
Definition at line 182 of file func_devstate.c.
References ast_db_get(), ast_devstate_val(), and buf.
Referenced by load_module().
{ char buf[256] = ""; ast_db_get(astdb_family, data, buf, sizeof(buf)); return ast_devstate_val(buf); }
static int devstate_read | ( | struct ast_channel * | chan, |
const char * | cmd, | ||
char * | data, | ||
char * | buf, | ||
size_t | len | ||
) | [static] |
Definition at line 100 of file func_devstate.c.
References ast_copy_string(), and ast_devstate_str().
{ ast_copy_string(buf, ast_devstate_str(ast_device_state(data)), len); return 0; }
static int devstate_write | ( | struct ast_channel * | chan, |
const char * | cmd, | ||
char * | data, | ||
const char * | value | ||
) | [static] |
Definition at line 107 of file func_devstate.c.
References ast_db_put(), AST_DEVICE_UNKNOWN, ast_devstate_changed(), ast_devstate_val(), ast_log(), ast_strlen_zero(), len(), LOG_ERROR, and LOG_WARNING.
{ size_t len = strlen("Custom:"); enum ast_device_state state_val; if (strncasecmp(data, "Custom:", len)) { ast_log(LOG_WARNING, "The DEVICE_STATE function can only be used to set 'Custom:' device state!\n"); return -1; } data += len; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "DEVICE_STATE function called with no custom device name!\n"); return -1; } state_val = ast_devstate_val(value); if (state_val == AST_DEVICE_UNKNOWN) { ast_log(LOG_ERROR, "DEVICE_STATE function given invalid state value '%s'\n", value); return -1; } ast_db_put(astdb_family, data, value); ast_devstate_changed(state_val, "Custom:%s", data); return 0; }
static char* handle_cli_devstate_change | ( | struct ast_cli_entry * | e, |
int | cmd, | ||
struct ast_cli_args * | a | ||
) | [static] |
Definition at line 235 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_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.
{ size_t len; const char *dev, *state; enum ast_device_state state_val; switch (cmd) { case CLI_INIT: e->command = "devstate change"; e->usage = "Usage: devstate change <device> <state>\n" " Change a custom device to a new state.\n" " The possible values for the state are:\n" "UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING\n" "RINGINUSE | ONHOLD\n", "\n" "Examples:\n" " devstate change Custom:mystate1 INUSE\n" " devstate change Custom:mystate1 NOT_INUSE\n" " \n"; return NULL; case CLI_GENERATE: { static char * const cmds[] = { "UNKNOWN", "NOT_INUSE", "INUSE", "BUSY", "UNAVAILABLE", "RINGING", "RINGINUSE", "ONHOLD", NULL }; if (a->pos == e->args + 1) return ast_cli_complete(a->word, cmds, a->n); return NULL; } } if (a->argc != e->args + 2) return CLI_SHOWUSAGE; len = strlen("Custom:"); dev = a->argv[e->args]; state = a->argv[e->args + 1]; if (strncasecmp(dev, "Custom:", len)) { ast_cli(a->fd, "The devstate command can only be used to set 'Custom:' device state!\n"); return CLI_FAILURE; } dev += len; if (ast_strlen_zero(dev)) return CLI_SHOWUSAGE; state_val = ast_devstate_val(state); if (state_val == AST_DEVICE_UNKNOWN) return CLI_SHOWUSAGE; ast_cli(a->fd, "Changing %s to %s\n", dev, state); ast_db_put(astdb_family, dev, state); ast_devstate_changed(state_val, "Custom:%s", dev); return CLI_SUCCESS; }
static char* handle_cli_devstate_list | ( | struct ast_cli_entry * | e, |
int | cmd, | ||
struct ast_cli_args * | a | ||
) | [static] |
Definition at line 191 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.
{ struct ast_db_entry *db_entry, *db_tree; switch (cmd) { case CLI_INIT: e->command = "devstate list"; e->usage = "Usage: devstate list\n" " List all custom device states that have been set by using\n" " the DEVICE_STATE dialplan function.\n"; return NULL; case CLI_GENERATE: return NULL; } if (a->argc != e->args) return CLI_SHOWUSAGE; ast_cli(a->fd, "\n" "---------------------------------------------------------------------\n" "--- Custom Device States --------------------------------------------\n" "---------------------------------------------------------------------\n" "---\n"); db_entry = db_tree = ast_db_gettree(astdb_family, NULL); for (; db_entry; db_entry = db_entry->next) { const char *dev_name = strrchr(db_entry->key, '/') + 1; if (dev_name <= (const char *) 1) continue; ast_cli(a->fd, "--- Name: 'Custom:%s' State: '%s'\n" "---\n", dev_name, db_entry->data); } ast_db_freetree(db_tree); db_tree = NULL; ast_cli(a->fd, "---------------------------------------------------------------------\n" "---------------------------------------------------------------------\n" "\n"); return CLI_SUCCESS; }
static int hint_read | ( | struct ast_channel * | chan, |
const char * | cmd, | ||
char * | data, | ||
char * | buf, | ||
size_t | len | ||
) | [static] |
Definition at line 144 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, context, exten, HINT_OPT_NAME, hint_options, LOG_WARNING, and strsep().
{ char *exten, *context; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(exten); AST_APP_ARG(options); ); struct ast_flags opts = { 0, }; int res; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "The HINT function requires an extension\n"); return -1; } AST_STANDARD_APP_ARGS(args, data); if (ast_strlen_zero(args.exten)) { ast_log(LOG_WARNING, "The HINT function requires an extension\n"); return -1; } context = exten = args.exten; strsep(&context, "@"); if (ast_strlen_zero(context)) context = "default"; if (!ast_strlen_zero(args.options)) ast_app_parse_options(hint_options, &opts, NULL, args.options); if (ast_test_flag(&opts, HINT_OPT_NAME)) res = ast_get_hint(NULL, 0, buf, len, chan, context, exten); else res = ast_get_hint(buf, len, NULL, 0, chan, context, exten); return !res; /* ast_get_hint returns non-zero on success */ }
static int load_module | ( | void | ) | [static] |
Definition at line 326 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(), custom_devstate_callback(), ast_db_entry::data, ast_db_entry::key, and ast_db_entry::next.
{ int res = 0; struct ast_db_entry *db_entry, *db_tree; /* Populate the device state cache on the system with all of the currently * known custom device states. */ db_entry = db_tree = ast_db_gettree(astdb_family, NULL); for (; db_entry; db_entry = db_entry->next) { const char *dev_name = strrchr(db_entry->key, '/') + 1; if (dev_name <= (const char *) 1) continue; ast_devstate_changed(ast_devstate_val(db_entry->data), "Custom:%s\n", dev_name); } ast_db_freetree(db_tree); db_tree = NULL; res |= ast_custom_function_register(&devstate_function); res |= ast_custom_function_register(&hint_function); res |= ast_devstate_prov_add("Custom", custom_devstate_callback); res |= ast_cli_register_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate)); return res; }
static int unload_module | ( | void | ) | [static] |
Definition at line 314 of file func_devstate.c.
References ARRAY_LEN, ast_cli_unregister_multiple(), ast_custom_function_unregister(), and ast_devstate_prov_del().
{ int res = 0; res |= ast_custom_function_unregister(&devstate_function); res |= ast_custom_function_unregister(&hint_function); res |= ast_devstate_prov_del("Custom"); res |= ast_cli_unregister_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate)); return res; }
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Gets or sets a device state in the dialplan" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 352 of file func_devstate.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 352 of file func_devstate.c.
const char astdb_family[] = "CustomDevstate" [static] |
Definition at line 98 of file func_devstate.c.
struct ast_cli_entry cli_funcdevstate[] [static] |
{ AST_CLI_DEFINE(handle_cli_devstate_list, "List currently known custom device states"), AST_CLI_DEFINE(handle_cli_devstate_change, "Change a custom device state"), }
Definition at line 298 of file func_devstate.c.
struct ast_custom_function devstate_function [static] |
{ .name = "DEVICE_STATE", .read = devstate_read, .write = devstate_write, }
Definition at line 303 of file func_devstate.c.
struct ast_custom_function hint_function [static] |
{ .name = "HINT", .read = hint_read, }
Definition at line 309 of file func_devstate.c.
struct ast_app_option hint_options[128] = { [ 'n' ] = { .flag = HINT_OPT_NAME }, } [static] |
Definition at line 142 of file func_devstate.c.
Referenced by hint_read().