Sat Mar 10 01:55:25 2012

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 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_LOAD_ORDER , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEVSTATE_PROVIDER, }
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_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 140 of file func_devstate.c.

00140      {
00141    HINT_OPT_NAME = (1 << 0),
00142 };


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 360 of file func_devstate.c.

static void __unreg_module ( void   )  [static]

Definition at line 360 of file func_devstate.c.

static enum ast_device_state custom_devstate_callback ( const char *  data  )  [static]

Definition at line 186 of file func_devstate.c.

References ast_db_get(), and ast_devstate_val().

Referenced by load_module().

00187 {
00188    char buf[256] = "";
00189 
00190    ast_db_get(astdb_family, data, buf, sizeof(buf));
00191 
00192    return ast_devstate_val(buf);
00193 }

static int devstate_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 104 of file func_devstate.c.

References ast_copy_string(), ast_device_state(), and ast_devstate_str().

00105 {
00106    ast_copy_string(buf, ast_devstate_str(ast_device_state(data)), len);
00107 
00108    return 0;
00109 }

static int devstate_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
) [static]

Definition at line 111 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.

00112 {
00113    size_t len = strlen("Custom:");
00114    enum ast_device_state state_val;
00115 
00116    if (strncasecmp(data, "Custom:", len)) {
00117       ast_log(LOG_WARNING, "The DEVICE_STATE function can only be used to set 'Custom:' device state!\n");
00118       return -1;
00119    }
00120    data += len;
00121    if (ast_strlen_zero(data)) {
00122       ast_log(LOG_WARNING, "DEVICE_STATE function called with no custom device name!\n");
00123       return -1;
00124    }
00125 
00126    state_val = ast_devstate_val(value);
00127 
00128    if (state_val == AST_DEVICE_UNKNOWN) {
00129       ast_log(LOG_ERROR, "DEVICE_STATE function given invalid state value '%s'\n", value);
00130       return -1;
00131    }
00132 
00133    ast_db_put(astdb_family, data, value);
00134 
00135    ast_devstate_changed(state_val, "Custom:%s", data);
00136 
00137    return 0;
00138 }

static char* handle_cli_devstate_change ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 239 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.

00240 {
00241     size_t len;
00242    const char *dev, *state;
00243    enum ast_device_state state_val;
00244 
00245    switch (cmd) {
00246    case CLI_INIT:
00247       e->command = "devstate change";
00248       e->usage =
00249          "Usage: devstate change <device> <state>\n"
00250          "       Change a custom device to a new state.\n"
00251          "       The possible values for the state are:\n"
00252          "UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING\n"
00253          "RINGINUSE | ONHOLD\n",
00254          "\n"
00255          "Examples:\n"
00256          "       devstate change Custom:mystate1 INUSE\n"
00257          "       devstate change Custom:mystate1 NOT_INUSE\n"
00258          "       \n";
00259       return NULL;
00260    case CLI_GENERATE:
00261    {
00262       static const char * const cmds[] = { "UNKNOWN", "NOT_INUSE", "INUSE", "BUSY",
00263                        "UNAVAILABLE", "RINGING", "RINGINUSE", "ONHOLD", NULL };
00264 
00265       if (a->pos == e->args + 1)
00266          return ast_cli_complete(a->word, cmds, a->n);
00267 
00268       return NULL;
00269    }
00270    }
00271 
00272    if (a->argc != e->args + 2)
00273       return CLI_SHOWUSAGE;
00274 
00275    len = strlen("Custom:");
00276    dev = a->argv[e->args];
00277    state = a->argv[e->args + 1];
00278 
00279    if (strncasecmp(dev, "Custom:", len)) {
00280       ast_cli(a->fd, "The devstate command can only be used to set 'Custom:' device state!\n");
00281       return CLI_FAILURE;
00282    }
00283 
00284    dev += len;
00285    if (ast_strlen_zero(dev))
00286       return CLI_SHOWUSAGE;
00287 
00288    state_val = ast_devstate_val(state);
00289 
00290    if (state_val == AST_DEVICE_UNKNOWN)
00291       return CLI_SHOWUSAGE;
00292 
00293    ast_cli(a->fd, "Changing %s to %s\n", dev, state);
00294 
00295    ast_db_put(astdb_family, dev, state);
00296 
00297    ast_devstate_changed(state_val, "Custom:%s", dev);
00298 
00299    return CLI_SUCCESS;
00300 }

static char* handle_cli_devstate_list ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 195 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.

