simplify autoconfig include mechanism (make tholo happy he can use lint again :-)
[asterisk/asterisk.git] / res / res_clioriginate.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005 - 2006, Digium, Inc.
5  *
6  * Russell Bryant <russell@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! 
20  * \file
21  * \author Russell Bryant <russell@digium.com>
22  *
23  * \brief Originate calls via the CLI
24  * 
25  */
26
27 #include "asterisk.h"
28
29 ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
30
31 #include <stdlib.h>
32 #include <stdio.h>
33 #include <string.h>
34
35 #include "asterisk/channel.h"
36 #include "asterisk/pbx.h"
37 #include "asterisk/logger.h"
38 #include "asterisk/module.h"
39 #include "asterisk/cli.h"
40 #include "asterisk/utils.h"
41 #include "asterisk/frame.h"
42
43 /*! The timeout for originated calls, in seconds */
44 #define TIMEOUT 30
45
46 static struct module_symbols *me;
47
48 static char orig_help[] = 
49 "  There are two ways to use this command. A call can be originated between a\n"
50 "channel and a specific application, or between a channel and an extension in\n"
51 "the dialplan. This is similar to call files or the manager originate action.\n"
52 "Calls originated with this command are given a timeout of 30 seconds.\n\n"
53
54 "Usage1: originate <tech/data> application <appname> [appdata]\n"
55 "  This will originate a call between the specified channel tech/data and the\n"
56 "given application. Arguments to the application are optional. If the given\n"
57 "arguments to the application include spaces, all of the arguments to the\n"
58 "application need to be placed in quotation marks.\n\n"
59
60 "Usage2: originate <tech/data> extension [exten@][context]\n"
61 "  This will originate a call between the specified channel tech/data and the\n"
62 "given extension. If no context is specified, the 'default' context will be\n"
63 "used. If no extension is given, the 's' extension will be used.\n";
64
65 static int handle_orig(int fd, int argc, char *argv[]);
66 static char *complete_orig(const char *line, const char *word, int pos, int state);
67
68 struct ast_cli_entry cli_orig = { { "originate", NULL }, handle_orig, "Originate a call", orig_help, complete_orig };
69
70 static int orig_app(int fd, const char *chan, const char *app, const char *appdata)
71 {
72         char *chantech;
73         char *chandata;
74         int reason = 0;
75         
76         if (ast_strlen_zero(app))
77                 return RESULT_SHOWUSAGE;
78
79         chandata = ast_strdupa(chan);
80         
81         chantech = strsep(&chandata, "/");
82         if (!chandata) {
83                 ast_cli(fd, "*** No data provided after channel type! ***\n");
84                 return RESULT_SHOWUSAGE;
85         }
86
87         ast_pbx_outgoing_app(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, app, appdata, &reason, 1, NULL, NULL, NULL, NULL, NULL);
88
89         return RESULT_SUCCESS;
90 }
91
92 static int orig_exten(int fd, const char *chan, const char *data)
93 {
94         char *chantech;
95         char *chandata;
96         char *exten = NULL;
97         char *context = NULL;
98         int reason = 0;
99
100         chandata = ast_strdupa(chan);
101         
102         chantech = strsep(&chandata, "/");
103         if (!chandata) {
104                 ast_cli(fd, "*** No data provided after channel type! ***\n");
105                 return RESULT_SHOWUSAGE;
106         }
107
108         if (!ast_strlen_zero(data)) {
109                 context = ast_strdupa(data);
110                 exten = strsep(&context, "@");
111         }
112
113         if (ast_strlen_zero(exten))
114                 exten = "s";
115         if (ast_strlen_zero(context))
116                 context = "default";
117         
118         ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata, TIMEOUT * 1000, context, exten, 1, &reason, 1, NULL, NULL, NULL, NULL, NULL);
119
120         return RESULT_SUCCESS;
121 }
122
123 static int handle_orig(int fd, int argc, char *argv[])
124 {
125         int res;
126
127         if (ast_strlen_zero(argv[1]) || ast_strlen_zero(argv[2]))
128                 return RESULT_SHOWUSAGE;
129
130         ast_atomic_fetchadd_int(&me->usecnt, +1);
131
132         if (!strcasecmp("application", argv[2])) {
133                 res = orig_app(fd, argv[1], argv[3], argv[4]);  
134         } else if (!strcasecmp("extension", argv[2])) {
135                 res = orig_exten(fd, argv[1], argv[3]);
136         } else
137                 res = RESULT_SHOWUSAGE;
138
139         ast_atomic_fetchadd_int(&me->usecnt, -1);
140
141         return res;
142 }
143
144 static char *complete_orig(const char *line, const char *word, int pos, int state)
145 {
146         static char *choices[] = { "application", "extension", NULL };
147         char *ret;
148
149         if (pos != 2)
150                 return NULL;
151
152         ast_atomic_fetchadd_int(&me->usecnt, +1);
153         ret = ast_cli_complete(word, choices, state);
154         ast_atomic_fetchadd_int(&me->usecnt, -1);
155
156         return ret;
157 }
158
159 static int unload_module(void *mod)
160 {
161         return ast_cli_unregister(&cli_orig);
162 }
163
164 static int load_module(void *mod)
165 {
166         me = mod;
167         return ast_cli_register(&cli_orig);
168 }
169
170 static const char *description(void)
171 {
172         return "Call origination from the CLI";
173 }
174
175 static const char *key(void)
176 {
177         return ASTERISK_GPL_KEY;
178 }
179
180 STD_MOD(MOD_0 | NO_USECOUNT, NULL, NULL, NULL);