#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "asterisk.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"
Go to the source code of this file.
Data Structures | |
struct | calloutdata |
Enumerations | |
enum | { PAGE_DUPLEX = (1 << 0), PAGE_QUIET = (1 << 1) } |
Functions | |
AST_APP_OPTIONS (page_opts,{AST_APP_OPTION('d', PAGE_DUPLEX), AST_APP_OPTION('q', PAGE_QUIET),}) | |
char * | description (void) |
Provides a description of the module. | |
char * | key () |
Returns the ASTERISK_GPL_KEY. | |
void | launch_page (struct ast_channel *chan, const char *meetmeopts, const char *tech, const char *resource) |
int | load_module (void) |
Initialize the module. | |
int | page_exec (struct ast_channel *chan, void *data) |
void * | page_thread (void *data) |
int | unload_module (void) |
Cleanup all module structures, sockets, etc. | |
int | usecount (void) |
Provides a usecount. | |
Variables | |
const char * | app_page = "Page" |
LOCAL_USER_DECL | |
const char * | page_descrip |
enum { ... } | page_opt_flags |
const char * | page_synopsis = "Pages phones" |
STANDARD_LOCAL_USER | |
const char * | tdesc = "Page Multiple Phones" |
Definition in file app_page.c.
|
Definition at line 65 of file app_page.c. 00065 { 00066 PAGE_DUPLEX = (1 << 0), 00067 PAGE_QUIET = (1 << 1), 00068 } page_opt_flags;
|
|
|
|
Provides a description of the module.
Definition at line 217 of file app_page.c. 00218 { 00219 return (char *) tdesc; 00220 }
|
|
Returns the ASTERISK_GPL_KEY. This returns the ASTERISK_GPL_KEY, signifiying that you agree to the terms of the GPL stated in the ASTERISK_GPL_KEY. Your module will not load if it does not return the EXACT message:
char *key(void) { return ASTERISK_GPL_KEY; }
Definition at line 231 of file app_page.c. 00232 {
00233 return ASTERISK_GPL_KEY;
00234 }
|
|
Definition at line 93 of file app_page.c. References AST_LIST_TRAVERSE, ast_log(), ast_pthread_create, ast_var_full_name(), ast_var_value(), ast_variable_new(), ast_channel::cid, ast_callerid::cid_name, ast_callerid::cid_num, calloutdata::cidname, calloutdata::cidnum, free, LOG_WARNING, malloc, calloutdata::meetmeopts, ast_variable::next, page_thread(), calloutdata::resource, calloutdata::tech, calloutdata::variables, and ast_channel::varshead. Referenced by page_exec(). 00094 { 00095 struct calloutdata *cd; 00096 const char *varname; 00097 struct ast_variable *lastvar = NULL; 00098 struct ast_var_t *varptr; 00099 pthread_t t; 00100 pthread_attr_t attr; 00101 cd = malloc(sizeof(struct calloutdata)); 00102 if (cd) { 00103 memset(cd, 0, sizeof(struct calloutdata)); 00104 ast_copy_string(cd->cidnum, chan->cid.cid_num ? chan->cid.cid_num : "", sizeof(cd->cidnum)); 00105 ast_copy_string(cd->cidname, chan->cid.cid_name ? chan->cid.cid_name : "", sizeof(cd->cidname)); 00106 ast_copy_string(cd->tech, tech, sizeof(cd->tech)); 00107 ast_copy_string(cd->resource, resource, sizeof(cd->resource)); 00108 ast_copy_string(cd->meetmeopts, meetmeopts, sizeof(cd->meetmeopts)); 00109 00110 AST_LIST_TRAVERSE(&chan->varshead, varptr, entries) { 00111 if (!(varname = ast_var_full_name(varptr))) 00112 continue; 00113 if (varname[0] == '_') { 00114 struct ast_variable *newvar = NULL; 00115 00116 if (varname[1] == '_') { 00117 newvar = ast_variable_new(varname, ast_var_value(varptr)); 00118 } else { 00119 newvar = ast_variable_new(&varname[1], ast_var_value(varptr)); 00120 } 00121 00122 if (newvar) { 00123 if (lastvar) 00124 lastvar->next = newvar; 00125 else 00126 cd->variables = newvar; 00127 lastvar = newvar; 00128 } 00129 } 00130 } 00131 00132 pthread_attr_init(&attr); 00133 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 00134 if (ast_pthread_create(&t, &attr, page_thread, cd)) { 00135 ast_log(LOG_WARNING, "Unable to create paging thread: %s\n", strerror(errno)); 00136 free(cd); 00137 } 00138 } 00139 }
|
|
Initialize the module. Initialize the Agents module. This function is being called by Asterisk when loading the module. Among other thing it registers applications, cli commands and reads the cofiguration file.
Definition at line 212 of file app_page.c. References app_page, ast_register_application(), page_descrip, page_exec(), and page_synopsis. 00213 { 00214 return ast_register_application(app_page, page_exec, page_synopsis, page_descrip); 00215 }
|
|
Definition at line 141 of file app_page.c. References ast_app_parse_options(), ast_log(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_test_flag, ast_waitstream(), ast_channel::language, launch_page(), LOCAL_USER_ADD, LOCAL_USER_REMOVE, LOG_ERROR, LOG_WARNING, PAGE_DUPLEX, PAGE_QUIET, pbx_exec(), pbx_findapp(), and strsep(). Referenced by load_module(). 00142 { 00143 struct localuser *u; 00144 char *options; 00145 char *tech, *resource; 00146 char meetmeopts[80]; 00147 struct ast_flags flags = { 0 }; 00148 unsigned int confid = rand(); 00149 struct ast_app *app; 00150 char *tmp; 00151 int res=0; 00152 00153 if (ast_strlen_zero(data)) { 00154 ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n"); 00155 return -1; 00156 } 00157 00158 LOCAL_USER_ADD(u); 00159 00160 if (!(app = pbx_findapp("MeetMe"))) { 00161 ast_log(LOG_WARNING, "There is no MeetMe application available!\n"); 00162 LOCAL_USER_REMOVE(u); 00163 return -1; 00164 }; 00165 00166 options = ast_strdupa(data); 00167 if (!options) { 00168 ast_log(LOG_ERROR, "Out of memory\n"); 00169 LOCAL_USER_REMOVE(u); 00170 return -1; 00171 } 00172 00173 tmp = strsep(&options, "|"); 00174 if (options) 00175 ast_app_parse_options(page_opts, &flags, NULL, options); 00176 00177 snprintf(meetmeopts, sizeof(meetmeopts), "%ud|%sqxdw", confid, ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"); 00178 while ((tech = strsep(&tmp, "&"))) { 00179 if ((resource = strchr(tech, '/'))) { 00180 *resource++ = '\0'; 00181 launch_page(chan, meetmeopts, tech, resource); 00182 } else { 00183 ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech); 00184 } 00185 } 00186 if (!ast_test_flag(&flags, PAGE_QUIET)) { 00187 res = ast_streamfile(chan, "beep", chan->language); 00188 if (!res) 00189 res = ast_waitstream(chan, ""); 00190 } 00191 if (!res) { 00192 snprintf(meetmeopts, sizeof(meetmeopts), "%ud|A%sqxd", confid, ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "t"); 00193 pbx_exec(chan, app, meetmeopts, 1); 00194 } 00195 00196 LOCAL_USER_REMOVE(u); 00197 00198 return -1; 00199 }
|
|
Definition at line 84 of file app_page.c. References AST_FORMAT_SLINEAR, ast_pbx_outgoing_app(), calloutdata::cidname, calloutdata::cidnum, free, calloutdata::meetmeopts, calloutdata::resource, calloutdata::tech, and calloutdata::variables. Referenced by launch_page(). 00085 { 00086 struct calloutdata *cd = data; 00087 ast_pbx_outgoing_app(cd->tech, AST_FORMAT_SLINEAR, cd->resource, 30000, 00088 "MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, cd->variables, NULL, NULL); 00089 free(cd); 00090 return NULL; 00091 }
|
|
Cleanup all module structures, sockets, etc. This is called at exit. Any registrations and memory allocations need to be unregistered and free'd here. Nothing else will do these for you (until exit).
Definition at line 201 of file app_page.c. References app_page, and ast_unregister_application(). 00202 { 00203 int res; 00204 00205 res = ast_unregister_application(app_page); 00206 00207 STANDARD_HANGUP_LOCALUSERS; 00208 00209 return res; 00210 }
|
|
Provides a usecount. This function will be called by various parts of asterisk. Basically, all it has to do is to return a usecount when called. You will need to maintain your usecount within the module somewhere. The usecount should be how many channels provided by this module are in use.
Definition at line 222 of file app_page.c. References STANDARD_USECOUNT. 00223 { 00224 int res; 00225 00226 STANDARD_USECOUNT(res); 00227 00228 return res; 00229 }
|
|
Definition at line 48 of file app_page.c. Referenced by load_module(), and unload_module(). |
|
Definition at line 63 of file app_page.c. |
|
Definition at line 52 of file app_page.c. Referenced by load_module(). |
|
|
|
Definition at line 50 of file app_page.c. Referenced by load_module(). |
|
Definition at line 61 of file app_page.c. |
|
Definition at line 46 of file app_page.c. |