Asterisk - The Open Source Telephony Project GIT-master-5963e62
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Functions
resource_channels.h File Reference

Generated file - declares stubs to be implemented in res/ari/resource_channels.c. More...

#include "asterisk/ari.h"
Include dependency graph for resource_channels.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_ari_channels_answer_args
 
struct  ast_ari_channels_continue_in_dialplan_args
 
struct  ast_ari_channels_create_args
 
struct  ast_ari_channels_dial_args
 
struct  ast_ari_channels_external_media_args
 
struct  ast_ari_channels_get_args
 
struct  ast_ari_channels_get_channel_var_args
 
struct  ast_ari_channels_hangup_args
 
struct  ast_ari_channels_hold_args
 
struct  ast_ari_channels_list_args
 
struct  ast_ari_channels_move_args
 
struct  ast_ari_channels_mute_args
 
struct  ast_ari_channels_originate_args
 
struct  ast_ari_channels_originate_with_id_args
 
struct  ast_ari_channels_play_args
 
struct  ast_ari_channels_play_with_id_args
 
struct  ast_ari_channels_record_args
 
struct  ast_ari_channels_redirect_args
 
struct  ast_ari_channels_ring_args
 
struct  ast_ari_channels_ring_stop_args
 
struct  ast_ari_channels_rtpstatistics_args
 
struct  ast_ari_channels_send_dtmf_args
 
struct  ast_ari_channels_set_channel_var_args
 
struct  ast_ari_channels_snoop_channel_args
 
struct  ast_ari_channels_snoop_channel_with_id_args
 
struct  ast_ari_channels_start_moh_args
 
struct  ast_ari_channels_start_silence_args
 
struct  ast_ari_channels_stop_moh_args
 
struct  ast_ari_channels_stop_silence_args
 
struct  ast_ari_channels_transfer_progress_args
 
struct  ast_ari_channels_unhold_args
 
struct  ast_ari_channels_unmute_args
 

Functions

void ast_ari_channels_answer (struct ast_variable *headers, struct ast_ari_channels_answer_args *args, struct ast_ari_response *response)
 Answer a channel. More...
 
void ast_ari_channels_continue_in_dialplan (struct ast_variable *headers, struct ast_ari_channels_continue_in_dialplan_args *args, struct ast_ari_response *response)
 Exit application; continue execution in the dialplan. More...
 
int ast_ari_channels_continue_in_dialplan_parse_body (struct ast_json *body, struct ast_ari_channels_continue_in_dialplan_args *args)
 Body parsing function for /channels/{channelId}/continue. More...
 
void ast_ari_channels_create (struct ast_variable *headers, struct ast_ari_channels_create_args *args, struct ast_ari_response *response)
 Create channel. More...
 
int ast_ari_channels_create_parse_body (struct ast_json *body, struct ast_ari_channels_create_args *args)
 Body parsing function for /channels/create. More...
 
void ast_ari_channels_dial (struct ast_variable *headers, struct ast_ari_channels_dial_args *args, struct ast_ari_response *response)
 Dial a created channel. More...
 
int ast_ari_channels_dial_parse_body (struct ast_json *body, struct ast_ari_channels_dial_args *args)
 Body parsing function for /channels/{channelId}/dial. More...
 
void ast_ari_channels_external_media (struct ast_variable *headers, struct ast_ari_channels_external_media_args *args, struct ast_ari_response *response)
 Start an External Media session. More...
 
int ast_ari_channels_external_media_parse_body (struct ast_json *body, struct ast_ari_channels_external_media_args *args)
 Body parsing function for /channels/externalMedia. More...
 
void ast_ari_channels_get (struct ast_variable *headers, struct ast_ari_channels_get_args *args, struct ast_ari_response *response)
 Channel details. More...
 
void ast_ari_channels_get_channel_var (struct ast_variable *headers, struct ast_ari_channels_get_channel_var_args *args, struct ast_ari_response *response)
 Get the value of a channel variable or function. More...
 
int ast_ari_channels_get_channel_var_parse_body (struct ast_json *body, struct ast_ari_channels_get_channel_var_args *args)
 Body parsing function for /channels/{channelId}/variable. More...
 
void ast_ari_channels_hangup (struct ast_variable *headers, struct ast_ari_channels_hangup_args *args, struct ast_ari_response *response)
 Delete (i.e. hangup) a channel. More...
 
int ast_ari_channels_hangup_parse_body (struct ast_json *body, struct ast_ari_channels_hangup_args *args)
 Body parsing function for /channels/{channelId}. More...
 
void ast_ari_channels_hold (struct ast_variable *headers, struct ast_ari_channels_hold_args *args, struct ast_ari_response *response)
 Hold a channel. More...
 
void ast_ari_channels_list (struct ast_variable *headers, struct ast_ari_channels_list_args *args, struct ast_ari_response *response)
 List all active channels in Asterisk. More...
 
void ast_ari_channels_move (struct ast_variable *headers, struct ast_ari_channels_move_args *args, struct ast_ari_response *response)
 Move the channel from one Stasis application to another. More...
 
int ast_ari_channels_move_parse_body (struct ast_json *body, struct ast_ari_channels_move_args *args)
 Body parsing function for /channels/{channelId}/move. More...
 
void ast_ari_channels_mute (struct ast_variable *headers, struct ast_ari_channels_mute_args *args, struct ast_ari_response *response)
 Mute a channel. More...
 
int ast_ari_channels_mute_parse_body (struct ast_json *body, struct ast_ari_channels_mute_args *args)
 Body parsing function for /channels/{channelId}/mute. More...
 
void ast_ari_channels_originate (struct ast_variable *headers, struct ast_ari_channels_originate_args *args, struct ast_ari_response *response)
 Create a new channel (originate). More...
 
int ast_ari_channels_originate_parse_body (struct ast_json *body, struct ast_ari_channels_originate_args *args)
 Body parsing function for /channels. More...
 
void ast_ari_channels_originate_with_id (struct ast_variable *headers, struct ast_ari_channels_originate_with_id_args *args, struct ast_ari_response *response)
 Create a new channel (originate with id). More...
 
int ast_ari_channels_originate_with_id_parse_body (struct ast_json *body, struct ast_ari_channels_originate_with_id_args *args)
 Body parsing function for /channels/{channelId}. More...
 
void ast_ari_channels_play (struct ast_variable *headers, struct ast_ari_channels_play_args *args, struct ast_ari_response *response)
 Start playback of media. More...
 
int ast_ari_channels_play_parse_body (struct ast_json *body, struct ast_ari_channels_play_args *args)
 Body parsing function for /channels/{channelId}/play. More...
 
void ast_ari_channels_play_with_id (struct ast_variable *headers, struct ast_ari_channels_play_with_id_args *args, struct ast_ari_response *response)
 Start playback of media and specify the playbackId. More...
 
int ast_ari_channels_play_with_id_parse_body (struct ast_json *body, struct ast_ari_channels_play_with_id_args *args)
 Body parsing function for /channels/{channelId}/play/{playbackId}. More...
 
void ast_ari_channels_record (struct ast_variable *headers, struct ast_ari_channels_record_args *args, struct ast_ari_response *response)
 Start a recording. More...
 
int ast_ari_channels_record_parse_body (struct ast_json *body, struct ast_ari_channels_record_args *args)
 Body parsing function for /channels/{channelId}/record. More...
 
void ast_ari_channels_redirect (struct ast_variable *headers, struct ast_ari_channels_redirect_args *args, struct ast_ari_response *response)
 Redirect the channel to a different location. More...
 
int ast_ari_channels_redirect_parse_body (struct ast_json *body, struct ast_ari_channels_redirect_args *args)
 Body parsing function for /channels/{channelId}/redirect. More...
 
void ast_ari_channels_ring (struct ast_variable *headers, struct ast_ari_channels_ring_args *args, struct ast_ari_response *response)
 Indicate ringing to a channel. More...
 
void ast_ari_channels_ring_stop (struct ast_variable *headers, struct ast_ari_channels_ring_stop_args *args, struct ast_ari_response *response)
 Stop ringing indication on a channel if locally generated. More...
 
void ast_ari_channels_rtpstatistics (struct ast_variable *headers, struct ast_ari_channels_rtpstatistics_args *args, struct ast_ari_response *response)
 RTP stats on a channel. More...
 
void ast_ari_channels_send_dtmf (struct ast_variable *headers, struct ast_ari_channels_send_dtmf_args *args, struct ast_ari_response *response)
 Send provided DTMF to a given channel. More...
 
int ast_ari_channels_send_dtmf_parse_body (struct ast_json *body, struct ast_ari_channels_send_dtmf_args *args)
 Body parsing function for /channels/{channelId}/dtmf. More...
 
void ast_ari_channels_set_channel_var (struct ast_variable *headers, struct ast_ari_channels_set_channel_var_args *args, struct ast_ari_response *response)
 Set the value of a channel variable or function. More...
 
int ast_ari_channels_set_channel_var_parse_body (struct ast_json *body, struct ast_ari_channels_set_channel_var_args *args)
 Body parsing function for /channels/{channelId}/variable. More...
 
void ast_ari_channels_snoop_channel (struct ast_variable *headers, struct ast_ari_channels_snoop_channel_args *args, struct ast_ari_response *response)
 Start snooping. More...
 
int ast_ari_channels_snoop_channel_parse_body (struct ast_json *body, struct ast_ari_channels_snoop_channel_args *args)
 Body parsing function for /channels/{channelId}/snoop. More...
 
void ast_ari_channels_snoop_channel_with_id (struct ast_variable *headers, struct ast_ari_channels_snoop_channel_with_id_args *args, struct ast_ari_response *response)
 Start snooping. More...
 
int ast_ari_channels_snoop_channel_with_id_parse_body (struct ast_json *body, struct ast_ari_channels_snoop_channel_with_id_args *args)
 Body parsing function for /channels/{channelId}/snoop/{snoopId}. More...
 
void ast_ari_channels_start_moh (struct ast_variable *headers, struct ast_ari_channels_start_moh_args *args, struct ast_ari_response *response)
 Play music on hold to a channel. More...
 
int ast_ari_channels_start_moh_parse_body (struct ast_json *body, struct ast_ari_channels_start_moh_args *args)
 Body parsing function for /channels/{channelId}/moh. More...
 
void ast_ari_channels_start_silence (struct ast_variable *headers, struct ast_ari_channels_start_silence_args *args, struct ast_ari_response *response)
 Play silence to a channel. More...
 
void ast_ari_channels_stop_moh (struct ast_variable *headers, struct ast_ari_channels_stop_moh_args *args, struct ast_ari_response *response)
 Stop playing music on hold to a channel. More...
 
void ast_ari_channels_stop_silence (struct ast_variable *headers, struct ast_ari_channels_stop_silence_args *args, struct ast_ari_response *response)
 Stop playing silence to a channel. More...
 
void ast_ari_channels_transfer_progress (struct ast_variable *headers, struct ast_ari_channels_transfer_progress_args *args, struct ast_ari_response *response)
 Inform the channel about the progress of the attended/blind transfer. More...
 
int ast_ari_channels_transfer_progress_parse_body (struct ast_json *body, struct ast_ari_channels_transfer_progress_args *args)
 Body parsing function for /channels/{channelId}/transfer_progress. More...
 
void ast_ari_channels_unhold (struct ast_variable *headers, struct ast_ari_channels_unhold_args *args, struct ast_ari_response *response)
 Remove a channel from hold. More...
 
void ast_ari_channels_unmute (struct ast_variable *headers, struct ast_ari_channels_unmute_args *args, struct ast_ari_response *response)
 Unmute a channel. More...
 
int ast_ari_channels_unmute_parse_body (struct ast_json *body, struct ast_ari_channels_unmute_args *args)
 Body parsing function for /channels/{channelId}/mute. More...
 

Detailed Description

Generated file - declares stubs to be implemented in res/ari/resource_channels.c.

Channel resources

Author
David M. Lee, II dlee@.nosp@m.digi.nosp@m.um.co.nosp@m.m

Definition in file resource_channels.h.

Function Documentation

◆ ast_ari_channels_answer()

void ast_ari_channels_answer ( struct ast_variable headers,
struct ast_ari_channels_answer_args args,
struct ast_ari_response response 
)

Answer a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 339 of file resource_channels.c.

