Fri Jun 19 12:10:36 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 = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, }
static 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>
Todo:
Delete the entry from AstDB when set to nothing like Set(DEVICE_STATE(Custom:lamp1)=)
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 85 of file func_devstate.c.

00085      {
00086    HINT_OPT_NAME = (1 << 0),
00087 };


Function Documentation

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          "UNAVAILALBE", "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 }


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 = "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]

Definition at line 297 of file func_devstate.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function hint_function [static]

Definition at line 322 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 91 of file func_devstate.c.

Referenced by hint_read().


Generated on Fri Jun 19 12:10:36 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7