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