342{
343 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
344
345 control = find_control(response, args->channel_id);
346 if (control == NULL) {
347 return;
348 }
349
350 if (channel_state_invalid(control, response)) {
351 return;
352 }
353
354 if (stasis_app_control_answer(control) != 0) {
356 response, 500, "Internal Server Error",
357 "Failed to answer channel");
358 return;
359 }
360
362}
void ast_ari_response_error(struct ast_ari_response *response, int response_code, const char *response_text, const char *message_fmt,...)
Fill in an error ast_ari_response.
Definition: res_ari.c:212
void ast_ari_response_no_content(struct ast_ari_response *response)
Fill in a No Content (204) ast_ari_response.
Definition: res_ari.c:237
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define NULL
Definition: resample.c:96
static int channel_state_invalid(struct stasis_app_control *control, struct ast_ari_response *response)
Ensure channel is in a state that allows operation to be performed.
static struct stasis_app_control * find_control(struct ast_ari_response *response, const char *channel_id)
Finds the control object for a channel, filling the response with an error, if appropriate.
int stasis_app_control_answer(struct stasis_app_control *control)
Answer the channel associated with this control.
const char * args
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:947

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_answer().

Referenced by ast_ari_channels_answer_cb().

◆ ast_ari_channels_continue_in_dialplan()

void ast_ari_channels_continue_in_dialplan ( struct ast_variable headers,
struct ast_ari_channels_continue_in_dialplan_args args,
struct ast_ari_response response 
)

Exit application; continue execution in the dialplan.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 181 of file resource_channels.c.

185{
186 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
187 RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
188 int ipri;
189 const char *context;
190 const char *exten;
191
192 ast_assert(response != NULL);
193
194 control = find_control(response, args->channel_id);
195 if (control == NULL) {
196 return;
197 }
198
199 if (channel_state_invalid(control, response)) {
200 return;
201 }
202
203 snapshot = stasis_app_control_get_snapshot(control);
204 if (!snapshot) {
205 ast_ari_response_error(response, 404, "Not Found", "Channel not found");
206 return;
207 }
208
209 if (ast_strlen_zero(args->context)) {
210 context = snapshot->dialplan->context;
211 exten = S_OR(args->extension, snapshot->dialplan->exten);
212 } else {
213 context = args->context;
214 exten = S_OR(args->extension, "s");
215 }
216
217 if (!ast_strlen_zero(args->label)) {
218 /* A label was provided in the request, use that */
219
220 if (sscanf(args->label, "%30d", &ipri) != 1) {
221 ipri = ast_findlabel_extension(NULL, context, exten, args->label, NULL);
222 if (ipri == -1) {
223 ast_log(AST_LOG_ERROR, "Requested label: %s can not be found in context: %s\n", args->label, context);
224 ast_ari_response_error(response, 404, "Not Found", "Requested label can not be found");
225 return;
226 }
227 } else {
228 ast_debug(3, "Numeric value provided for label, jumping to that priority\n");
229 }
230
231 if (ipri == 0) {
232 ast_log(AST_LOG_ERROR, "Invalid priority label '%s' specified for extension %s in context: %s\n",
233 args->label, exten, context);
234 ast_ari_response_error(response, 400, "Bad Request", "Requested priority is illegal");
235 return;
236 }
237
238 } else if (args->priority) {
239 /* No label provided, use provided priority */
240 ipri = args->priority;
241 } else if (ast_strlen_zero(args->context) && ast_strlen_zero(args->extension)) {
242 /* Special case. No exten, context, or priority provided, then move on to the next priority */
243 ipri = snapshot->dialplan->priority + 1;
244 } else {
245 ipri = 1;
246 }
247
248
249 if (stasis_app_control_continue(control, context, exten, ipri)) {
251 return;
252 }
253
255}
void ast_ari_response_alloc_failed(struct ast_ari_response *response)
Fill in response with a 500 message for allocation failures.
Definition: res_ari.c:251
#define ast_log
Definition: astobj2.c:42
#define AST_LOG_ERROR
#define ast_debug(level,...)
Log a DEBUG message.
int ast_findlabel_extension(struct ast_channel *c, const char *context, const char *exten, const char *label, const char *callerid)
Find the priority of an extension that has the specified label.
Definition: pbx.c:4195
int stasis_app_control_continue(struct stasis_app_control *control, const char *context, const char *extension, int priority)
Exit res_stasis and continue execution in the dialplan.
Definition: control.c:415
struct ast_channel_snapshot * stasis_app_control_get_snapshot(const struct stasis_app_control *control)
Returns the most recent snapshot for the associated channel.
Definition: control.c:886
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Structure representing a snapshot of channel state.
#define ast_assert(a)
Definition: utils.h:745

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_response_no_content(), ast_assert, ast_debug, ast_findlabel_extension(), ast_log, AST_LOG_ERROR, ast_strlen_zero(), channel_state_invalid(), voicemailpwcheck::context, find_control(), NULL, RAII_VAR, S_OR, stasis_app_control_continue(), and stasis_app_control_get_snapshot().

Referenced by ast_ari_channels_continue_in_dialplan_cb().

◆ ast_ari_channels_continue_in_dialplan_parse_body()

int ast_ari_channels_continue_in_dialplan_parse_body ( struct ast_json body,
struct ast_ari_channels_continue_in_dialplan_args args 
)

Body parsing function for /channels/{channelId}/continue.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 693 of file res_ari_channels.c.

696{
697 struct ast_json *field;
698 /* Parse query parameters out of it */
699 field = ast_json_object_get(body, "context");
700 if (field) {
701 args->context = ast_json_string_get(field);
702 }
703 field = ast_json_object_get(body, "extension");
704 if (field) {
705 args->extension = ast_json_string_get(field);
706 }
707 field = ast_json_object_get(body, "priority");
708 if (field) {
709 args->priority = ast_json_integer_get(field);
710 }
711 field = ast_json_object_get(body, "label");
712 if (field) {
713 args->label = ast_json_string_get(field);
714 }
715 return 0;
716}
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:283
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:407
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition: json.c:332
Abstract JSON element (object, array, string, int, ...).

