Thu Jul 9 13:41:19 2009

Asterisk developer's documentation


func_devstate.c File Reference

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 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_infoast_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 }, }


Detailed Description

Manually controlled blinky lights.

Author:
Russell Bryant <russell@digium.com>
Note:
Props go out to Ahrimanes in #asterisk for requesting this at 4:30 AM when I couldn't sleep. :)

Definition in file func_devstate.c.


Enumeration Type Documentation

anonymous enum

Enumerator:
HINT_OPT_NAME 

Definition at line 83 of file func_devstate.c.

00083      {
00084    HINT_OPT_NAME = (1 << 0),
00085 };


Function Documentation

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 }


Variable Documentation

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]

Definition at line 295 of file func_devstate.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function hint_function [static]

Definition at line 320 of file func_devstate.c.

Referenced by load_module(), and unload_module().

struct ast_app_option hint_options[128] = { [ 'n' ] = { .flag = HINT_OPT_NAME }, } [static]

Definition at line 89 of file func_devstate.c.

Referenced by hint_read().


Generated on Thu Jul 9 13:41:19 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7