Wed Mar 4 19:58:18 2009

Asterisk developer's documentation


app_page.c File Reference

page() - Paging application More...

#include "asterisk.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "asterisk/options.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/chanvars.h"
#include "asterisk/utils.h"
#include "asterisk/dial.h"
#include "asterisk/devicestate.h"

Go to the source code of this file.

Enumerations

enum  {
  PAGE_DUPLEX = (1 << 0), PAGE_QUIET = (1 << 1), PAGE_RECORD = (1 << 2), PAGE_ANNOUNCE = (1 << 3),
  PAGE_NOCALLERANNOUNCE = (1 << 4)
}
enum  { OPT_ARG_ANNOUNCE = 0, OPT_ARG_ARRAY_SIZE = 1 }

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int load_module (void)
static int page_exec (struct ast_channel *chan, void *data)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Page Multiple Phones" , .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 = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, }
static const char * app_page = "Page"
static const struct ast_module_infoast_module_info = &__mod_info
static const char * page_descrip
enum { ... }  page_opt_flags
static struct ast_app_option page_opts [128] = { [ 'd' ] = { .flag = PAGE_DUPLEX }, [ 'q' ] = { .flag = PAGE_QUIET }, [ 'r' ] = { .flag = PAGE_RECORD }, [ 'A' ] = { .flag = PAGE_ANNOUNCE , .arg_index = OPT_ARG_ANNOUNCE + 1 }, [ 'n' ] = { .flag = PAGE_NOCALLERANNOUNCE },}
static const char * page_synopsis = "Pages phones"


Detailed Description

page() - Paging application

Author:
Mark Spencer <markster@digium.com>

Definition in file app_page.c.


Enumeration Type Documentation

anonymous enum

Enumerator:
PAGE_DUPLEX 
PAGE_QUIET 
PAGE_RECORD 
PAGE_ANNOUNCE 
PAGE_NOCALLERANNOUNCE 

Definition at line 73 of file app_page.c.

00073      {
00074    PAGE_DUPLEX = (1 << 0),
00075    PAGE_QUIET = (1 << 1),
00076    PAGE_RECORD = (1 << 2),
00077    PAGE_ANNOUNCE = (1 << 3),
00078    PAGE_NOCALLERANNOUNCE = (1 << 4),
00079 } page_opt_flags;

anonymous enum

Enumerator:
OPT_ARG_ANNOUNCE 
OPT_ARG_ARRAY_SIZE 

Definition at line 81 of file app_page.c.

00081      {
00082    OPT_ARG_ANNOUNCE = 0,
00083    OPT_ARG_ARRAY_SIZE = 1,
00084 };


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 242 of file app_page.c.

static void __unreg_module ( void   )  [static]

Definition at line 242 of file app_page.c.

static int load_module ( void   )  [static]

Definition at line 237 of file app_page.c.

References ast_register_application(), and page_exec().

static int page_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 95 of file app_page.c.