References args, ast_json_integer_get(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_continue_in_dialplan_cb().

◆ ast_ari_channels_create()

void ast_ari_channels_create ( struct ast_variable headers,
struct ast_ari_channels_create_args args,
struct ast_ari_response response 
)

Create channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1779 of file resource_channels.c.

1782{
1783 RAII_VAR(struct ast_variable *, variables, NULL, ast_variables_destroy);
1784 struct ast_assigned_ids assignedids;
1785 struct ari_channel_thread_data *chan_data;
1786 struct ast_channel_snapshot *snapshot;
1787 pthread_t thread;
1788 char *dialtech;
1789 char *dialdevice = NULL;
1790 char *stuff;
1791 int cause;
1792 struct ast_format_cap *request_cap;
1793 struct ast_channel *originator;
1794
1795 /* Parse any query parameters out of the body parameter */
1796 if (args->variables) {
1797 struct ast_json *json_variables;
1798
1800 json_variables = ast_json_object_get(args->variables, "variables");
1801 if (json_variables
1802 && json_to_ast_variables(response, json_variables, &variables)) {
1803 return;
1804 }
1805 }
1806
1807 assignedids.uniqueid = args->channel_id;
1808 assignedids.uniqueid2 = args->other_channel_id;
1809
1810 if (!ast_strlen_zero(args->originator) && !ast_strlen_zero(args->formats)) {
1811 ast_ari_response_error(response, 400, "Bad Request",
1812 "Originator and formats can't both be specified");
1813 return;
1814 }
1815
1816 if (ast_strlen_zero(args->endpoint)) {
1817 ast_ari_response_error(response, 400, "Bad Request",
1818 "Endpoint must be specified");
1819 return;
1820 }
1821
1822 chan_data = ast_calloc(1, sizeof(*chan_data));
1823 if (!chan_data) {
1825 return;
1826 }
1827
1828 chan_data->stasis_stuff = ast_str_create(32);
1829 if (!chan_data->stasis_stuff) {
1831 chan_data_destroy(chan_data);
1832 return;
1833 }
1834
1835 ast_str_append(&chan_data->stasis_stuff, 0, "%s", args->app);
1836 if (!ast_strlen_zero(args->app_args)) {
1837 ast_str_append(&chan_data->stasis_stuff, 0, ",%s", args->app_args);
1838 }
1839
1840 dialtech = ast_strdupa(args->endpoint);
1841 if ((stuff = strchr(dialtech, '/'))) {
1842 *stuff++ = '\0';
1843 dialdevice = stuff;
1844 }
1845
1846 if (ast_strlen_zero(dialtech) || ast_strlen_zero(dialdevice)) {
1847 ast_ari_response_error(response, 400, "Bad Request",
1848 "Invalid endpoint specified");
1849 chan_data_destroy(chan_data);
1850 return;
1851 }
1852
1853 originator = ast_channel_get_by_name(args->originator);
1854 if (originator) {
1855 request_cap = ao2_bump(ast_channel_nativeformats(originator));
1856 if (!ast_strlen_zero(args->app)) {
1857 stasis_app_subscribe_channel(args->app, originator);
1858 }
1859 } else if (!ast_strlen_zero(args->formats)) {
1860 char *format_name;
1861 char *formats_copy = ast_strdupa(args->formats);
1862
1863 if (!(request_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
1865 chan_data_destroy(chan_data);
1866 return;
1867 }
1868
1869 while ((format_name = ast_strip(strsep(&formats_copy, ",")))) {
1870 struct ast_format *fmt = ast_format_cache_get(format_name);
1871
1872 if (!fmt || ast_format_cap_append(request_cap, fmt, 0)) {
1873 if (!fmt) {
1875 response, 400, "Bad Request",
1876 "Provided format (%s) was not found", format_name);
1877 } else {
1879 }
1880 ao2_ref(request_cap, -1);
1881 ao2_cleanup(fmt);
1882 chan_data_destroy(chan_data);
1883 return;
1884 }
1885 ao2_ref(fmt, -1);
1886 }
1887 } else {
1888 if (!(request_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
1890 chan_data_destroy(chan_data);
1891 return;
1892 }
1893
1895 }
1896
1897 chan_data->chan = ast_request(dialtech, request_cap, &assignedids, originator, dialdevice, &cause);
1898 ao2_cleanup(request_cap);
1899
1900 if (!chan_data->chan) {
1902 ast_ari_response_error(response, 409, "Conflict",
1903 "Channel with given unique ID already exists");
1904 } else {
1906 }
1907 ast_channel_cleanup(originator);
1908 chan_data_destroy(chan_data);
1909 return;
1910 }
1911
1912 if (!ast_strlen_zero(args->app)) {
1913 stasis_app_subscribe_channel(args->app, chan_data->chan);
1914 }
1915
1916 if (variables) {
1917 ast_set_variables(chan_data->chan, variables);
1918 }
1919
1920 ast_channel_cleanup(originator);
1921
1922 if (save_dialstring(chan_data->chan, stuff)) {
1924 chan_data_destroy(chan_data);
1925 return;
1926 }
1927
1929
1932 chan_data_destroy(chan_data);
1933 } else {
1935 }
1936
1937 ao2_ref(snapshot, -1);
1938}
pthread_t thread
Definition: app_sla.c:335
void ast_ari_response_ok(struct ast_ari_response *response, struct ast_json *message)
Fill in an OK (200) ast_ari_response.
Definition: res_ari.c:229
char * strsep(char **str, const char *delims)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
enum ast_channel_error ast_channel_errno(void)
Get error code for latest channel operation.
Definition: channel.c:10962
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition: channel.c:8116
@ AST_CHANNEL_ERROR_ID_EXISTS
Definition: channel.h:4875
const char * ast_channel_uniqueid(const struct ast_channel *chan)
struct ast_channel * ast_channel_get_by_name(const char *search)
Find a channel by name or uniqueid.
Definition: channel.c:1397
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:3019
struct ast_channel * ast_request(const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Requests a channel.
Definition: channel.c:6309
@ AST_MEDIA_TYPE_AUDIO
Definition: codec.h:32
#define ast_format_cache_get(name)
Retrieve a named format from the cache.
Definition: format_cache.h:278
int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Add all codecs Asterisk knows about for a specific type to the capabilities structure.
Definition: format_cap.c:216
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition: format_cap.h:99
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object,...
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262
static int save_dialstring(struct ast_channel *chan, const char *dialstring)
Save dialstring onto a channel datastore.
static int json_to_ast_variables(struct ast_ari_response *response, struct ast_json *json_variables, struct ast_variable **variables)
static void * ari_channel_thread(void *data)
Thread that owns stasis-created channel.
static void chan_data_destroy(struct ari_channel_thread_data *chan_data)
int ast_ari_channels_create_parse_body(struct ast_json *body, struct ast_ari_channels_create_args *args)
Body parsing function for /channels/create.
enum stasis_app_subscribe_res stasis_app_subscribe_channel(const char *app_name, struct ast_channel *chan)
Directly subscribe an application to a channel.
Definition: res_stasis.c:2063
struct ast_json * ast_channel_snapshot_to_json(const struct ast_channel_snapshot *snapshot, const struct stasis_message_sanitizer *sanitize)
Build a JSON object from a ast_channel_snapshot.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
struct ast_str * stasis_stuff
struct ast_channel * chan
Structure to pass both assignedid values to channel drivers.
Definition: channel.h:606
Main Channel structure associated with a channel.
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Definition of a media format.
Definition: format.c:43
Structure for variables, used for configurations and for channel variables.
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:594

References ao2_bump, ao2_cleanup, ao2_ref, args, ari_channel_thread(), ast_ari_channels_create_parse_body(), ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_response_ok(), ast_calloc, ast_channel_cleanup, ast_channel_errno(), AST_CHANNEL_ERROR_ID_EXISTS, ast_channel_get_by_name(), ast_channel_nativeformats(), ast_channel_snapshot_get_latest(), ast_channel_snapshot_to_json(), ast_channel_uniqueid(), ast_format_cache_get, ast_format_cap_alloc, ast_format_cap_append, ast_format_cap_append_by_type(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_json_object_get(), AST_MEDIA_TYPE_AUDIO, ast_pthread_create_detached, ast_request(), ast_set_variables(), ast_str_append(), ast_str_create, ast_strdupa, ast_strip(), ast_strlen_zero(), ast_variables_destroy(), ari_channel_thread_data::chan, chan_data_destroy(), json_to_ast_variables(), NULL, RAII_VAR, save_dialstring(), stasis_app_subscribe_channel(), ari_channel_thread_data::stasis_stuff, strsep(), thread, ast_assigned_ids::uniqueid, and ast_assigned_ids::uniqueid2.

Referenced by ast_ari_channels_create_cb().

◆ ast_ari_channels_create_parse_body()

int ast_ari_channels_create_parse_body ( struct ast_json body,
struct ast_ari_channels_create_args args 
)

Body parsing function for /channels/create.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 268 of file res_ari_channels.c.

271{
272 struct ast_json *field;
273 /* Parse query parameters out of it */
274 field = ast_json_object_get(body, "endpoint");
275 if (field) {
276 args->endpoint = ast_json_string_get(field);
277 }
278 field = ast_json_object_get(body, "app");
279 if (field) {
280 args->app = ast_json_string_get(field);
281 }
282 field = ast_json_object_get(body, "appArgs");
283 if (field) {
284 args->app_args = ast_json_string_get(field);
285 }
286 field = ast_json_object_get(body, "channelId");
287 if (field) {
288 args->channel_id = ast_json_string_get(field);
289 }
290 field = ast_json_object_get(body, "otherChannelId");
291 if (field) {
292 args->other_channel_id = ast_json_string_get(field);
293 }
294 field = ast_json_object_get(body, "originator");
295 if (field) {
296 args->originator = ast_json_string_get(field);
297 }
298 field = ast_json_object_get(body, "formats");
299 if (field) {
300 args->formats = ast_json_string_get(field);
301 }
302 return 0;
303}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_create().

◆ ast_ari_channels_dial()

void ast_ari_channels_dial ( struct ast_variable headers,
struct ast_ari_channels_dial_args args,
struct ast_ari_response response 
)

Dial a created channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1940 of file resource_channels.c.

1943{
1944 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
1945 RAII_VAR(struct ast_channel *, caller, NULL, ast_channel_cleanup);
1946 RAII_VAR(struct ast_channel *, callee, NULL, ast_channel_cleanup);
1947 char *dialstring;
1948
1949 control = find_control(response, args->channel_id);
1950 if (control == NULL) {
1951 /* Response filled in by find_control */
1952 return;
1953 }
1954
1955 caller = ast_channel_get_by_name(args->caller);
1956
1957 callee = ast_channel_get_by_name(args->channel_id);
1958 if (!callee) {
1959 ast_ari_response_error(response, 404, "Not Found",
1960 "Callee not found");
1961 return;
1962 }
1963
1964 if (ast_channel_state(callee) != AST_STATE_DOWN
1965 && ast_channel_state(callee) != AST_STATE_RESERVED) {
1966 ast_ari_response_error(response, 409, "Conflict",
1967 "Channel is not in the 'Down' state");
1968 return;
1969 }
1970
1971 /* XXX This is straight up copied from main/dial.c. It's probably good
1972 * to separate this to some common method.
1973 */
1974 if (caller) {
1975 ast_channel_lock_both(caller, callee);
1976 } else {
1977 ast_channel_lock(callee);
1978 }
1979
1980 dialstring = restore_dialstring(callee);
1981 if (!dialstring) {
1982 ast_channel_unlock(callee);
1983 if (caller) {
1984 ast_channel_unlock(caller);
1985 }
1986 ast_ari_response_error(response, 409, "Conflict",
1987 "Dialing a channel not created by ARI");
1988 return;
1989 }
1990 /* Make a copy of the dialstring just in case some jerk tries to hang up the
1991 * channel before we can actually dial
1992 */
1993 dialstring = ast_strdupa(dialstring);
1994
1996 if (caller) {
1997 ast_channel_inherit_variables(caller, callee);
1998 ast_channel_datastore_inherit(caller, callee);
2000
2001 /* Copy over callerid information */
2003
2005
2007
2008 ast_channel_language_set(callee, ast_channel_language(caller));
2011 ast_channel_musicclass_set(callee, ast_channel_musicclass(caller));
2012
2015 ast_channel_unlock(caller);
2016 }
2017
2019 ast_channel_unlock(callee);
2020
2021 if (stasis_app_control_dial(control, dialstring, args->timeout)) {
2023 return;
2024 }
2025
2027}
@ AST_CHANNEL_REQUESTOR_BRIDGE_PEER
Definition: channel.h:1525
const char * ast_channel_musicclass(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2972
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
unsigned short ast_channel_transfercapability(const struct ast_channel *chan)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2979
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition: channel.c:2337
void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition: channel.c:6389
ast_channel_adsicpe
Definition: channel.h:888
void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
Inherits channel variable from parent to child channel.
Definition: channel.c:6731
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
const char * ast_channel_language(const struct ast_channel *chan)
void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src)
Copy the caller information to the connected line information.
Definition: channel.c:8294
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
void ast_channel_transfercapability_set(struct ast_channel *chan, unsigned short value)
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
#define ast_channel_unlock(chan)
Definition: channel.h:2973
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition: channel.c:2102
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_DOWN
Definition: channelstate.h:36
@ AST_STATE_RESERVED
Definition: channelstate.h:37
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
int ast_max_forwards_decrement(struct ast_channel *chan)
Decrement the max forwards count for a particular channel.
Definition: max_forwards.c:135
static char * restore_dialstring(struct ast_channel *chan)
Retrieve the dialstring from the channel datastore.
int stasis_app_control_dial(struct stasis_app_control *control, const char *dialstring, unsigned int timeout)
Dial a channel.
Definition: control.c:1696
int transit_network_select
Transit Network Select.
Definition: channel.h:399

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_response_no_content(), ast_channel_adsicpe_set(), ast_channel_caller(), ast_channel_cleanup, ast_channel_connected(), ast_channel_datastore_inherit(), ast_channel_dialed(), ast_channel_get_by_name(), ast_channel_inherit_variables(), ast_channel_language(), ast_channel_lock, ast_channel_lock_both, ast_channel_musicclass(), ast_channel_redirecting(), ast_channel_req_accountcodes(), AST_CHANNEL_REQUESTOR_BRIDGE_PEER, ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_transfercapability(), ast_channel_transfercapability_set(), ast_channel_unlock, ast_connected_line_copy_from_caller(), ast_max_forwards_decrement(), ast_party_redirecting_copy(), AST_STATE_DOWN, AST_STATE_RESERVED, ast_strdupa, ast_strlen_zero(), find_control(), NULL, RAII_VAR, restore_dialstring(), stasis_app_control_dial(), and ast_party_dialed::transit_network_select.

Referenced by ast_ari_channels_dial_cb().

◆ ast_ari_channels_dial_parse_body()

int ast_ari_channels_dial_parse_body ( struct ast_json body,
struct ast_ari_channels_dial_args args 
)

Body parsing function for /channels/{channelId}/dial.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2723 of file res_ari_channels.c.

2726{
2727 struct ast_json *field;
2728 /* Parse query parameters out of it */
2729 field = ast_json_object_get(body, "caller");
2730 if (field) {
2731 args->caller = ast_json_string_get(field);
2732 }
2733 field = ast_json_object_get(body, "timeout");
2734 if (field) {
2735 args->timeout = ast_json_integer_get(field);
2736 }
2737 return 0;
2738}

References args, ast_json_integer_get(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_dial_cb().

◆ ast_ari_channels_external_media()

void ast_ari_channels_external_media ( struct ast_variable headers,
struct ast_ari_channels_external_media_args args,
struct ast_ari_response response 
)

Start an External Media session.

Create a channel to an External Media source/sink. The combination of transport and encapsulation will select one of chan_rtp(udp/rtp), chan_audiosocket(tcp/audiosocket) or chan_websocket(websocket/none) channel drivers.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 2233 of file resource_channels.c.

2235{
2236 RAII_VAR(struct ast_variable *, variables, NULL, ast_variables_destroy);
2237 char *external_host;
2238 char *host = NULL;
2239 char *port = NULL;
2240
2241 ast_assert(response != NULL);
2242
2243 /* Parse any query parameters out of the body parameter */
2244 if (args->variables) {
2245 struct ast_json *json_variables;
2246
2248 json_variables = ast_json_object_get(args->variables, "variables");
2249 if (json_variables
2250 && json_to_ast_variables(response, json_variables, &variables)) {
2251 return;
2252 }
2253 }
2254
2255 if (ast_strlen_zero(args->app)) {
2256 ast_ari_response_error(response, 400, "Bad Request", "app cannot be empty");
2257 return;
2258 }
2259
2260 if (ast_strlen_zero(args->transport)) {
2261 args->transport = "udp";
2262 }
2263
2264 if (ast_strlen_zero(args->encapsulation)) {
2265 args->encapsulation = "rtp";
2266 }
2267 if (ast_strings_equal(args->transport, "websocket")) {
2268 if (!ast_strings_equal(args->encapsulation, "none")) {
2269 ast_ari_response_error(response, 400, "Bad Request", "encapsulation must be 'none' for websocket transport");
2270 return;
2271 }
2272 }
2273
2274 if (ast_strings_equal(args->encapsulation, "rtp")) {
2275 if (!ast_strings_equal(args->transport, "udp")) {
2276 ast_ari_response_error(response, 400, "Bad Request", "transport must be 'udp' for rtp encapsulation");
2277 return;
2278 }
2279 }
2280
2281 if (ast_strings_equal(args->encapsulation, "audiosocket")) {
2282 if (!ast_strings_equal(args->transport, "tcp")) {
2283 ast_ari_response_error(response, 400, "Bad Request", "transport must be 'tcp' for audiosocket encapsulation");
2284 return;
2285 }
2286 }
2287
2288 if (ast_strlen_zero(args->connection_type)) {
2289 args->connection_type = "client";
2290 }
2291 if (!ast_strings_equal(args->transport, "websocket")) {
2292 if (ast_strings_equal(args->connection_type, "server")) {
2293 ast_ari_response_error(response, 400, "Bad Request", "'server' connection_type can only be used with the websocket transport");
2294 return;
2295 }
2296 }
2297
2298 if (ast_strlen_zero(args->external_host)) {
2299 if (ast_strings_equal(args->connection_type, "client")) {
2300 ast_ari_response_error(response, 400, "Bad Request", "external_host is required for all but websocket server connections");
2301 return;
2302 } else {
2303 /* server is only valid for websocket, enforced above */
2304 args->external_host = "INCOMING";
2305 }
2306 }
2307
2308 if (ast_strings_equal(args->transport, "websocket")) {
2309 if (ast_strings_equal(args->connection_type, "client")) {
2310 struct ast_websocket_client *ws_client =
2312 ao2_cleanup(ws_client);
2313 if (!ws_client) {
2314 ast_ari_response_error(response, 400, "Bad Request", "external_host must be a valid websocket_client connection id.");
2315 return;
2316 }
2317 }
2318 } else {
2319 external_host = ast_strdupa(args->external_host);
2320 if (!ast_sockaddr_split_hostport(external_host, &host, &port, PARSE_PORT_REQUIRE)) {
2321 ast_ari_response_error(response, 400, "Bad Request", "external_host must be <host>:<port> for all transports other than websocket");
2322 return;
2323 }
2324 }
2325
2326 if (ast_strlen_zero(args->format)) {
2327 ast_ari_response_error(response, 400, "Bad Request", "format cannot be empty");
2328 return;
2329 }
2330
2331 if (ast_strlen_zero(args->direction)) {
2332 args->direction = "both";
2333 }
2334
2335 if (strcasecmp(args->encapsulation, "rtp") == 0 && strcasecmp(args->transport, "udp") == 0) {
2336 if (external_media_rtp_udp(args, variables, response)) {
2338 response, 500, "Internal Server Error",
2339 "An internal error prevented this request from being handled");
2340 }
2341 } else if (strcasecmp(args->encapsulation, "audiosocket") == 0 && strcasecmp(args->transport, "tcp") == 0) {
2342 if (external_media_audiosocket_tcp(args, variables, response)) {
2344 response, 500, "Internal Server Error",
2345 "An internal error prevented this request from being handled");
2346 }
2347 } else if (strcasecmp(args->encapsulation, "none") == 0 && strcasecmp(args->transport, "websocket") == 0) {
2348 if (external_media_websocket(args, variables, response)) {
2350 response, 500, "Internal Server Error",
2351 "An internal error prevented this request from being handled");
2352 }
2353 } else {
2355 response, 501, "Not Implemented",
2356 "The encapsulation and/or transport is not supported");
2357 }
2358}
@ PARSE_PORT_REQUIRE
int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
Definition: netsock2.c:164
static int external_media_audiosocket_tcp(struct ast_ari_channels_external_media_args *args, struct ast_variable *variables, struct ast_ari_response *response)
static int external_media_websocket(struct ast_ari_channels_external_media_args *args, struct ast_variable *variables, struct ast_ari_response *response)
static int external_media_rtp_udp(struct ast_ari_channels_external_media_args *args, struct ast_variable *variables, struct ast_ari_response *response)
int ast_ari_channels_external_media_parse_body(struct ast_json *body, struct ast_ari_channels_external_media_args *args)
Body parsing function for /channels/externalMedia.
int ast_strings_equal(const char *str1, const char *str2)
Compare strings for equality checking for NULL.
Definition: strings.c:238
struct ast_websocket_client * ast_websocket_client_retrieve_by_id(const char *id)
Retrieve a websocket client object by ID.

