#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_info * | ast_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" |
Definition in file app_page.c.
anonymous enum |
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 |
Definition at line 81 of file app_page.c.
00081 { 00082 OPT_ARG_ANNOUNCE = 0, 00083 OPT_ARG_ARRAY_SIZE = 1, 00084 };
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().
00238 { 00239 return ast_register_application(app_page, page_exec, page_synopsis, page_descrip); 00240 }
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 }
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] |
const char* page_synopsis = "Pages phones" [static] |
Definition at line 57 of file app_page.c.