References app, ast_app_parse_options(), ast_calloc, AST_CHANNEL_NAME, ast_copy_string(), ast_dial_append(), ast_dial_create(), ast_dial_destroy(), ast_dial_hangup(), ast_dial_join(), AST_DIAL_OPTION_ANSWER_EXEC, ast_dial_option_global_enable(), ast_dial_run(), ast_free, ast_log(), ast_module_user_add, ast_module_user_remove, ast_random(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_test_flag, ast_waitstream(), ast_flags::flags, ast_channel::language, LOG_ERROR, LOG_WARNING, ast_channel::name, OPT_ARG_ANNOUNCE, OPT_ARG_ARRAY_SIZE, PAGE_ANNOUNCE, PAGE_DUPLEX, PAGE_NOCALLERANNOUNCE, page_opts, PAGE_QUIET, PAGE_RECORD, pbx_exec(), and pbx_findapp().

Referenced by load_module().

00096 {
00097    struct ast_module_user *u;
00098    char *options, *tech, *resource, *tmp, *tmp2;
00099    char meetmeopts[128], originator[AST_CHANNEL_NAME];
00100    struct ast_flags flags = { 0 };
00101    char *flag_args[OPT_ARG_ARRAY_SIZE];
00102    unsigned int confid = ast_random();
00103    struct ast_app *app;
00104    int res = 0, pos = 0, i = 0;
00105    struct ast_dial **dial_list;
00106    unsigned int num_dials;
00107 
00108    if (ast_strlen_zero(data)) {
00109       ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
00110       return -1;
00111    }
00112 
00113    u = ast_module_user_add(chan);
00114 
00115    if (!(app = pbx_findapp("MeetMe"))) {
00116       ast_log(LOG_WARNING, "There is no MeetMe application available!\n");
00117       ast_module_user_remove(u);
00118       return -1;
00119    };
00120 
00121    options = ast_strdupa(data);
00122 
00123    ast_copy_string(originator, chan->name, sizeof(originator));
00124    if ((tmp = strchr(originator, '-')))
00125       *tmp = '\0';
00126 
00127    tmp = strsep(&options, "|");
00128    if (options)
00129        ast_app_parse_options(page_opts, &flags, flag_args, options);
00130   
00131    if (ast_test_flag(&flags, PAGE_ANNOUNCE) && !ast_strlen_zero(flag_args[OPT_ARG_ANNOUNCE])) {
00132        snprintf(meetmeopts, sizeof(meetmeopts), "MeetMe|%ud|%s%sqxdw(5)G(%s)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"),
00133            (ast_test_flag(&flags, PAGE_RECORD) ? "r" : ""), flag_args[OPT_ARG_ANNOUNCE] );
00134  
00135    } else {
00136        snprintf(meetmeopts, sizeof(meetmeopts), "MeetMe|%ud|%s%sqxdw(5)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"),
00137            (ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") );
00138    }
00139 
00140    /* Count number of extensions in list by number of ampersands + 1 */
00141    num_dials = 1;
00142    tmp2 = tmp;
00143    while (*tmp2 && *tmp2++ == '&') {
00144       num_dials++;
00145    }
00146 
00147    if (!(dial_list = ast_calloc(num_dials, sizeof(void *)))) {
00148       ast_log(LOG_ERROR, "Can't allocate %ld bytes for dial list\n", (long)(sizeof(void *) * num_dials));
00149       ast_module_user_remove(u);
00150       return -1;
00151    }
00152 
00153    /* Go through parsing/calling each device */
00154    while ((tech = strsep(&tmp, "&"))) {
00155       struct ast_dial *dial = NULL;
00156 
00157       /* don't call the originating device */
00158       if (!strcasecmp(tech, originator))
00159          continue;
00160 
00161       /* If no resource is available, continue on */
00162       if (!(resource = strchr(tech, '/'))) {
00163          ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech);
00164          continue;
00165       }
00166 
00167       *resource++ = '\0';
00168 
00169       /* Create a dialing structure */
00170       if (!(dial = ast_dial_create())) {
00171          ast_log(LOG_WARNING, "Failed to create dialing structure.\n");
00172          continue;
00173       }
00174 
00175       /* Append technology and resource */
00176       ast_dial_append(dial, tech, resource);
00177 
00178       /* Set ANSWER_EXEC as global option */
00179       ast_dial_option_global_enable(dial, AST_DIAL_OPTION_ANSWER_EXEC, meetmeopts);
00180 
00181       /* Run this dial in async mode */
00182       ast_dial_run(dial, chan, 1);
00183 
00184       /* Put in our dialing array */
00185       dial_list[pos++] = dial;
00186    }
00187 
00188    if (!ast_test_flag(&flags, PAGE_QUIET)) {
00189       res = ast_streamfile(chan, "beep", chan->language);
00190       if (!res)
00191          res = ast_waitstream(chan, "");
00192    }
00193 
00194    if (!res) {
00195        /* Default behaviour */
00196        snprintf(meetmeopts, sizeof(meetmeopts), "%ud|A%s%sqxd", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "t"), 
00197            (ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") );
00198        if (ast_test_flag(&flags, PAGE_ANNOUNCE) && !ast_strlen_zero(flag_args[OPT_ARG_ANNOUNCE]) &&
00199       !ast_test_flag(&flags, PAGE_NOCALLERANNOUNCE)) {
00200       snprintf(meetmeopts, sizeof(meetmeopts), "%ud|A%s%sqxdG(%s)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "t"), 
00201           (ast_test_flag(&flags, PAGE_RECORD) ? "r" : ""), flag_args[OPT_ARG_ANNOUNCE] );
00202        }
00203        pbx_exec(chan, app, meetmeopts);
00204    }
00205 
00206    /* Go through each dial attempt cancelling, joining, and destroying */
00207    for (i = 0; i < pos; i++) {
00208       struct ast_dial *dial = dial_list[i];
00209 
00210       /* We have to wait for the async thread to exit as it's possible Meetme won't throw them out immediately */
00211       ast_dial_join(dial);
00212 
00213       /* Hangup all channels */
00214       ast_dial_hangup(dial);
00215 
00216       /* Destroy dialing structure */
00217       ast_dial_destroy(dial);
00218    }
00219 
00220    ast_free(dial_list);
00221    ast_module_user_remove(u);
00222 
00223    return -1;
00224 }

static int unload_module ( void   )  [static]

Definition at line 226 of file app_page.c.

References ast_module_user_hangup_all, and ast_unregister_application().

00227 {
00228    int res;
00229 
00230    res =  ast_unregister_application(app_page);
00231 
00232    ast_module_user_hangup_all();
00233 
00234    return res;
00235 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Page Multiple Phones" , .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 = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, } [static]

Definition at line 242 of file app_page.c.

const char* app_page = "Page" [static]

Definition at line 55 of file app_page.c.

const struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 242 of file app_page.c.

const char* page_descrip [static]

Definition at line 59 of file app_page.c.

enum { ... } page_opt_flags

struct ast_app_option page_opts[128] = { [ 'd' ] = { .flag = PAGE_DUPLEX }, [ 'q' ] = { .flag = PAGE_QUIET }, [ 'r' ] = { .flag = PAGE_RECORD }, [ 'A' ] = { .flag = PAGE_ANNOUNCE , .arg_index = OPT_ARG_ANNOUNCE + 1 }, [ 'n' ] = { .flag = PAGE_NOCALLERANNOUNCE },} [static]

Definition at line 92 of file app_page.c.

Referenced by page_exec().

const char* page_synopsis = "Pages phones" [static]

Definition at line 57 of file app_page.c.


Generated on Wed Mar 4 19:58:18 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7