References ao2_cleanup, args, ast_ari_channels_external_media_parse_body(), ast_ari_response_error(), ast_assert, ast_json_object_get(), ast_sockaddr_split_hostport(), ast_strdupa, ast_strings_equal(), ast_strlen_zero(), ast_variables_destroy(), ast_websocket_client_retrieve_by_id(), external_media_audiosocket_tcp(), external_media_rtp_udp(), external_media_websocket(), json_to_ast_variables(), NULL, PARSE_PORT_REQUIRE, and RAII_VAR.

Referenced by ast_ari_channels_external_media_cb().

◆ ast_ari_channels_external_media_parse_body()

int ast_ari_channels_external_media_parse_body ( struct ast_json body,
struct ast_ari_channels_external_media_args args 
)

Body parsing function for /channels/externalMedia.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2874 of file res_ari_channels.c.

2877{
2878 struct ast_json *field;
2879 /* Parse query parameters out of it */
2880 field = ast_json_object_get(body, "channelId");
2881 if (field) {
2882 args->channel_id = ast_json_string_get(field);
2883 }
2884 field = ast_json_object_get(body, "app");
2885 if (field) {
2886 args->app = ast_json_string_get(field);
2887 }
2888 field = ast_json_object_get(body, "external_host");
2889 if (field) {
2890 args->external_host = ast_json_string_get(field);
2891 }
2892 field = ast_json_object_get(body, "encapsulation");
2893 if (field) {
2894 args->encapsulation = ast_json_string_get(field);
2895 }
2896 field = ast_json_object_get(body, "transport");
2897 if (field) {
2898 args->transport = ast_json_string_get(field);
2899 }
2900 field = ast_json_object_get(body, "connection_type");
2901 if (field) {
2902 args->connection_type = ast_json_string_get(field);
2903 }
2904 field = ast_json_object_get(body, "format");
2905 if (field) {
2906 args->format = ast_json_string_get(field);
2907 }
2908 field = ast_json_object_get(body, "direction");
2909 if (field) {
2910 args->direction = ast_json_string_get(field);
2911 }
2912 field = ast_json_object_get(body, "data");
2913 if (field) {
2914 args->data = ast_json_string_get(field);
2915 }
2916 return 0;
2917}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_external_media().

◆ ast_ari_channels_get()

void ast_ari_channels_get ( struct ast_variable headers,
struct ast_ari_channels_get_args args,
struct ast_ari_response response 
)

Channel details.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 889 of file resource_channels.c.

892{
893 struct ast_channel_snapshot *snapshot;
894
895 snapshot = ast_channel_snapshot_get_latest(args->channel_id);
896 if (!snapshot) {
898 response, 404, "Not Found",
899 "Channel not found");
900 return;
901 }
902
903 ast_ari_response_ok(response,
905 ao2_ref(snapshot, -1);
906}

References ao2_ref, args, ast_ari_response_error(), ast_ari_response_ok(), ast_channel_snapshot_get_latest(), ast_channel_snapshot_to_json(), and NULL.

Referenced by ast_ari_channels_get_cb().

◆ ast_ari_channels_get_channel_var()

void ast_ari_channels_get_channel_var ( struct ast_variable headers,
struct ast_ari_channels_get_channel_var_args args,
struct ast_ari_response response 
)

Get the value of a channel variable or function.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1473 of file resource_channels.c.

1476{
1477 RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
1478 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
1479 RAII_VAR(struct ast_str *, value, ast_str_create(32), ast_free);
1480 RAII_VAR(struct ast_channel *, channel, NULL, ast_channel_cleanup);
1481
1482 ast_assert(response != NULL);
1483
1484 if (!value) {
1486 return;
1487 }
1488
1489 if (ast_strlen_zero(args->variable)) {
1491 response, 400, "Bad Request",
1492 "Variable name is required");
1493 return;
1494 }
1495
1496 if (ast_strlen_zero(args->channel_id)) {
1498 response, 400, "Bad Request",
1499 "Channel ID is required");
1500 return;
1501 }
1502
1503 channel = ast_channel_get_by_name(args->channel_id);
1504 if (!channel) {
1506 response, 404, "Channel Not Found",
1507 "Provided channel was not found");
1508 return;
1509 }
1510
1511 /* You may be tempted to lock the channel you're about to read from. You
1512 * would be wrong. Some dialplan functions put the channel into
1513 * autoservice, which deadlocks if the channel is already locked.
1514 * ast_str_retrieve_variable() does its own locking, and the dialplan
1515 * functions need to as well. We should be fine without the lock.
1516 */
1517
1518 if (args->variable[strlen(args->variable) - 1] == ')') {
1519 if (ast_func_read2(channel, args->variable, &value, 0)) {
1521 response, 500, "Error With Function",
1522 "Unable to read provided function");
1523 return;
1524 }
1525 } else {
1526 if (!ast_str_retrieve_variable(&value, 0, channel, NULL, args->variable)) {
1528 response, 404, "Variable Not Found",
1529 "Provided variable was not found");
1530 return;
1531 }
1532 }
1533
1534 if (!(json = ast_json_pack("{s: s}", "value", S_OR(ast_str_buffer(value), "")))) {
1536 return;
1537 }
1538
1539 ast_ari_response_ok(response, ast_json_ref(json));
1540}
#define ast_free(a)
Definition: astmm.h:180
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:612
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Definition: json.c:67
int ast_func_read2(struct ast_channel *chan, const char *function, struct ast_str **str, ssize_t maxlen)
executes a read operation on a function
const char * ast_str_retrieve_variable(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, struct varshead *headp, const char *var)
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
Support for dynamic strings.
Definition: strings.h:623
int value
Definition: syslog.c:37

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_error(), ast_ari_response_ok(), ast_assert, ast_channel_cleanup, ast_channel_get_by_name(), ast_free, ast_func_read2(), ast_json_pack(), ast_json_ref(), ast_json_unref(), ast_str_buffer(), ast_str_create, ast_str_retrieve_variable(), ast_strlen_zero(), NULL, RAII_VAR, S_OR, and value.

Referenced by ast_ari_channels_get_channel_var_cb().

◆ ast_ari_channels_get_channel_var_parse_body()

int ast_ari_channels_get_channel_var_parse_body ( struct ast_json body,
struct ast_ari_channels_get_channel_var_args args 
)

Body parsing function for /channels/{channelId}/variable.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2326 of file res_ari_channels.c.

2329{
2330 struct ast_json *field;
2331 /* Parse query parameters out of it */
2332 field = ast_json_object_get(body, "variable");
2333 if (field) {
2334 args->variable = ast_json_string_get(field);
2335 }
2336 return 0;
2337}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_get_channel_var_cb().

◆ ast_ari_channels_hangup()

void ast_ari_channels_hangup ( struct ast_variable headers,
struct ast_ari_channels_hangup_args args,
struct ast_ari_response response 
)

Delete (i.e. hangup) a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 908 of file resource_channels.c.

911{
912 RAII_VAR(struct ast_channel *, chan, NULL, ao2_cleanup);
913 int cause;
914
915 chan = ast_channel_get_by_name(args->channel_id);
916 if (chan == NULL) {
918 response, 404, "Not Found",
919 "Channel not found");
920 return;
921 }
922
923 if (!ast_strlen_zero(args->reason) && !ast_strlen_zero(args->reason_code)) {
924 ast_ari_response_error(response, 400, "Bad Request",
925 "The reason and reason_code can't both be specified");
926 return;
927 }
928
929 if (!ast_strlen_zero(args->reason_code)) {
930 /* reason_code allows any hangup code */
931 if (sscanf(args->reason_code, "%30d", &cause) != 1) {
933 response, 400, "Invalid Reason Code",
934 "Invalid reason for hangup reason code provided");
935 return;
936 }
937 } else if (!ast_strlen_zero(args->reason)) {
938 /* reason allows only listed hangup reason */
939 cause = convert_reason_to_hangup_code(args->reason);
940 if (cause == -1) {
942 response, 400, "Invalid Reason",
943 "Invalid reason for hangup reason provided");
944 return;
945 }
946 } else {
947 /* not specified. set default hangup */
948 cause = AST_CAUSE_NORMAL;
949 }
950
951 ast_channel_hangupcause_set(chan, cause);
953
955}
#define AST_CAUSE_NORMAL
Definition: causes.h:151
@ AST_SOFTHANGUP_EXPLICIT
Definition: channel.h:1168
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup up a channel.
Definition: channel.c:2440
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
static int convert_reason_to_hangup_code(const char *reason)
Return the corresponded hangup code of the given reason.

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), AST_CAUSE_NORMAL, ast_channel_get_by_name(), ast_channel_hangupcause_set(), ast_softhangup(), AST_SOFTHANGUP_EXPLICIT, ast_strlen_zero(), convert_reason_to_hangup_code(), NULL, and RAII_VAR.

Referenced by ast_ari_channels_hangup_cb().

◆ ast_ari_channels_hangup_parse_body()

int ast_ari_channels_hangup_parse_body ( struct ast_json body,
struct ast_ari_channels_hangup_args args 
)

