Skeleton application. More...
#include "asterisk.h"#include <math.h>#include "asterisk/file.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/module.h"#include "asterisk/lock.h"#include "asterisk/app.h"#include "asterisk/config.h"#include "asterisk/config_options.h"#include "asterisk/say.h"#include "asterisk/astobj2.h"#include "asterisk/acl.h"#include "asterisk/netsock2.h"#include "asterisk/strings.h"#include "asterisk/cli.h"
Go to the source code of this file.
Data Structures | |
| struct | skel_config |
| A container that holds all config-related information. More... | |
| struct | skel_current_game |
| Information about a currently running set of games. More... | |
| struct | skel_global_config |
| A structure to hold global configuration-related options. More... | |
| struct | skel_level |
| Object to hold level config information. More... | |
| struct | skel_level_state |
| A structure to maintain level state across reloads. More... | |
Defines | |
| #define | LEVEL_BUCKETS 1 |
| #define | SKEL_FORMAT "%-15.15s %-15.15s %-15.15s\n" |
| #define | SKEL_FORMAT "%-15.15s %-11.11s %-12.12s %-8.8s %-8.8s %-12.12s\n" |
| #define | SKEL_FORMAT1 "%-15.15s %-15u %-15u\n" |
| #define | SKEL_FORMAT1 "%-15.15s %-11u %-12u %-8u %-8u %-8f\n" |
Enumerations | |
| enum | option_args { OPTION_ARG_NUMGAMES, OPTION_ARG_ARRAY_SIZE } |
| enum | option_flags { OPTION_CHEAT = (1 << 0), OPTION_NUMGAMES = (1 << 1), OPTION_WAIT = (1 << 0), OPTION_PATTERNS_DISABLED = (1 << 0) } |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static | AO2_GLOBAL_OBJ_STATIC (globals) |
| A global object container that will contain the skel_config that gets swapped out on reloads. | |
| static int | app_exec (struct ast_channel *chan, const char *data) |
| CONFIG_INFO_STANDARD (cfg_info, globals, skel_config_alloc,.files=ACO_FILES(&app_skel_conf),) | |
| Register information about the configs being processed by this module. | |
| static int | custom_bitfield_handler (const struct aco_option *opt, struct ast_variable *var, void *obj) |
| A custom bitfield handler. | |
| static char * | handle_skel_show_config (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | handle_skel_show_games (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | handle_skel_show_levels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static int | load_module (void) |
| static void | play_files_helper (struct ast_channel *chan, const char *prompts) |
| static int | reload_module (void) |
| static void * | skel_config_alloc (void) |
| Allocate a skel_config to hold a snapshot of the complete results of parsing a config. | |
| static void | skel_config_destructor (void *obj) |
| static void * | skel_find_or_create_state (const char *category) |
| Look up an existing state object, or create a new one. | |
| static struct skel_current_game * | skel_game_alloc (struct skel_level *level) |
| static void | skel_game_destructor (void *obj) |
| static void | skel_global_config_destructor (void *obj) |
| static void * | skel_level_alloc (const char *cat) |
| Allocate a skel_level based on a category in a configuration file. | |
| static int | skel_level_cmp (void *obj, void *arg, int flags) |
| static void | skel_level_destructor (void *obj) |
| static void * | skel_level_find (struct ao2_container *tmp_container, const char *category) |
| Find a skel level in the specified container. | |
| static int | skel_level_hash (const void *obj, const int flags) |
| static struct skel_level * | skel_state_alloc (const char *name) |
| static void | skel_state_destructor (void *obj) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Skeleton (sample) Application" , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_DEFAULT, } |
| static char * | app = "SkelGuessNumber" |
| static struct ast_app_option | app_opts [128] = { [ 'c' ] = { .flag = OPTION_CHEAT }, [ 'n' ] = { .flag = OPTION_NUMGAMES , .arg_index = OPTION_ARG_NUMGAMES + 1 },} |
| struct aco_file | app_skel_conf |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ao2_container * | games |
| The container of active games. | |
| static struct aco_type | global_option |
| An aco_type structure to link the "general" category to the skel_global_config type. | |
| struct aco_type * | global_options [] = ACO_TYPES(&global_option) |
| static struct aco_type | level_option |
| An aco_type structure to link the everything but the "general" and "sounds" categories to the skel_level type. | |
| struct aco_type * | level_options [] = ACO_TYPES(&level_option) |
| static struct ast_cli_entry | skel_cli [] |
| static struct aco_type | sound_option |
| An aco_type structure to link the "sounds" category to the skel_global_config type. | |
| struct aco_type * | sound_options [] = ACO_TYPES(&sound_option) |
Skeleton application.
This is a skeleton for development of an Asterisk application
Definition in file app_skel.c.
| #define LEVEL_BUCKETS 1 |
Definition at line 149 of file app_skel.c.
Referenced by skel_config_alloc().
| #define SKEL_FORMAT "%-15.15s %-15.15s %-15.15s\n" |
Referenced by handle_skel_show_games(), and handle_skel_show_levels().
| #define SKEL_FORMAT "%-15.15s %-11.11s %-12.12s %-8.8s %-8.8s %-12.12s\n" |
| #define SKEL_FORMAT1 "%-15.15s %-15u %-15u\n" |
Referenced by handle_skel_show_games(), and handle_skel_show_levels().
| #define SKEL_FORMAT1 "%-15.15s %-11u %-12u %-8u %-8u %-8f\n" |
| enum option_args |
Definition at line 89 of file app_skel.c.
{
OPTION_ARG_NUMGAMES,
/* This *must* be the last value in this enum! */
OPTION_ARG_ARRAY_SIZE,
};
| enum option_flags |
Definition at line 84 of file app_skel.c.
{
OPTION_CHEAT = (1 << 0),
OPTION_NUMGAMES = (1 << 1),
};
| static void __reg_module | ( | void | ) | [static] |
Definition at line 697 of file app_skel.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 697 of file app_skel.c.
| static AO2_GLOBAL_OBJ_STATIC | ( | globals | ) | [static] |
A global object container that will contain the skel_config that gets swapped out on reloads.
| static int app_exec | ( | struct ast_channel * | chan, |
| const char * | data | ||
| ) | [static] |
Definition at line 318 of file app_skel.c.
References ao2_cleanup, ao2_find, ao2_global_obj_ref, ao2_link, ao2_lock, ao2_unlink, ao2_unlock, app_opts, args, AST_APP_ARG, ast_app_parse_options(), ast_channel_language(), ast_debug, AST_DECLARE_APP_ARGS, ast_log(), ast_parse_arg(), ast_random(), ast_readstring(), ast_say_number(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), ast_test_flag, globals, LOG_ERROR, LOG_WARNING, OBJ_KEY, OPTION_ARG_ARRAY_SIZE, OPTION_ARG_NUMGAMES, OPTION_CHEAT, OPTION_NUMGAMES, parse(), PARSE_IN_RANGE, PARSE_INT32, PARSE_UINT32, play_files_helper(), and skel_game_alloc().
Referenced by load_module().
{
int win = 0;
uint32_t guesses;
RAII_VAR(struct skel_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
RAII_VAR(struct skel_level *, level, NULL, ao2_cleanup);
RAII_VAR(struct skel_current_game *, game, NULL, ao2_cleanup);
char *parse, *opts[OPTION_ARG_ARRAY_SIZE];
struct ast_flags flags;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(level);
AST_APP_ARG(options);
);
if (!cfg) {
ast_log(LOG_ERROR, "Couldn't access configuratino data!\n");
return -1;
}
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "%s requires an argument (level[,options])\n", app);
return -1;
}
/* We need to make a copy of the input string if we are going to modify it! */
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
if (args.argc == 2) {
ast_app_parse_options(app_opts, &flags, opts, args.options);
}
if (ast_strlen_zero(args.level)) {
ast_log(LOG_ERROR, "%s requires a level argument\n", app);
return -1;
}
if (!(level = ao2_find(cfg->levels, args.level, OBJ_KEY))) {
ast_log(LOG_ERROR, "Unknown level: %s\n", args.level);
return -1;
}
if (!(game = skel_game_alloc(level))) {
return -1;
}
ao2_link(games, game);
/* Use app-specified values, or the options specified in [general] if they aren't passed to the app */
if (!ast_test_flag(&flags, OPTION_NUMGAMES) ||
ast_strlen_zero(opts[OPTION_ARG_NUMGAMES]) ||
ast_parse_arg(opts[OPTION_ARG_NUMGAMES], PARSE_UINT32, &game->total_games)) {
game->total_games = cfg->global->num_games;
}
game->games_left = game->total_games;
game->cheat = ast_test_flag(&flags, OPTION_CHEAT) || cfg->global->cheat;
for (game->games_left = game->total_games; game->games_left; game->games_left--) {
uint32_t num = ast_random() % level->max_num; /* random number between 0 and level->max_num */
ast_debug(1, "They should totally should guess %u\n", num);
/* Play the prompt */
play_files_helper(chan, cfg->global->prompt);
ast_say_number(chan, level->max_num, "", ast_channel_language(chan), "");
for (guesses = 0; guesses < level->max_guesses; guesses++) {
size_t buflen = log10(level->max_num) + 1;
char buf[buflen];
int guess;
buf[buflen] = '\0';
/* Read the number pressed */
ast_readstring(chan, buf, buflen - 1, 2000, 10000, "");
if (ast_parse_arg(buf, PARSE_INT32 | PARSE_IN_RANGE, &guess, 0, level->max_num)) {
if (guesses < level->max_guesses - 1) {
play_files_helper(chan, cfg->global->wrong);
}
continue;
}
/* Inform whether the guess was right, low, or high */
if (guess == num && !game->cheat) {
/* win */
win = 1;
play_files_helper(chan, cfg->global->right);
guesses++;
break;
} else if (guess < num) {
play_files_helper(chan, cfg->global->low);
} else {
play_files_helper(chan, cfg->global->high);
}
if (guesses < level->max_guesses - 1) {
play_files_helper(chan, cfg->global->wrong);
}
}
/* Process game stats */
ao2_lock(level->state);
if (win) {
++level->state->wins;
level->state->avg_guesses = ((level->state->wins - 1) * level->state->avg_guesses + guesses) / level->state->wins;
} else {
/* lose */
level->state->losses++;
play_files_helper(chan, cfg->global->lose);
}
ao2_unlock(level->state);
}
ao2_unlink(games, game);
return 0;
}
| CONFIG_INFO_STANDARD | ( | cfg_info | , |
| globals | , | ||
| skel_config_alloc | , | ||
| . | files = ACO_FILES(&app_skel_conf) |
||
| ) |
Register information about the configs being processed by this module.
| static int custom_bitfield_handler | ( | const struct aco_option * | opt, |
| struct ast_variable * | var, | ||
| void * | obj | ||
| ) | [static] |
A custom bitfield handler.
Definition at line 295 of file app_skel.c.
References ast_true(), skel_global_config::cheat, ast_variable::name, and ast_variable::value.
Referenced by load_module().
{
struct skel_global_config *global = obj;
if (!strcasecmp(var->name, "cheat")) {
global->cheat = ast_true(var->value);
} else {
return -1;
}
return 0;
}
| static char* handle_skel_show_config | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 532 of file app_skel.c.
References ao2_cleanup, ao2_global_obj_ref, ast_cli(), AST_CLI_YESNO, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, globals, and ast_cli_entry::usage.
{
RAII_VAR(struct skel_config *, cfg, NULL, ao2_cleanup);
switch(cmd) {
case CLI_INIT:
e->command = "skel show config";
e->usage =
"Usage: skel show config\n"
" List app_skel global config\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (!(cfg = ao2_global_obj_ref(globals)) || !cfg->global) {
return NULL;
}
ast_cli(a->fd, "games per call: %u\n", cfg->global->num_games);
ast_cli(a->fd, "computer cheats: %s\n", AST_CLI_YESNO(cfg->global->cheat));
ast_cli(a->fd, "\n");
ast_cli(a->fd, "Sounds\n");
ast_cli(a->fd, " prompt: %s\n", cfg->global->prompt);
ast_cli(a->fd, " wrong guess: %s\n", cfg->global->wrong);
ast_cli(a->fd, " right guess: %s\n", cfg->global->right);
return CLI_SUCCESS;
}
| static char* handle_skel_show_games | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 562 of file app_skel.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, skel_current_game::games_left, skel_current_game::level_info, skel_level::name, SKEL_FORMAT, SKEL_FORMAT1, skel_current_game::total_games, and ast_cli_entry::usage.
{
struct ao2_iterator iter;
struct skel_current_game *game;
switch(cmd) {
case CLI_INIT:
e->command = "skel show games";
e->usage =
"Usage: skel show games\n"
" List app_skel active games\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
#define SKEL_FORMAT "%-15.15s %-15.15s %-15.15s\n"
#define SKEL_FORMAT1 "%-15.15s %-15u %-15u\n"
ast_cli(a->fd, SKEL_FORMAT, "Level", "Total Games", "Games Left");
iter = ao2_iterator_init(games, 0);
while ((game = ao2_iterator_next(&iter))) {
ast_cli(a->fd, SKEL_FORMAT1, game->level_info->name, game->total_games, game->games_left);
ao2_ref(game, -1);
}
ao2_iterator_destroy(&iter);
#undef SKEL_FORMAT
#undef SKEL_FORMAT1
return CLI_SUCCESS;
}
| static char* handle_skel_show_levels | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 592 of file app_skel.c.
References ao2_cleanup, ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_cli(), skel_level_state::avg_guesses, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, globals, skel_level_state::losses, skel_level::max_guesses, skel_level::max_num, skel_level::name, SKEL_FORMAT, SKEL_FORMAT1, skel_level::state, ast_cli_entry::usage, and skel_level_state::wins.
{
RAII_VAR(struct skel_config *, cfg, NULL, ao2_cleanup);
struct ao2_iterator iter;
struct skel_level *level;
switch(cmd) {
case CLI_INIT:
e->command = "skel show levels";
e->usage =
"Usage: skel show levels\n"
" List the app_skel levels\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (!(cfg = ao2_global_obj_ref(globals)) || !cfg->levels) {
return NULL;
}
#define SKEL_FORMAT "%-15.15s %-11.11s %-12.12s %-8.8s %-8.8s %-12.12s\n"
#define SKEL_FORMAT1 "%-15.15s %-11u %-12u %-8u %-8u %-8f\n"
ast_cli(a->fd, SKEL_FORMAT, "Name", "Max number", "Max Guesses", "Wins", "Losses", "Avg Guesses");
iter = ao2_iterator_init(cfg->levels, 0);
while ((level = ao2_iterator_next(&iter))) {
ast_cli(a->fd, SKEL_FORMAT1, level->name, level->max_num, level->max_guesses, level->state->wins, level->state->losses, level->state->avg_guesses);
ao2_ref(level, -1);
}
ao2_iterator_destroy(&iter);
#undef SKEL_FORMAT
#undef SKEL_FORMAT1
return CLI_SUCCESS;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 651 of file app_skel.c.
References ACO_EXACT, aco_info_destroy(), aco_info_init(), aco_option_register, aco_option_register_custom, aco_process_config(), ACO_PROCESS_ERROR, ao2_cleanup, ao2_container_alloc, app_exec(), ARRAY_LEN, ast_cli_register_multiple(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, custom_bitfield_handler(), FLDSET, OPT_STRINGFIELD_T, OPT_UINT_T, prompt, and STRFLDSET.
{
if (aco_info_init(&cfg_info)) {
goto error;
}
if (!(games = ao2_container_alloc(1, NULL, NULL))) {
goto error;
}
/* Global options */
aco_option_register(&cfg_info, "games", ACO_EXACT, global_options, "3", OPT_UINT_T, 0, FLDSET(struct skel_global_config, num_games));
aco_option_register_custom(&cfg_info, "cheat", ACO_EXACT, global_options, "no", custom_bitfield_handler, 0);
/* Sound options */
aco_option_register(&cfg_info, "prompt", ACO_EXACT, sound_options, "please-enter-your&number&queue-less-than", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, prompt));
aco_option_register(&cfg_info, "wrong_guess", ACO_EXACT, sound_options, "vm-pls-try-again", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, wrong));
aco_option_register(&cfg_info, "right_guess", ACO_EXACT, sound_options, "auth-thankyou", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, right));
aco_option_register(&cfg_info, "too_high", ACO_EXACT, sound_options, "high", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, high));
aco_option_register(&cfg_info, "too_low", ACO_EXACT, sound_options, "low", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, low));
aco_option_register(&cfg_info, "lose", ACO_EXACT, sound_options, "vm-goodbye", OPT_STRINGFIELD_T, 0, STRFLDSET(struct skel_global_config, lose));
/* Level options */
aco_option_register(&cfg_info, "max_number", ACO_EXACT, level_options, NULL, OPT_UINT_T, 0, FLDSET(struct skel_level, max_num));
aco_option_register(&cfg_info, "max_guesses", ACO_EXACT, level_options, NULL, OPT_UINT_T, 1, FLDSET(struct skel_level, max_guesses));
if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
goto error;
}
ast_cli_register_multiple(skel_cli, ARRAY_LEN(skel_cli));
if (ast_register_application_xml(app, app_exec)) {
goto error;
}
return AST_MODULE_LOAD_SUCCESS;
error:
aco_info_destroy(&cfg_info);
ao2_cleanup(games);
return AST_MODULE_LOAD_DECLINE;
}
| static void play_files_helper | ( | struct ast_channel * | chan, |
| const char * | prompts | ||
| ) | [static] |
Definition at line 308 of file app_skel.c.
References ast_stopstream(), ast_stream_and_wait(), and prompt.
Referenced by app_exec().
{
char *prompt, *rest = ast_strdupa(prompts);
ast_stopstream(chan);
while ((prompt = strsep(&rest, "&")) && !ast_stream_and_wait(chan, prompt, "")) {
ast_stopstream(chan);
}
}
| static int reload_module | ( | void | ) | [static] |
Definition at line 634 of file app_skel.c.
References aco_process_config(), ACO_PROCESS_ERROR, and AST_MODULE_LOAD_DECLINE.
{
if (aco_process_config(&cfg_info, 1) == ACO_PROCESS_ERROR) {
return AST_MODULE_LOAD_DECLINE;
}
return 0;
}
| static void * skel_config_alloc | ( | void | ) | [static] |
Allocate a skel_config to hold a snapshot of the complete results of parsing a config.
Definition at line 505 of file app_skel.c.
References ao2_alloc, ao2_container_alloc, ao2_ref, ast_string_field_init, skel_config::global, LEVEL_BUCKETS, skel_config::levels, skel_config_destructor(), skel_global_config_destructor(), skel_level_cmp(), and skel_level_hash().
{
struct skel_config *cfg;
if (!(cfg = ao2_alloc(sizeof(*cfg), skel_config_destructor))) {
return NULL;
}
/* Allocate/initialize memory */
if (!(cfg->global = ao2_alloc(sizeof(*cfg->global), skel_global_config_destructor))) {
goto error;
}
if (ast_string_field_init(cfg->global, 128)) {
goto error;
}
if (!(cfg->levels = ao2_container_alloc(LEVEL_BUCKETS, skel_level_hash, skel_level_cmp))) {
goto error;
}
return cfg;
error:
ao2_ref(cfg, -1);
return NULL;
}
| static void skel_config_destructor | ( | void * | obj | ) | [static] |
Definition at line 498 of file app_skel.c.
References ao2_cleanup, skel_config::global, and skel_config::levels.
Referenced by skel_config_alloc().
{
struct skel_config *cfg = obj;
ao2_cleanup(cfg->global);
ao2_cleanup(cfg->levels);
}
| static void* skel_find_or_create_state | ( | const char * | category | ) | [static] |
Look up an existing state object, or create a new one.
Definition at line 460 of file app_skel.c.
References ao2_cleanup, ao2_find, ao2_global_obj_ref, ao2_ref, globals, OBJ_KEY, and skel_state_alloc().
Referenced by skel_level_alloc().
{
RAII_VAR(struct skel_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
RAII_VAR(struct skel_level *, level, NULL, ao2_cleanup);
if (!cfg || !cfg->levels || !(level = ao2_find(cfg->levels, category, OBJ_KEY))) {
return skel_state_alloc(category);
}
ao2_ref(level->state, +1);
return level->state;
}
| static struct skel_current_game* skel_game_alloc | ( | struct skel_level * | level | ) | [static, read] |
Definition at line 253 of file app_skel.c.
References ao2_alloc, ao2_ref, skel_current_game::level_info, and skel_game_destructor().
Referenced by app_exec().
{
struct skel_current_game *game;
if (!(game = ao2_alloc(sizeof(struct skel_current_game), skel_game_destructor))) {
return NULL;
}
ao2_ref(level, +1);
game->level_info = level;
return game;
}
| static void skel_game_destructor | ( | void * | obj | ) | [static] |
Definition at line 242 of file app_skel.c.
References ao2_cleanup, and skel_current_game::level_info.
Referenced by skel_game_alloc().
{
struct skel_current_game *game = obj;
ao2_cleanup(game->level_info);
}
| static void skel_global_config_destructor | ( | void * | obj | ) | [static] |
Definition at line 236 of file app_skel.c.
References ast_string_field_free_memory.
Referenced by skel_config_alloc().
{
struct skel_global_config *global = obj;
ast_string_field_free_memory(global);
}
| static void * skel_level_alloc | ( | const char * | cat | ) | [static] |
Allocate a skel_level based on a category in a configuration file.
| cat | The category to base the level on |
Definition at line 471 of file app_skel.c.
References ao2_alloc, ao2_ref, ast_string_field_init, ast_string_field_set, name, skel_find_or_create_state(), skel_level_destructor(), and skel_level::state.
{
struct skel_level *level;
if (!(level = ao2_alloc(sizeof(*level), skel_level_destructor))) {
return NULL;
}
if (ast_string_field_init(level, 128)) {
ao2_ref(level, -1);
return NULL;
}
/* Since the level has state information that needs to persist between reloads,
* it is important to handle that here in the level's allocation function.
* If not separated out into its own object, the data would be destroyed on
* reload. */
if (!(level->state = skel_find_or_create_state(cat))) {
ao2_ref(level, -1);
return NULL;
}
ast_string_field_set(level, name, cat);
return level;
}
| static int skel_level_cmp | ( | void * | obj, |
| void * | arg, | ||
| int | flags | ||
| ) | [static] |
Definition at line 278 of file app_skel.c.
References CMP_MATCH, CMP_STOP, match(), skel_level::name, and OBJ_KEY.
Referenced by skel_config_alloc().
| static void skel_level_destructor | ( | void * | obj | ) | [static] |
Definition at line 264 of file app_skel.c.
References ao2_cleanup, ast_string_field_free_memory, and skel_level::state.
Referenced by skel_level_alloc().
{
struct skel_level *level = obj;
ast_string_field_free_memory(level);
ao2_cleanup(level->state);
}
| static void * skel_level_find | ( | struct ao2_container * | tmp_container, |
| const char * | category | ||
| ) | [static] |
Find a skel level in the specified container.
| container | A non-active container to search for a level |
| category | The category associated with the level to check for |
| non-NULL | The level from the container |
| NULL | The level does not exist in the container |
Definition at line 447 of file app_skel.c.
| static int skel_level_hash | ( | const void * | obj, |
| const int | flags | ||
| ) | [static] |
Definition at line 271 of file app_skel.c.
References ast_str_case_hash(), name, skel_level::name, and OBJ_KEY.
Referenced by skel_config_alloc().
{
const struct skel_level *level = obj;
const char *name = (flags & OBJ_KEY) ? obj : level->name;
return ast_str_case_hash(name);
}
| static struct skel_level* skel_state_alloc | ( | const char * | name | ) | [static, read] |
Definition at line 436 of file app_skel.c.
References ao2_alloc, and skel_state_destructor().
Referenced by skel_find_or_create_state().
{
struct skel_level *level;
if (!(level = ao2_alloc(sizeof(*level), skel_state_destructor))) {
return NULL;
}
return level;
}
| static void skel_state_destructor | ( | void * | obj | ) | [static] |
| static int unload_module | ( | void | ) | [static] |
Definition at line 643 of file app_skel.c.
References aco_info_destroy(), ao2_global_obj_release, ARRAY_LEN, ast_cli_unregister_multiple(), ast_unregister_application(), and globals.
{
ast_cli_unregister_multiple(skel_cli, ARRAY_LEN(skel_cli));
aco_info_destroy(&cfg_info);
ao2_global_obj_release(globals);
return ast_unregister_application(app);
}
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Skeleton (sample) Application" , .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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 697 of file app_skel.c.
char* app = "SkelGuessNumber" [static] |
Definition at line 82 of file app_skel.c.
struct ast_app_option app_opts[128] = { [ 'c' ] = { .flag = OPTION_CHEAT }, [ 'n' ] = { .flag = OPTION_NUMGAMES , .arg_index = OPTION_ARG_NUMGAMES + 1 },} [static] |
Definition at line 98 of file app_skel.c.
Referenced by app_exec().
| struct aco_file app_skel_conf |
{
.filename = "app_skel.conf",
.types = ACO_TYPES(&global_option, &sound_option, &level_option),
}
Definition at line 220 of file app_skel.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 697 of file app_skel.c.
struct ao2_container* games [static] |
The container of active games.
Definition at line 229 of file app_skel.c.
struct aco_type global_option [static] |
An aco_type structure to link the "general" category to the skel_global_config type.
Definition at line 189 of file app_skel.c.
| struct aco_type* global_options[] = ACO_TYPES(&global_option) |
Definition at line 196 of file app_skel.c.
struct aco_type level_option [static] |
An aco_type structure to link the everything but the "general" and "sounds" categories to the skel_level type.
Definition at line 209 of file app_skel.c.
| struct aco_type* level_options[] = ACO_TYPES(&level_option) |
Definition at line 218 of file app_skel.c.
struct ast_cli_entry skel_cli[] [static] |
{
AST_CLI_DEFINE(handle_skel_show_config, "Show app_skel global config options"),
AST_CLI_DEFINE(handle_skel_show_levels, "Show app_skel levels"),
AST_CLI_DEFINE(handle_skel_show_games, "Show app_skel active games"),
}
Definition at line 628 of file app_skel.c.
struct aco_type sound_option [static] |
An aco_type structure to link the "sounds" category to the skel_global_config type.
Definition at line 199 of file app_skel.c.
| struct aco_type* sound_options[] = ACO_TYPES(&sound_option) |
Definition at line 206 of file app_skel.c.