00196 {
00197    struct ast_db_entry *db_entry, *db_tree;
00198 
00199    switch (cmd) {
00200    case CLI_INIT:
00201       e->command = "devstate list";
00202       e->usage =
00203          "Usage: devstate list\n"
00204          "       List all custom device states that have been set by using\n"
00205          "       the DEVICE_STATE dialplan function.\n";
00206       return NULL;
00207    case CLI_GENERATE:
00208       return NULL;
00209    }
00210 
00211    if (a->argc != e->args)
00212       return CLI_SHOWUSAGE;
00213 
00214    ast_cli(a->fd, "\n"
00215            "---------------------------------------------------------------------\n"
00216            "--- Custom Device States --------------------------------------------\n"
00217            "---------------------------------------------------------------------\n"
00218            "---\n");
00219 
00220    db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
00221    for (; db_entry; db_entry = db_entry->next) {
00222       const char *dev_name = strrchr(db_entry->key, '/') + 1;
00223       if (dev_name <= (const char *) 1)
00224          continue;
00225       ast_cli(a->fd, "--- Name: 'Custom:%s'  State: '%s'\n"
00226                      "---\n", dev_name, db_entry->data);
00227    }
00228    ast_db_freetree(db_tree);
00229    db_tree = NULL;
00230 
00231    ast_cli(a->fd,
00232            "---------------------------------------------------------------------\n"
00233            "---------------------------------------------------------------------\n"
00234            "\n");
00235 
00236    return CLI_SUCCESS;
00237 }

static int hint_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
) [static]

Definition at line 148 of file func_devstate.c.

References args, 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().

00149 {
00150    char *exten, *context;
00151    AST_DECLARE_APP_ARGS(args,
00152       AST_APP_ARG(exten);
00153       AST_APP_ARG(options);
00154    );
00155    struct ast_flags opts = { 0, };
00156    int res;
00157 
00158    if (ast_strlen_zero(data)) {
00159       ast_log(LOG_WARNING, "The HINT function requires an extension\n");
00160       return -1;
00161    }
00162 
00163    AST_STANDARD_APP_ARGS(args, data);
00164 
00165    if (ast_strlen_zero(args.exten)) {
00166       ast_log(LOG_WARNING, "The HINT function requires an extension\n");
00167       return -1;
00168    }
00169 
00170    context = exten = args.exten;
00171    strsep(&context, "@");
00172    if (ast_strlen_zero(context))
00173       context = "default";
00174 
00175    if (!ast_strlen_zero(args.options))
00176       ast_app_parse_options(hint_options, &opts, NULL, args.options);
00177 
00178    if (ast_test_flag(&opts, HINT_OPT_NAME))
00179       res = ast_get_hint(NULL, 0, buf, len, chan, context, exten);
00180    else
00181       res = ast_get_hint(buf, len, NULL, 0, chan, context, exten);
00182 
00183    return !res; /* ast_get_hint returns non-zero on success */
00184 }

static int load_module ( void   )  [static]

Definition at line 330 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.

00331 {
00332    int res = 0;
00333    struct ast_db_entry *db_entry, *db_tree;
00334 
00335    /* Populate the device state cache on the system with all of the currently
00336     * known custom device states. */
00337    db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
00338    for (; db_entry; db_entry = db_entry->next) {
00339       const char *dev_name = strrchr(db_entry->key, '/') + 1;
00340       if (dev_name <= (const char *) 1)
00341          continue;
00342       ast_devstate_changed(ast_devstate_val(db_entry->data),
00343          "Custom:%s\n", dev_name);
00344    }
00345    ast_db_freetree(db_tree);
00346    db_tree = NULL;
00347 
00348    res |= ast_custom_function_register(&devstate_function);
00349    res |= ast_custom_function_register(&hint_function);
00350    res |= ast_devstate_prov_add("Custom", custom_devstate_callback);
00351    res |= ast_cli_register_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate));
00352 
00353    return res;
00354 }

static int unload_module ( void   )  [static]

Definition at line 318 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.

00319 {
00320    int res = 0;
00321 
00322    res |= ast_custom_function_unregister(&devstate_function);
00323    res |= ast_custom_function_unregister(&hint_function);
00324    res |= ast_devstate_prov_del("Custom");
00325    res |= ast_cli_unregister_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate));
00326 
00327    return res;
00328 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEVSTATE_PROVIDER, } [static]

Definition at line 360 of file func_devstate.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 360 of file func_devstate.c.

const char astdb_family[] = "CustomDevstate" [static]

Definition at line 102 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__ },
   { .handler =  handle_cli_devstate_change , .summary =  "Change a custom device state" ,__VA_ARGS__ },
}

Definition at line 302 of file func_devstate.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function devstate_function [static]

Initial value:

 {
   .name = "DEVICE_STATE",
   .read = devstate_read,
   .write = devstate_write,
}

Definition at line 307 of file func_devstate.c.

Referenced by load_module(), and unload_module().

struct ast_custom_function hint_function [static]

Initial value:

 {
   .name = "HINT",
   .read = hint_read,
}

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

Referenced by hint_read().


Generated on Sat Mar 10 01:55:25 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7