Body parsing function for /channels/{channelId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 602 of file res_ari_channels.c.

605{
606 struct ast_json *field;
607 /* Parse query parameters out of it */
608 field = ast_json_object_get(body, "reason_code");
609 if (field) {
610 args->reason_code = ast_json_string_get(field);
611 }
612 field = ast_json_object_get(body, "reason");
613 if (field) {
614 args->reason = ast_json_string_get(field);
615 }
616 return 0;
617}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_hangup_cb().

◆ ast_ari_channels_hold()

void ast_ari_channels_hold ( struct ast_variable headers,
struct ast_ari_channels_hold_args args,
struct ast_ari_response response 
)

Hold a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 515 of file resource_channels.c.

518{
519 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
520
521 control = find_control(response, args->channel_id);
522 if (control == NULL) {
523 /* Response filled in by find_control */
524 return;
525 }
526
527 if (channel_state_invalid(control, response)) {
528 return;
529 }
530
532
534}
void stasis_app_control_hold(struct stasis_app_control *control)
Place the channel associated with the control on hold.
Definition: control.c:774

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_hold().

Referenced by ast_ari_channels_hold_cb().

◆ ast_ari_channels_list()

void ast_ari_channels_list ( struct ast_variable headers,
struct ast_ari_channels_list_args args,
struct ast_ari_response response 
)

List all active channels in Asterisk.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 957 of file resource_channels.c.

960{
961 RAII_VAR(struct ao2_container *, snapshots, NULL, ao2_cleanup);
962 RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
963 struct ao2_iterator i;
964 void *obj;
966
967 snapshots = ast_channel_cache_all();
968
969 json = ast_json_array_create();
970 if (!json) {
972 return;
973 }
974
975 i = ao2_iterator_init(snapshots, 0);
976 while ((obj = ao2_iterator_next(&i))) {
977 struct ast_channel_snapshot *snapshot = obj;
978 int r;
979
980 if (sanitize && sanitize->channel_snapshot
981 && sanitize->channel_snapshot(snapshot)) {
982 ao2_ref(snapshot, -1);
983 continue;
984 }
985
987 json, ast_channel_snapshot_to_json(snapshot, NULL));
988 if (r != 0) {
991 ao2_ref(snapshot, -1);
992 return;
993 }
994 ao2_ref(snapshot, -1);
995 }
997
998 ast_ari_response_ok(response, ast_json_ref(json));
999}
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
struct ao2_container * ast_channel_cache_all(void)
int ast_json_array_append(struct ast_json *array, struct ast_json *value)
Append to an array.
Definition: json.c:378
struct ast_json * ast_json_array_create(void)
Create a empty JSON array.
Definition: json.c:362
struct stasis_message_sanitizer * stasis_app_get_sanitizer(void)
Get the Stasis message sanitizer for app_stasis applications.
Definition: res_stasis.c:2343
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
Structure containing callbacks for Stasis message sanitization.
Definition: stasis.h:200
int(* channel_snapshot)(const struct ast_channel_snapshot *snapshot)
Callback which determines whether a channel should be sanitized from a message based on the channel's...
Definition: stasis.h:221

References ao2_cleanup, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_ari_response_alloc_failed(), ast_ari_response_ok(), ast_channel_cache_all(), ast_channel_snapshot_to_json(), ast_json_array_append(), ast_json_array_create(), ast_json_ref(), ast_json_unref(), stasis_message_sanitizer::channel_snapshot, NULL, RAII_VAR, and stasis_app_get_sanitizer().

Referenced by ast_ari_channels_list_cb().

◆ ast_ari_channels_move()

void ast_ari_channels_move ( struct ast_variable headers,
struct ast_ari_channels_move_args args,
struct ast_ari_response response 
)

Move the channel from one Stasis application to another.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 257 of file resource_channels.c.

260{
261 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
262
263 control = find_control(response, args->channel_id);
264 if (!control) {
265 return;
266 }
267
268 if (stasis_app_control_move(control, args->app, args->app_args)) {
269 ast_ari_response_error(response, 500, "Internal Server Error",
270 "Failed to switch Stasis applications");
271 return;
272 }
273
275}
int stasis_app_control_move(struct stasis_app_control *control, const char *app_name, const char *app_args)
Exit res_stasis and move to another Stasis application.
Definition: control.c:477

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), find_control(), NULL, RAII_VAR, and stasis_app_control_move().

Referenced by ast_ari_channels_move_cb().

◆ ast_ari_channels_move_parse_body()

int ast_ari_channels_move_parse_body ( struct ast_json body,
struct ast_ari_channels_move_args args 
)

Body parsing function for /channels/{channelId}/move.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 799 of file res_ari_channels.c.

802{
803 struct ast_json *field;
804 /* Parse query parameters out of it */
805 field = ast_json_object_get(body, "app");
806 if (field) {
807 args->app = ast_json_string_get(field);
808 }
809 field = ast_json_object_get(body, "appArgs");
810 if (field) {
811 args->app_args = ast_json_string_get(field);
812 }
813 return 0;
814}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_move_cb().

◆ ast_ari_channels_mute()

void ast_ari_channels_mute ( struct ast_variable headers,
struct ast_ari_channels_mute_args args,
struct ast_ari_response response 
)

Mute a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 404 of file resource_channels.c.

407{
408 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
409 unsigned int direction = 0;
410 enum ast_frame_type frametype = AST_FRAME_VOICE;
411
412 control = find_control(response, args->channel_id);
413 if (control == NULL) {
414 return;
415 }
416
417 if (channel_state_invalid(control, response)) {
418 return;
419 }
420
421 if (ast_strlen_zero(args->direction)) {
423 response, 400, "Bad Request",
424 "Direction is required");
425 return;
426 }
427
428 if (!strcmp(args->direction, "in")) {
430 } else if (!strcmp(args->direction, "out")) {
432 } else if (!strcmp(args->direction, "both")) {
434 } else {
436 response, 400, "Bad Request",
437 "Invalid direction specified");
438 return;
439 }
440
441 stasis_app_control_mute(control, direction, frametype);
442
444}
#define AST_MUTE_DIRECTION_READ
Definition: channel.h:4790
#define AST_MUTE_DIRECTION_WRITE
Definition: channel.h:4791
direction
ast_frame_type
Frame types.
@ AST_FRAME_VOICE
int stasis_app_control_mute(struct stasis_app_control *control, unsigned int direction, enum ast_frame_type frametype)
Mute the channel associated with this control.
Definition: control.c:657

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), AST_FRAME_VOICE, AST_MUTE_DIRECTION_READ, AST_MUTE_DIRECTION_WRITE, ast_strlen_zero(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_mute().

Referenced by ast_ari_channels_mute_cb().

◆ ast_ari_channels_mute_parse_body()

int ast_ari_channels_mute_parse_body ( struct ast_json body,
struct ast_ari_channels_mute_args args 
)

Body parsing function for /channels/{channelId}/mute.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1277 of file res_ari_channels.c.

1280{
1281 struct ast_json *field;
1282 /* Parse query parameters out of it */
1283 field = ast_json_object_get(body, "direction");
1284 if (field) {
1285 args->direction = ast_json_string_get(field);
1286 }
1287 return 0;
1288}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_mute_cb().

◆ ast_ari_channels_originate()

void ast_ari_channels_originate ( struct ast_variable headers,
struct ast_ari_channels_originate_args args,
struct ast_ari_response response 
)

Create a new channel (originate).

The new channel is created immediately and a snapshot of it returned. If a Stasis application is provided it will be automatically subscribed to the originated channel for further events and updates.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1434 of file resource_channels.c.

1437{
1438 struct ast_variable *variables = NULL;
1439 struct ast_channel *chan;
1440
1441 /* Parse any query parameters out of the body parameter */
1442 if (args->variables) {
1443 struct ast_json *json_variables;
1444
1446 json_variables = ast_json_object_get(args->variables, "variables");
1447 if (json_variables
1448 && json_to_ast_variables(response, json_variables, &variables)) {
1449 return;
1450 }
1451 }
1452
1454 args->endpoint,
1455 args->extension,
1456 args->context,
1457 args->priority,
1458 args->label,
1459 args->app,
1460 args->app_args,
1461 args->caller_id,
1462 args->timeout,
1463 variables,
1464 args->channel_id,
1465 args->other_channel_id,
1466 args->originator,
1467 args->formats,
1468 response);
1469 ast_channel_cleanup(chan);
1470 ast_variables_destroy(variables);
1471}
static struct ast_channel * ari_channels_handle_originate_with_id(const char *args_endpoint, const char *args_extension, const char *args_context, long args_priority, const char *args_label, const char *args_app, const char *args_app_args, const char *args_caller_id, int args_timeout, struct ast_variable *variables, const char *args_channel_id, const char *args_other_channel_id, const char *args_originator, const char *args_formats, struct ast_ari_response *response)
int ast_ari_channels_originate_parse_body(struct ast_json *body, struct ast_ari_channels_originate_args *args)
Body parsing function for /channels.

References args, ari_channels_handle_originate_with_id(), ast_ari_channels_originate_parse_body(), ast_channel_cleanup, ast_json_object_get(), ast_variables_destroy(), json_to_ast_variables(), and NULL.

Referenced by ast_ari_channels_originate_cb().

◆ ast_ari_channels_originate_parse_body()

int ast_ari_channels_originate_parse_body ( struct ast_json body,
struct ast_ari_channels_originate_args args 
)

Body parsing function for /channels.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 109 of file res_ari_channels.c.

112{
113 struct ast_json *field;
114 /* Parse query parameters out of it */
115 field = ast_json_object_get(body, "endpoint");
116 if (field) {
117 args->endpoint = ast_json_string_get(field);
118 }
119 field = ast_json_object_get(body, "extension");
120 if (field) {
121 args->extension = ast_json_string_get(field);
122 }
123 field = ast_json_object_get(body, "context");
124 if (field) {
125 args->context = ast_json_string_get(field);
126 }
127 field = ast_json_object_get(body, "priority");
128 if (field) {
129 args->priority = ast_json_integer_get(field);
130 }
131 field = ast_json_object_get(body, "label");
132 if (field) {
133 args->label = ast_json_string_get(field);
134 }
135 field = ast_json_object_get(body, "app");
136 if (field) {
137 args->app = ast_json_string_get(field);
138 }
139 field = ast_json_object_get(body, "appArgs");
140 if (field) {
141 args->app_args = ast_json_string_get(field);
142 }
143 field = ast_json_object_get(body, "callerId");
144 if (field) {
145 args->caller_id = ast_json_string_get(field);
146 }
147 field = ast_json_object_get(body, "timeout");
148 if (field) {
149 args->timeout = ast_json_integer_get(field);
150 }
151 field = ast_json_object_get(body, "channelId");
152 if (field) {
153 args->channel_id = ast_json_string_get(field);
154 }
155 field = ast_json_object_get(body, "otherChannelId");
156 if (field) {
157 args->other_channel_id = ast_json_string_get(field);
158 }
159 field = ast_json_object_get(body, "originator");
160 if (field) {
161 args->originator = ast_json_string_get(field);
162 }
163 field = ast_json_object_get(body, "formats");
164 if (field) {
165 args->formats = ast_json_string_get(field);
166 }
167 return 0;
168}

References args, ast_json_integer_get(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_originate().

◆ ast_ari_channels_originate_with_id()

void ast_ari_channels_originate_with_id ( struct ast_variable headers,
struct ast_ari_channels_originate_with_id_args args,
struct ast_ari_response response 
)

Create a new channel (originate with id).

The new channel is created immediately and a snapshot of it returned. If a Stasis application is provided it will be automatically subscribed to the originated channel for further events and updates.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1395 of file resource_channels.c.

1398{
1399 struct ast_variable *variables = NULL;
1400 struct ast_channel *chan;
1401
1402 /* Parse any query parameters out of the body parameter */
1403 if (args->variables) {
1404 struct ast_json *json_variables;
1405
1407 json_variables = ast_json_object_get(args->variables, "variables");
1408 if (json_variables
1409 && json_to_ast_variables(response, json_variables, &variables)) {
1410 return;
1411 }
1412 }
1413
1415 args->endpoint,
1416 args->extension,
1417 args->context,
1418 args->priority,
1419 args->label,
1420 args->app,
1421 args->app_args,
1422 args->caller_id,
1423 args->timeout,
1424 variables,
1425 args->channel_id,
1426 args->other_channel_id,
1427 args->originator,
1428 args->formats,
1429 response);
1430 ast_channel_cleanup(chan);
1431 ast_variables_destroy(variables);
1432}
int ast_ari_channels_originate_with_id_parse_body(struct ast_json *body, struct ast_ari_channels_originate_with_id_args *args)
Body parsing function for /channels/{channelId}.

References args, ari_channels_handle_originate_with_id(), ast_ari_channels_originate_with_id_parse_body(), ast_channel_cleanup, ast_json_object_get(), ast_variables_destroy(), json_to_ast_variables(), and NULL.

Referenced by ast_ari_channels_originate_with_id_cb().

◆ ast_ari_channels_originate_with_id_parse_body()

int ast_ari_channels_originate_with_id_parse_body ( struct ast_json body,
struct ast_ari_channels_originate_with_id_args args 
)

