CHANGES: Update changes log to include r403414 entry
[asterisk/asterisk.git] / apps / app_stasis.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2012 - 2013, Digium, Inc.
5  *
6  * David M. Lee, II <dlee@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 /*! \file
20  *
21  * \brief Stasis dialplan application.
22  *
23  * \author David M. Lee, II <dlee@digium.com>
24  */
25
26 /*** MODULEINFO
27         <depend>res_stasis</depend>
28         <support_level>core</support_level>
29  ***/
30
31 #include "asterisk.h"
32
33 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
34
35 #include "asterisk/app.h"
36 #include "asterisk/module.h"
37 #include "asterisk/stasis.h"
38 #include "asterisk/stasis_app_impl.h"
39
40 /*** DOCUMENTATION
41         <application name="Stasis" language="en_US">
42                 <synopsis>Invoke an external Stasis application.</synopsis>
43                 <syntax>
44                         <parameter name="app_name" required="true">
45                                 <para>Name of the application to invoke.</para>
46                         </parameter>
47                         <parameter name="args">
48                                 <para>Optional comma-delimited arguments for the
49                                 application invocation.</para>
50                         </parameter>
51                 </syntax>
52                 <description>
53                         <para>
54                                 Invoke a Stasis application.
55                         </para>
56                 </description>
57         </application>
58  ***/
59
60 /*! \brief Maximum number of arguments for the Stasis dialplan application */
61 #define MAX_ARGS 128
62
63 /*! \brief Dialplan application name */
64 static const char *stasis = "Stasis";
65
66 /*! /brief Stasis dialplan application callback */
67 static int app_exec(struct ast_channel *chan, const char *data)
68 {
69         char *parse = NULL;
70
71         AST_DECLARE_APP_ARGS(args,
72                 AST_APP_ARG(app_name);
73                 AST_APP_ARG(app_argv)[MAX_ARGS];
74         );
75
76         ast_assert(chan != NULL);
77         ast_assert(data != NULL);
78
79         /* parse the arguments */
80         parse = ast_strdupa(data);
81         AST_STANDARD_APP_ARGS(args, parse);
82
83         if (args.argc < 1) {
84                 ast_log(LOG_WARNING, "Stasis app_name argument missing\n");
85                 return -1;
86         }
87
88         return stasis_app_exec(
89                 chan, args.app_name, args.argc - 1, args.app_argv);
90 }
91
92 static int load_module(void)
93 {
94         int r = 0;
95
96         stasis_app_ref();
97         r |= ast_register_application_xml(stasis, app_exec);
98         return r;
99 }
100
101 static int unload_module(void)
102 {
103         int r = 0;
104         r |= ast_unregister_application(stasis);
105         stasis_app_unref();
106         return r;
107 }
108
109 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Stasis dialplan application",
110         .load = load_module,
111         .unload = unload_module,
112         .nonoptreq = "res_stasis",
113         );