make new app conform to coding guidelines :-(
[asterisk/asterisk.git] / apps / app_page.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (c) 2004 - 2005 Digium, Inc.  All rights reserved.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * This code is released under the GNU General Public License
9  * version 2.0.  See LICENSE for more information.
10  *
11  * See http://www.asterisk.org for more information about
12  * the Asterisk project. Please do not directly contact
13  * any of the maintainers of this project for assistance;
14  * the project provides a web site, mailing lists and IRC
15  * channels for your use.
16  *
17  */
18
19 /*
20  *
21  * Page application
22  *
23  */
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <string.h>
29
30 #include "asterisk.h"
31
32 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
33
34 #include "asterisk/options.h"
35 #include "asterisk/logger.h"
36 #include "asterisk/channel.h"
37 #include "asterisk/pbx.h"
38 #include "asterisk/module.h"
39 #include "asterisk/app.h"
40
41
42 static const char *tdesc = "Page Multiple Phones";
43
44 static const char *app_page= "Page";
45
46 static const char *page_synopsis = "Pages phones";
47
48 static const char *page_descrip =
49 "Page(Technology/Resource&Technology2/Resource2[|options])\n"
50 "  Places outbound calls to the given technology / resource and dumps\n"
51 "them into a conference bridge as muted participants.  The original\n"
52 "caller is dumped into the conference as a speaker and the room is\n"
53 "destroyed when the original caller leaves.  Valid options are:\n"
54 "        d - full duplex audio\n"
55 "Always returns -1.\n";
56
57 STANDARD_LOCAL_USER;
58
59 LOCAL_USER_DECL;
60
61 #define PAGE_DUPLEX (1 << 0)
62
63 AST_DECLARE_OPTIONS(page_opts,{
64         ['d'] = { PAGE_DUPLEX },
65 });
66
67 static int page_exec(struct ast_channel *chan, void *data)
68 {
69         struct localuser *u;
70         char *options;
71         char *tech, *resource;
72         char meetmeopts[80];
73         struct ast_flags flags = { 0 };
74         unsigned int confid = rand();
75         struct ast_app *app;
76         char *tmp;
77
78         if (!data)
79                 return -1;
80
81         if (ast_strlen_zero(data)) {
82                 ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
83                 return -1;
84         }
85
86         if (!(app = pbx_findapp("MeetMe"))) {
87                 ast_log(LOG_WARNING, "There is no MeetMe application available!\n");
88                 return -1;
89         };
90
91         if (!(options = ast_strdupa((char *) data))) {
92                 ast_log(LOG_ERROR, "Out of memory\n");
93                 return -1;
94         }
95                 
96         LOCAL_USER_ADD(u);
97
98         tmp = strsep(&options, "|");
99         if (options)
100                 ast_parseoptions(page_opts, &flags, NULL, options);
101
102         snprintf(meetmeopts, sizeof(meetmeopts), "%ud|%sqxdw", confid, ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m");
103         while ((tech = strsep(&tmp, "&"))) {
104                 if ((resource = strchr(tech, '/'))) {
105                         *resource++ = '\0';
106                         ast_pbx_outgoing_app(tech, AST_FORMAT_SLINEAR, resource, 30000,
107                                              "MeetMe", meetmeopts, NULL, 0, chan->cid.cid_num, chan->cid.cid_name, NULL, NULL);
108                 } else {
109                         ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech);
110                 }
111         }
112         snprintf(meetmeopts, sizeof(meetmeopts), "%ud|A%sqxd", confid, ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "t");
113         pbx_exec(chan, app, meetmeopts, 1);
114
115         LOCAL_USER_REMOVE(u);
116
117         return -1;
118 }
119
120 int unload_module(void)
121 {
122         STANDARD_HANGUP_LOCALUSERS;
123
124         return ast_unregister_application(app_page);
125 }
126
127 int load_module(void)
128 {
129         return ast_register_application(app_page, page_exec, page_synopsis, page_descrip);
130 }
131
132 char *description(void)
133 {
134         return (char *) tdesc;
135 }
136
137 int usecount(void)
138 {
139         int res;
140
141         STANDARD_USECOUNT(res);
142
143         return res;
144 }
145
146 char *key()
147 {
148         return ASTERISK_GPL_KEY;
149 }