Body parsing function for /channels/{channelId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 444 of file res_ari_channels.c.

447{
448 struct ast_json *field;
449 /* Parse query parameters out of it */
450 field = ast_json_object_get(body, "endpoint");
451 if (field) {
452 args->endpoint = ast_json_string_get(field);
453 }
454 field = ast_json_object_get(body, "extension");
455 if (field) {
456 args->extension = ast_json_string_get(field);
457 }
458 field = ast_json_object_get(body, "context");
459 if (field) {
460 args->context = ast_json_string_get(field);
461 }
462 field = ast_json_object_get(body, "priority");
463 if (field) {
464 args->priority = ast_json_integer_get(field);
465 }
466 field = ast_json_object_get(body, "label");
467 if (field) {
468 args->label = ast_json_string_get(field);
469 }
470 field = ast_json_object_get(body, "app");
471 if (field) {
472 args->app = ast_json_string_get(field);
473 }
474 field = ast_json_object_get(body, "appArgs");
475 if (field) {
476 args->app_args = ast_json_string_get(field);
477 }
478 field = ast_json_object_get(body, "callerId");
479 if (field) {
480 args->caller_id = ast_json_string_get(field);
481 }
482 field = ast_json_object_get(body, "timeout");
483 if (field) {
484 args->timeout = ast_json_integer_get(field);
485 }
486 field = ast_json_object_get(body, "otherChannelId");
487 if (field) {
488 args->other_channel_id = ast_json_string_get(field);
489 }
490 field = ast_json_object_get(body, "originator");
491 if (field) {
492 args->originator = ast_json_string_get(field);
493 }
494 field = ast_json_object_get(body, "formats");
495 if (field) {
496 args->formats = ast_json_string_get(field);
497 }
498 return 0;
499}

References args, ast_json_integer_get(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_originate_with_id().

◆ ast_ari_channels_play()

void ast_ari_channels_play ( struct ast_variable headers,
struct ast_ari_channels_play_args args,
struct ast_ari_response response 
)

Start playback of media.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 719 of file resource_channels.c.

722{
724 args->channel_id,
725 args->media,
726 args->media_count,
727 args->lang,
728 args->offsetms,
729 args->skipms,
730 args->playback_id,
731 response);
732}
static void ari_channels_handle_play(const char *args_channel_id, const char **args_media, size_t args_media_count, const char *args_lang, int args_offsetms, int args_skipms, const char *args_playback_id, struct ast_ari_response *response)

References args, and ari_channels_handle_play().

Referenced by ast_ari_channels_play_cb().

◆ ast_ari_channels_play_parse_body()

int ast_ari_channels_play_parse_body ( struct ast_json body,
struct ast_ari_channels_play_args args 
)

Body parsing function for /channels/{channelId}/play.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1842 of file res_ari_channels.c.

1845{
1846 struct ast_json *field;
1847 /* Parse query parameters out of it */
1848 field = ast_json_object_get(body, "media");
1849 if (field) {
1850 /* If they were silly enough to both pass in a query param and a
1851 * JSON body, free up the query value.
1852 */
1853 ast_free(args->media);
1854 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
1855 /* Multiple param passed as array */
1856 size_t i;
1857 args->media_count = ast_json_array_size(field);
1858 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1859
1860 if (!args->media) {
1861 return -1;
1862 }
1863
1864 for (i = 0; i < args->media_count; ++i) {
1865 args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
1866 }
1867 } else {
1868 /* Multiple param passed as single value */
1869 args->media_count = 1;
1870 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1871 if (!args->media) {
1872 return -1;
1873 }
1874 args->media[0] = ast_json_string_get(field);
1875 }
1876 }
1877 field = ast_json_object_get(body, "lang");
1878 if (field) {
1879 args->lang = ast_json_string_get(field);
1880 }
1881 field = ast_json_object_get(body, "offsetms");
1882 if (field) {
1883 args->offsetms = ast_json_integer_get(field);
1884 }
1885 field = ast_json_object_get(body, "skipms");
1886 if (field) {
1887 args->skipms = ast_json_integer_get(field);
1888 }
1889 field = ast_json_object_get(body, "playbackId");
1890 if (field) {
1891 args->playback_id = ast_json_string_get(field);
1892 }
1893 return 0;
1894}
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
enum ast_json_type ast_json_typeof(const struct ast_json *value)
Get the type of value.
Definition: json.c:78
struct ast_json * ast_json_array_get(const struct ast_json *array, size_t index)
Get an element from an array.
Definition: json.c:370
@ AST_JSON_ARRAY
Definition: json.h:165
size_t ast_json_array_size(const struct ast_json *array)
Get the size of a JSON array.
Definition: json.c:366

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_channels_play_cb().

◆ ast_ari_channels_play_with_id()

void ast_ari_channels_play_with_id ( struct ast_variable headers,
struct ast_ari_channels_play_with_id_args args,
struct ast_ari_response response 
)

Start playback of media and specify the playbackId.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 734 of file resource_channels.c.

737{
739 args->channel_id,
740 args->media,
741 args->media_count,
742 args->lang,
743 args->offsetms,
744 args->skipms,
745 args->playback_id,
746 response);
747}

References args, and ari_channels_handle_play().

Referenced by ast_ari_channels_play_with_id_cb().

◆ ast_ari_channels_play_with_id_parse_body()

int ast_ari_channels_play_with_id_parse_body ( struct ast_json body,
struct ast_ari_channels_play_with_id_args args 
)

Body parsing function for /channels/{channelId}/play/{playbackId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2022 of file res_ari_channels.c.

2025{
2026 struct ast_json *field;
2027 /* Parse query parameters out of it */
2028 field = ast_json_object_get(body, "media");
2029 if (field) {
2030 /* If they were silly enough to both pass in a query param and a
2031 * JSON body, free up the query value.
2032 */
2033 ast_free(args->media);
2034 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
2035 /* Multiple param passed as array */
2036 size_t i;
2037 args->media_count = ast_json_array_size(field);
2038 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
2039
2040 if (!args->media) {
2041 return -1;
2042 }
2043
2044 for (i = 0; i < args->media_count; ++i) {
2045 args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
2046 }
2047 } else {
2048 /* Multiple param passed as single value */
2049 args->media_count = 1;
2050 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
2051 if (!args->media) {
2052 return -1;
2053 }
2054 args->media[0] = ast_json_string_get(field);
2055 }
2056 }
2057 field = ast_json_object_get(body, "lang");
2058 if (field) {
2059 args->lang = ast_json_string_get(field);
2060 }
2061 field = ast_json_object_get(body, "offsetms");
2062 if (field) {
2063 args->offsetms = ast_json_integer_get(field);
2064 }
2065 field = ast_json_object_get(body, "skipms");
2066 if (field) {
2067 args->skipms = ast_json_integer_get(field);
2068 }
2069 return 0;
2070}

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_channels_play_with_id_cb().

◆ ast_ari_channels_record()

void ast_ari_channels_record ( struct ast_variable headers,
struct ast_ari_channels_record_args args,
struct ast_ari_response response 
)

Start a recording.

Record audio from a channel. Note that this will not capture audio sent to the channel. The bridge itself has a record feature if that's what you want.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 749 of file resource_channels.c.

752{
753 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
754 RAII_VAR(struct stasis_app_recording *, recording, NULL, ao2_cleanup);
755 RAII_VAR(char *, recording_url, NULL, ast_free);
756 struct ast_json *json;
759 RAII_VAR(char *, uri_encoded_name, NULL, ast_free);
760 size_t uri_name_maxlen;
761
762 ast_assert(response != NULL);
763
764 if (args->max_duration_seconds < 0) {
766 response, 400, "Bad Request",
767 "max_duration_seconds cannot be negative");
768 return;
769 }
770
771 if (args->max_silence_seconds < 0) {
773 response, 400, "Bad Request",
774 "max_silence_seconds cannot be negative");
775 return;
776 }
777
778 control = find_control(response, args->channel_id);
779 if (control == NULL) {
780 /* Response filled in by find_control */
781 return;
782 }
783
785 if (options == NULL) {
787 response, 500, "Internal Server Error",
788 "Out of memory");
789 }
790 ast_string_field_build(options, target, "channel:%s", args->channel_id);
791 options->max_silence_seconds = args->max_silence_seconds;
792 options->max_duration_seconds = args->max_duration_seconds;
793 options->terminate_on =
795 options->if_exists =
797 options->beep = args->beep;
798
799 if (options->terminate_on == STASIS_APP_RECORDING_TERMINATE_INVALID) {
801 response, 400, "Bad Request",
802 "terminateOn invalid");
803 return;
804 }
805
806 if (options->if_exists == AST_RECORD_IF_EXISTS_ERROR) {
808 response, 400, "Bad Request",
809 "ifExists invalid");
810 return;
811 }
812
813 if (!ast_get_format_for_file_ext(options->format)) {
815 response, 422, "Unprocessable Entity",
816 "specified format is unknown on this system");
817 return;
818 }
819
820 recording = stasis_app_control_record(control, options);
821 if (recording == NULL) {
822 switch(errno) {
823 case EINVAL:
824 /* While the arguments are invalid, we should have
825 * caught them prior to calling record.
826 */
828 response, 500, "Internal Server Error",
829 "Error parsing request");
830 break;
831 case EEXIST:
832 ast_ari_response_error(response, 409, "Conflict",
833 "Recording '%s' already exists and can not be overwritten",
834 args->name);
835 break;
836 case ENOMEM:
838 response, 500, "Internal Server Error",
839 "Out of memory");
840 break;
841 case EPERM:
843 response, 400, "Bad Request",
844 "Recording name invalid");
845 break;
846 default:
848 "Unrecognized recording error: %s\n",
849 strerror(errno));
851 response, 500, "Internal Server Error",
852 "Internal Server Error");
853 break;
854 }
855 return;
856 }
857
858 uri_name_maxlen = strlen(args->name) * 3;
859 uri_encoded_name = ast_malloc(uri_name_maxlen);
860 if (!uri_encoded_name) {
862 response, 500, "Internal Server Error",
863 "Out of memory");
864 return;
865 }
866 ast_uri_encode(args->name, uri_encoded_name, uri_name_maxlen,
868
869 if (ast_asprintf(&recording_url, "/recordings/live/%s",
870 uri_encoded_name) == -1) {
871 recording_url = NULL;
873 response, 500, "Internal Server Error",
874 "Out of memory");
875 return;
876 }
877
878 json = stasis_app_recording_to_json(recording);
879 if (!json) {
881 response, 500, "Internal Server Error",
882 "Out of memory");
883 return;
884 }
885
886 ast_ari_response_created(response, recording_url, json);
887}
void ast_ari_response_created(struct ast_ari_response *response, const char *url, struct ast_json *message)
Fill in a Created (201) ast_ari_response.
Definition: res_ari.c:258
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
struct ast_format * ast_get_format_for_file_ext(const char *file_ext)
Get the ast_format associated with the given file extension.
Definition: file.c:2014
@ AST_RECORD_IF_EXISTS_ERROR
#define LOG_WARNING
int errno
struct stasis_app_recording_options * stasis_app_recording_options_create(const char *name, const char *format)
Allocate a recording options object.
struct ast_json * stasis_app_recording_to_json(const struct stasis_app_recording *recording)
Construct a JSON model of a recording.
struct stasis_app_recording * stasis_app_control_record(struct stasis_app_control *control, struct stasis_app_recording_options *options)
Record media from a channel.
enum ast_record_if_exists stasis_app_recording_if_exists_parse(const char *str)
Parse a string into the if_exists enum.
#define STASIS_APP_RECORDING_TERMINATE_INVALID
char stasis_app_recording_termination_parse(const char *str)
Parse a string into the recording termination enum.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
Definition: stringfields.h:555
static struct test_options options
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: utils.c:723
const struct ast_flags ast_uri_http
Definition: utils.c:719

References ao2_cleanup, args, ast_ari_response_created(), ast_ari_response_error(), ast_asprintf, ast_assert, ast_free, ast_get_format_for_file_ext(), ast_log, ast_malloc, AST_RECORD_IF_EXISTS_ERROR, ast_string_field_build, ast_uri_encode(), ast_uri_http, errno, find_control(), LOG_WARNING, NULL, options, RAII_VAR, stasis_app_control_record(), stasis_app_recording_if_exists_parse(), stasis_app_recording_options_create(), STASIS_APP_RECORDING_TERMINATE_INVALID, stasis_app_recording_termination_parse(), and stasis_app_recording_to_json().

Referenced by ast_ari_channels_record_cb().

◆ ast_ari_channels_record_parse_body()

int ast_ari_channels_record_parse_body ( struct ast_json body,
struct ast_ari_channels_record_args args 
)

Body parsing function for /channels/{channelId}/record.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2198 of file res_ari_channels.c.

2201{
2202 struct ast_json *field;
2203 /* Parse query parameters out of it */
2204 field = ast_json_object_get(body, "name");
2205 if (field) {
2206 args->name = ast_json_string_get(field);
2207 }
2208 field = ast_json_object_get(body, "format");
2209 if (field) {
2210 args->format = ast_json_string_get(field);
2211 }
2212 field = ast_json_object_get(body, "maxDurationSeconds");
2213 if (field) {
2214 args->max_duration_seconds = ast_json_integer_get(field);
2215 }
2216 field = ast_json_object_get(body, "maxSilenceSeconds");
2217 if (field) {
2218 args->max_silence_seconds = ast_json_integer_get(field);
2219 }
2220 field = ast_json_object_get(body, "ifExists");
2221 if (field) {
2222 args->if_exists = ast_json_string_get(field);
2223 }
2224 field = ast_json_object_get(body, "beep");
2225 if (field) {
2226 args->beep = ast_json_is_true(field);
2227 }
2228 field = ast_json_object_get(body, "terminateOn");
2229 if (field) {
2230 args->terminate_on = ast_json_string_get(field);
2231 }
2232 return 0;
2233}
int ast_json_is_true(const struct ast_json *value)
Check if value is JSON true.
Definition: json.c:263

References args, ast_json_integer_get(), ast_json_is_true(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_record_cb().

◆ ast_ari_channels_redirect()

void ast_ari_channels_redirect ( struct ast_variable headers,
struct ast_ari_channels_redirect_args args,
struct ast_ari_response response 
)

Redirect the channel to a different location.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 277 of file resource_channels.c.

280{
281 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
282 RAII_VAR(struct ast_channel_snapshot *, chan_snapshot, NULL, ao2_cleanup);
283 char *tech;
284 char *resource;
285 int tech_len;
286
287 control = find_control(response, args->channel_id);
288 if (!control) {
289 return;
290 }
291
292 if (channel_state_invalid(control, response)) {
293 return;
294 }
295
296 if (ast_strlen_zero(args->endpoint)) {
297 ast_ari_response_error(response, 400, "Not Found",
298 "Required parameter 'endpoint' not provided.");
299 return;
300 }
301
302 tech = ast_strdupa(args->endpoint);
303 if (!(resource = strchr(tech, '/')) || !(tech_len = resource - tech)) {
304 ast_ari_response_error(response, 422, "Unprocessable Entity",
305 "Endpoint parameter '%s' does not contain tech/resource", args->endpoint);
306 return;
307 }
308
309 *resource++ = '\0';
310 if (ast_strlen_zero(resource)) {
311 ast_ari_response_error(response, 422, "Unprocessable Entity",
312 "No resource provided in endpoint parameter '%s'", args->endpoint);
313 return;
314 }
315
316 chan_snapshot = ast_channel_snapshot_get_latest(args->channel_id);
317 if (!chan_snapshot) {
318 ast_ari_response_error(response, 500, "Internal Server Error",
319 "Unable to find channel snapshot for '%s'", args->channel_id);
320 return;
321 }
322
323 if (strncasecmp(chan_snapshot->base->type, tech, tech_len)) {
324 ast_ari_response_error(response, 422, "Unprocessable Entity",
325 "Endpoint technology '%s' does not match channel technology '%s'",
326 tech, chan_snapshot->base->type);
327 return;
328 }
329
330 if (stasis_app_control_redirect(control, resource)) {
331 ast_ari_response_error(response, 500, "Internal Server Error",
332 "Failed to redirect channel");
333 return;
334 }
335
337}
int stasis_app_control_redirect(struct stasis_app_control *control, const char *endpoint)
Redirect a channel in res_stasis to a particular endpoint.
Definition: control.c:526

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_channel_snapshot_get_latest(), ast_strdupa, ast_strlen_zero(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_redirect().

Referenced by ast_ari_channels_redirect_cb().

◆ ast_ari_channels_redirect_parse_body()

int ast_ari_channels_redirect_parse_body ( struct ast_json body,
struct ast_ari_channels_redirect_args args 
)

Body parsing function for /channels/{channelId}/redirect.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 890 of file res_ari_channels.c.

893{
894 struct ast_json *field;
895 /* Parse query parameters out of it */
896 field = ast_json_object_get(body, "endpoint");
897 if (field) {
898 args->endpoint = ast_json_string_get(field);
899 }
900 return 0;
901}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_redirect_cb().

◆ ast_ari_channels_ring()

void ast_ari_channels_ring ( struct ast_variable headers,
struct ast_ari_channels_ring_args args,
struct ast_ari_response response 
)

Indicate ringing to a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 364 of file resource_channels.c.

367{
368 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
369
370 control = find_control(response, args->channel_id);
371 if (control == NULL) {
372 return;
373 }
374
375 if (channel_state_invalid(control, response)) {
376 return;
377 }
378
380
382}
int stasis_app_control_ring(struct stasis_app_control *control)
Indicate ringing to the channel associated with this control.
Definition: control.c:618

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_ring().

Referenced by ast_ari_channels_ring_cb().

◆ ast_ari_channels_ring_stop()

void ast_ari_channels_ring_stop ( struct ast_variable headers,
struct ast_ari_channels_ring_stop_args args,
struct ast_ari_response response 
)

Stop ringing indication on a channel if locally generated.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 384 of file resource_channels.c.

387{
388 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
389
390 control = find_control(response, args->channel_id);
391 if (control == NULL) {
392 return;
393 }
394
395 if (channel_state_invalid(control, response)) {
396 return;
397 }
398
400
402}
int stasis_app_control_ring_stop(struct stasis_app_control *control)
Stop locally generated ringing on the channel associated with this control.
Definition: control.c:633

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_ring_stop().

Referenced by ast_ari_channels_ring_stop_cb().

◆ ast_ari_channels_rtpstatistics()

void ast_ari_channels_rtpstatistics ( struct ast_variable headers,
struct ast_ari_channels_rtpstatistics_args args,
struct ast_ari_response response 
)

RTP stats on a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 2029 of file resource_channels.c.

2032{
2033 RAII_VAR(struct ast_channel *, chan, NULL, ast_channel_cleanup);
2034 RAII_VAR(struct ast_rtp_instance *, rtp, NULL, ao2_cleanup);
2035 struct ast_json *j_res;
2036 const struct ast_channel_tech *tech;
2037 struct ast_rtp_glue *glue;
2038
2039 chan = ast_channel_get_by_name(args->channel_id);
2040 if (!chan) {
2041 ast_ari_response_error(response, 404, "Not Found",
2042 "Channel not found");
2043 return;
2044 }
2045
2046 ast_channel_lock(chan);
2047 tech = ast_channel_tech(chan);
2048 if (!tech) {
2049 ast_channel_unlock(chan);
2050 ast_ari_response_error(response, 404, "Not Found",
2051 "Channel's tech not found");
2052 return;
2053 }
2054
2055 glue = ast_rtp_instance_get_glue(tech->type);
2056 if (!glue) {
2057 ast_channel_unlock(chan);
2058 ast_ari_response_error(response, 403, "Forbidden",
2059 "Unsupported channel type");
2060 return;
2061 }
2062
2063 glue->get_rtp_info(chan, &rtp);
2064 if (!rtp) {
2065 ast_channel_unlock(chan);
2066 ast_ari_response_error(response, 404, "Not Found",
2067 "RTP info not found");
2068 return;
2069 }
2070
2072 if (!j_res) {
2073 ast_channel_unlock(chan);
2074 ast_ari_response_error(response, 404, "Not Found",
2075 "Statistics not found");
2076 return;
2077 }
2078
2079 ast_channel_unlock(chan);
2080 ast_ari_response_ok(response, j_res);
2081
2082 return;
2083}
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
struct ast_json * ast_rtp_instance_get_stats_all_json(struct ast_rtp_instance *instance)
Retrieve statistics about an RTP instance in json format.
Definition: rtp_engine.c:4271
struct ast_rtp_glue * ast_rtp_instance_get_glue(const char *type)
Get the RTP glue that binds a channel to the RTP engine.
Definition: rtp_engine.c:2388
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition: channel.h:648
const char *const type
Definition: channel.h:649
enum ast_rtp_glue_result(* get_rtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance)
Callback for retrieving the RTP instance carrying audio.
Definition: rtp_engine.h:787

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_channel_cleanup, ast_channel_get_by_name(), ast_channel_lock, ast_channel_tech(), ast_channel_unlock, ast_rtp_instance_get_glue(), ast_rtp_instance_get_stats_all_json(), ast_rtp_glue::get_rtp_info, NULL, RAII_VAR, and ast_channel_tech::type.

Referenced by ast_ari_channels_rtpstatistics_cb().

◆ ast_ari_channels_send_dtmf()

void ast_ari_channels_send_dtmf ( struct ast_variable headers,
struct ast_ari_channels_send_dtmf_args args,
struct ast_ari_response response 
)

Send provided DTMF to a given channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 488 of file resource_channels.c.

491{
492 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
493
494 control = find_control(response, args->channel_id);
495 if (control == NULL) {
496 return;
497 }
498
499 if (channel_state_invalid(control, response)) {
500 return;
501 }
502
503 if (ast_strlen_zero(args->dtmf)) {
505 response, 400, "Bad Request",
506 "DTMF is required");
507 return;
508 }
509
510 stasis_app_control_dtmf(control, args->dtmf, args->before, args->between, args->duration, args->after);
511
513}
int stasis_app_control_dtmf(struct stasis_app_control *control, const char *dtmf, int before, int between, unsigned int duration, int after)
Send DTMF to the channel associated with this control.
Definition: control.c:591

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_strlen_zero(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_dtmf().

Referenced by ast_ari_channels_send_dtmf_cb().

◆ ast_ari_channels_send_dtmf_parse_body()

int ast_ari_channels_send_dtmf_parse_body ( struct ast_json body,
struct ast_ari_channels_send_dtmf_args args 
)

Body parsing function for /channels/{channelId}/dtmf.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1163 of file res_ari_channels.c.

1166{
1167 struct ast_json *field;
1168 /* Parse query parameters out of it */
1169 field = ast_json_object_get(body, "dtmf");
1170 if (field) {
1171 args->dtmf = ast_json_string_get(field);
1172 }
1173 field = ast_json_object_get(body, "before");
1174 if (field) {
1175 args->before = ast_json_integer_get(field);
1176 }
1177 field = ast_json_object_get(body, "between");
1178 if (field) {
1179 args->between = ast_json_integer_get(field);
1180 }
1181 field = ast_json_object_get(body, "duration");
1182 if (field) {
1183 args->duration = ast_json_integer_get(field);
1184 }
1185 field = ast_json_object_get(body, "after");
1186 if (field) {
1187 args->after = ast_json_integer_get(field);
1188 }
1189 return 0;
1190}

References args, ast_json_integer_get(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_send_dtmf_cb().

◆ ast_ari_channels_set_channel_var()

void ast_ari_channels_set_channel_var ( struct ast_variable headers,
struct ast_ari_channels_set_channel_var_args args,
struct ast_ari_response response 
)

Set the value of a channel variable or function.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1542 of file resource_channels.c.

1545{
1546 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
1547
1548 ast_assert(response != NULL);
1549
1550 if (ast_strlen_zero(args->variable)) {
1552 response, 400, "Bad Request",
1553 "Variable name is required");
1554 return;
1555 }
1556
1557 control = find_control(response, args->channel_id);
1558 if (control == NULL) {
1559 /* response filled in by find_control */
1560 return;
1561 }
1562
1563 if (stasis_app_control_set_channel_var(control, args->variable, args->value)) {
1565 response, 400, "Bad Request",
1566 "Failed to execute function");
1567 return;
1568 }
1569
1571}
int stasis_app_control_set_channel_var(struct stasis_app_control *control, const char *variable, const char *value)
Set a variable on the channel associated with this control to value.
Definition: control.c:737

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_assert, ast_strlen_zero(), find_control(), NULL, RAII_VAR, and stasis_app_control_set_channel_var().

Referenced by ast_ari_channels_set_channel_var_cb().

◆ ast_ari_channels_set_channel_var_parse_body()

int ast_ari_channels_set_channel_var_parse_body ( struct ast_json body,
struct ast_ari_channels_set_channel_var_args args 
)

Body parsing function for /channels/{channelId}/variable.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2411 of file res_ari_channels.c.

2414{
2415 struct ast_json *field;
2416 /* Parse query parameters out of it */
2417 field = ast_json_object_get(body, "variable");
2418 if (field) {
2419 args->variable = ast_json_string_get(field);
2420 }
2421 field = ast_json_object_get(body, "value");
2422 if (field) {
2423 args->value = ast_json_string_get(field);
2424 }
2425 return 0;
2426}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_set_channel_var_cb().

◆ ast_ari_channels_snoop_channel()

void ast_ari_channels_snoop_channel ( struct ast_variable headers,
struct ast_ari_channels_snoop_channel_args args,
struct ast_ari_response response 
)

Start snooping.

Snoop (spy/whisper) on a specific channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1652 of file resource_channels.c.

1655{
1657 args->channel_id,
1658 args->spy,
1659 args->whisper,
1660 args->app,
1661 args->app_args,
1662 args->snoop_id,
1663 response);
1664}
static void ari_channels_handle_snoop_channel(const char *args_channel_id, const char *args_spy, const char *args_whisper, const char *args_app, const char *args_app_args, const char *args_snoop_id, struct ast_ari_response *response)

References args, and ari_channels_handle_snoop_channel().

Referenced by ast_ari_channels_snoop_channel_cb().

◆ ast_ari_channels_snoop_channel_parse_body()

int ast_ari_channels_snoop_channel_parse_body ( struct ast_json body,
struct ast_ari_channels_snoop_channel_args args 
)

Body parsing function for /channels/{channelId}/snoop.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2503 of file res_ari_channels.c.

2506{
2507 struct ast_json *field;
2508 /* Parse query parameters out of it */
2509 field = ast_json_object_get(body, "spy");
2510 if (field) {
2511 args->spy = ast_json_string_get(field);
2512 }
2513 field = ast_json_object_get(body, "whisper");
2514 if (field) {
2515 args->whisper = ast_json_string_get(field);
2516 }
2517 field = ast_json_object_get(body, "app");
2518 if (field) {
2519 args->app = ast_json_string_get(field);
2520 }
2521 field = ast_json_object_get(body, "appArgs");
2522 if (field) {
2523 args->app_args = ast_json_string_get(field);
2524 }
2525 field = ast_json_object_get(body, "snoopId");
2526 if (field) {
2527 args->snoop_id = ast_json_string_get(field);
2528 }
2529 return 0;
2530}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_snoop_channel_cb().

◆ ast_ari_channels_snoop_channel_with_id()

void ast_ari_channels_snoop_channel_with_id ( struct ast_variable headers,
struct ast_ari_channels_snoop_channel_with_id_args args,
struct ast_ari_response response 
)

Start snooping.

Snoop (spy/whisper) on a specific channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1666 of file resource_channels.c.

1669{
1671 args->channel_id,
1672 args->spy,
1673 args->whisper,
1674 args->app,
1675 args->app_args,
1676 args->snoop_id,
1677 response);
1678}

References args, and ari_channels_handle_snoop_channel().

Referenced by ast_ari_channels_snoop_channel_with_id_cb().

◆ ast_ari_channels_snoop_channel_with_id_parse_body()

int ast_ari_channels_snoop_channel_with_id_parse_body ( struct ast_json body,
struct ast_ari_channels_snoop_channel_with_id_args args 
)

Body parsing function for /channels/{channelId}/snoop/{snoopId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 2615 of file res_ari_channels.c.

2618{
2619 struct ast_json *field;
2620 /* Parse query parameters out of it */
2621 field = ast_json_object_get(body, "spy");
2622 if (field) {
2623 args->spy = ast_json_string_get(field);
2624 }
2625 field = ast_json_object_get(body, "whisper");
2626 if (field) {
2627 args->whisper = ast_json_string_get(field);
2628 }
2629 field = ast_json_object_get(body, "app");
2630 if (field) {
2631 args->app = ast_json_string_get(field);
2632 }
2633 field = ast_json_object_get(body, "appArgs");
2634 if (field) {
2635 args->app_args = ast_json_string_get(field);
2636 }
2637 return 0;
2638}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_snoop_channel_with_id_cb().

◆ ast_ari_channels_start_moh()

void ast_ari_channels_start_moh ( struct ast_variable headers,
struct ast_ari_channels_start_moh_args args,
struct ast_ari_response response 
)

Play music on hold to a channel.

Using media operations such as /play on a channel playing MOH in this manner will suspend MOH without resuming automatically. If continuing music on hold is desired, the stasis application must reinitiate music on hold.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 557 of file resource_channels.c.

560{
561 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
562
563 control = find_control(response, args->channel_id);
564 if (control == NULL) {
565 /* Response filled in by find_control */
566 return;
567 }
568
569 if (channel_state_invalid(control, response)) {
570 return;
571 }
572
573 stasis_app_control_moh_start(control, args->moh_class);
575}
void stasis_app_control_moh_start(struct stasis_app_control *control, const char *moh_class)
Play music on hold to a channel (does not affect hold status)
Definition: control.c:806

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_moh_start().

Referenced by ast_ari_channels_start_moh_cb().

◆ ast_ari_channels_start_moh_parse_body()

int ast_ari_channels_start_moh_parse_body ( struct ast_json body,
struct ast_ari_channels_start_moh_args args 
)

Body parsing function for /channels/{channelId}/moh.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1571 of file res_ari_channels.c.

1574{
1575 struct ast_json *field;
1576 /* Parse query parameters out of it */
1577 field = ast_json_object_get(body, "mohClass");
1578 if (field) {
1579 args->moh_class = ast_json_string_get(field);
1580 }
1581 return 0;
1582}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_start_moh_cb().

◆ ast_ari_channels_start_silence()

void ast_ari_channels_start_silence ( struct ast_variable headers,
struct ast_ari_channels_start_silence_args args,
struct ast_ari_response response 
)

Play silence to a channel.

Using media operations such as /play on a channel playing silence in this manner will suspend silence without resuming automatically.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 597 of file resource_channels.c.

600{
601 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
602
603 control = find_control(response, args->channel_id);
604 if (control == NULL) {
605 /* Response filled in by find_control */
606 return;
607 }
608
609 if (channel_state_invalid(control, response)) {
610 return;
611 }
612
615}
void stasis_app_control_silence_start(struct stasis_app_control *control)
Start playing silence to a channel.
Definition: control.c:858

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_silence_start().

Referenced by ast_ari_channels_start_silence_cb().

◆ ast_ari_channels_stop_moh()

void ast_ari_channels_stop_moh ( struct ast_variable headers,
struct ast_ari_channels_stop_moh_args args,
struct ast_ari_response response 
)

Stop playing music on hold to a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 577 of file resource_channels.c.

580{
581 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
582
583 control = find_control(response, args->channel_id);
584 if (control == NULL) {
585 /* Response filled in by find_control */
586 return;
587 }
588
589 if (channel_state_invalid(control, response)) {
590 return;
591 }
592
595}
void stasis_app_control_moh_stop(struct stasis_app_control *control)
Stop playing music on hold to a channel (does not affect hold status)
Definition: control.c:824

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_moh_stop().

Referenced by ast_ari_channels_stop_moh_cb().

◆ ast_ari_channels_stop_silence()

void ast_ari_channels_stop_silence ( struct ast_variable headers,
struct ast_ari_channels_stop_silence_args args,
struct ast_ari_response response 
)

Stop playing silence to a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 617 of file resource_channels.c.

620{
621 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
622
623 control = find_control(response, args->channel_id);
624 if (control == NULL) {
625 /* Response filled in by find_control */
626 return;
627 }
628
629 if (channel_state_invalid(control, response)) {
630 return;
631 }
632
635}
void stasis_app_control_silence_stop(struct stasis_app_control *control)
Stop playing silence to a channel.
Definition: control.c:881

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_silence_stop().

Referenced by ast_ari_channels_stop_silence_cb().

◆ ast_ari_channels_transfer_progress()

void ast_ari_channels_transfer_progress ( struct ast_variable headers,
struct ast_ari_channels_transfer_progress_args args,
struct ast_ari_response response 
)

Inform the channel about the progress of the attended/blind transfer.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 2360 of file resource_channels.c.

2361{
2363 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
2364 RAII_VAR(struct ast_channel *, chan, NULL, ast_channel_cleanup);
2365
2366 control = find_control(response, args->channel_id);
2367 if (control == NULL) {
2368 /* Response filled in by find_control */
2369 return;
2370 }
2371
2372 chan = ast_channel_get_by_name(args->channel_id);
2373 if (!chan) {
2374 ast_ari_response_error(response, 404, "Not Found",
2375 "Callee not found");
2376 return;
2377 }
2378
2379 if (ast_strlen_zero(args->states)) {
2380 ast_ari_response_error(response, 400, "Bad Request", "states must not be empty");
2381 return;
2382 }
2383
2384 if (strcasecmp(args->states, "channel_progress") == 0) {
2386 } else if (strcasecmp(args->states, "channel_answered") == 0) {
2388 } else if (strcasecmp(args->states, "channel_unavailable") == 0) {
2390 } else if (strcasecmp(args->states, "channel_declined") == 0) {
2392 } else {
2393 ast_ari_response_error(response, 400, "Bad Request", "Invalid states value");
2394 return;
2395 }
2396
2399}
int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
Indicates condition of channel, with payload.
Definition: channel.c:4608
ast_control_transfer
@ AST_TRANSFER_FAILED
@ AST_TRANSFER_UNAVAILABLE
@ AST_TRANSFER_SUCCESS
@ AST_TRANSFER_PROGRESS
@ AST_CONTROL_TRANSFER

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_channel_cleanup, ast_channel_get_by_name(), AST_CONTROL_TRANSFER, ast_indicate_data(), ast_strlen_zero(), AST_TRANSFER_FAILED, AST_TRANSFER_PROGRESS, AST_TRANSFER_SUCCESS, AST_TRANSFER_UNAVAILABLE, find_control(), NULL, and RAII_VAR.

Referenced by ast_ari_channels_transfer_progress_cb().

◆ ast_ari_channels_transfer_progress_parse_body()

int ast_ari_channels_transfer_progress_parse_body ( struct ast_json body,
struct ast_ari_channels_transfer_progress_args args 
)

Body parsing function for /channels/{channelId}/transfer_progress.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 3005 of file res_ari_channels.c.

3008{
3009 struct ast_json *field;
3010 /* Parse query parameters out of it */
3011 field = ast_json_object_get(body, "states");
3012 if (field) {
3013 args->states = ast_json_string_get(field);
3014 }
3015 return 0;
3016}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_transfer_progress_cb().

◆ ast_ari_channels_unhold()

void ast_ari_channels_unhold ( struct ast_variable headers,
struct ast_ari_channels_unhold_args args,
struct ast_ari_response response 
)

Remove a channel from hold.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 536 of file resource_channels.c.

539{
540 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
541
542 control = find_control(response, args->channel_id);
543 if (control == NULL) {
544 /* Response filled in by find_control */
545 return;
546 }
547
548 if (channel_state_invalid(control, response)) {
549 return;
550 }
551
553
555}
void stasis_app_control_unhold(struct stasis_app_control *control)
Remove the channel associated with the control from hold.
Definition: control.c:787

References ao2_cleanup, args, ast_ari_response_no_content(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_unhold().

Referenced by ast_ari_channels_unhold_cb().

◆ ast_ari_channels_unmute()

void ast_ari_channels_unmute ( struct ast_variable headers,
struct ast_ari_channels_unmute_args args,
struct ast_ari_response response 
)

Unmute a channel.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 446 of file resource_channels.c.

449{
450 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
451 unsigned int direction = 0;
452 enum ast_frame_type frametype = AST_FRAME_VOICE;
453
454 control = find_control(response, args->channel_id);
455 if (control == NULL) {
456 return;
457 }
458
459 if (channel_state_invalid(control, response)) {
460 return;
461 }
462
463 if (ast_strlen_zero(args->direction)) {
465 response, 400, "Bad Request",
466 "Direction is required");
467 return;
468 }
469
470 if (!strcmp(args->direction, "in")) {
472 } else if (!strcmp(args->direction, "out")) {
474 } else if (!strcmp(args->direction, "both")) {
476 } else {
478 response, 400, "Bad Request",
479 "Invalid direction specified");
480 return;
481 }
482
483 stasis_app_control_unmute(control, direction, frametype);
484
486}
int stasis_app_control_unmute(struct stasis_app_control *control, unsigned int direction, enum ast_frame_type frametype)
Unmute the channel associated with this control.
Definition: control.c:685

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), AST_FRAME_VOICE, AST_MUTE_DIRECTION_READ, AST_MUTE_DIRECTION_WRITE, ast_strlen_zero(), channel_state_invalid(), find_control(), NULL, RAII_VAR, and stasis_app_control_unmute().

Referenced by ast_ari_channels_unmute_cb().

◆ ast_ari_channels_unmute_parse_body()

int ast_ari_channels_unmute_parse_body ( struct ast_json body,
struct ast_ari_channels_unmute_args args 
)

Body parsing function for /channels/{channelId}/mute.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1362 of file res_ari_channels.c.

1365{
1366 struct ast_json *field;
1367 /* Parse query parameters out of it */
1368 field = ast_json_object_get(body, "direction");
1369 if (field) {
1370 args->direction = ast_json_string_get(field);
1371 }
1372 return 0;
1373}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_channels_unmute_cb().