Skip to content
Snippets Groups Projects
Commit d86a6ac5 authored by Richard Mudgett's avatar Richard Mudgett
Browse files

app_page.c: Simplify dialplan using Page.

Dialplan has to be careful about passing an empty destination list or
empty positions in the list.  As a result, dialplan has to check for
these conditions before using Page.  Simplify dialplan by making Page
handle these conditions gracefully.

* Made tolerate empty positions in the paged device list.

* Reduced some warnings associated with the 's' option to verbose
messages.  The warning level for those messages really serves no purpose
as that is why the 's' option exists.

ASTERISK-28638

Change-Id: I95b64a6d6800cd1a25279c88889314ae60fc21e3
parent cee68ea4
No related branches found
No related tags found
No related merge requests found
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
Page series of phones Page series of phones
</synopsis> </synopsis>
<syntax> <syntax>
<parameter name="Technology/Resource" required="true" argsep="&amp;"> <parameter name="Technology/Resource" required="false" argsep="&amp;">
<argument name="Technology/Resource" required="true"> <argument name="Technology/Resource" required="true">
<para>Specification of the device(s) to dial. These must be in the format of <para>Specification of the device(s) to dial. These must be in the format of
<literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable> <literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
...@@ -270,17 +270,12 @@ static int page_exec(struct ast_channel *chan, const char *data) ...@@ -270,17 +270,12 @@ static int page_exec(struct ast_channel *chan, const char *data)
AST_APP_ARG(timeout); AST_APP_ARG(timeout);
); );
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
return -1;
}
if (!(app = pbx_findapp("ConfBridge"))) { if (!(app = pbx_findapp("ConfBridge"))) {
ast_log(LOG_WARNING, "There is no ConfBridge application available!\n"); ast_log(LOG_WARNING, "There is no ConfBridge application available!\n");
return -1; return -1;
}; };
parse = ast_strdupa(data); parse = ast_strdupa(data ?: "");
AST_STANDARD_APP_ARGS(args, parse); AST_STANDARD_APP_ARGS(args, parse);
...@@ -301,7 +296,7 @@ static int page_exec(struct ast_channel *chan, const char *data) ...@@ -301,7 +296,7 @@ static int page_exec(struct ast_channel *chan, const char *data)
/* Count number of extensions in list by number of ampersands + 1 */ /* Count number of extensions in list by number of ampersands + 1 */
num_dials = 1; num_dials = 1;
tmp = args.devices; tmp = args.devices ?: "";
while (*tmp) { while (*tmp) {
if (*tmp == '&') { if (*tmp == '&') {
num_dials++; num_dials++;
...@@ -334,13 +329,20 @@ static int page_exec(struct ast_channel *chan, const char *data) ...@@ -334,13 +329,20 @@ static int page_exec(struct ast_channel *chan, const char *data)
int state = 0; int state = 0;
struct ast_dial *dial = NULL; struct ast_dial *dial = NULL;
tech = ast_strip(tech);
if (ast_strlen_zero(tech)) {
/* No tech/resource in this position. */
continue;
}
/* don't call the originating device */ /* don't call the originating device */
if (!strcasecmp(tech, originator)) if (!strcasecmp(tech, originator)) {
continue; continue;
}
/* If no resource is available, continue on */ /* If no resource is available, continue on */
if (!(resource = strchr(tech, '/'))) { if (!(resource = strchr(tech, '/'))) {
ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech); ast_log(LOG_WARNING, "Incomplete destination: '%s' supplied.\n", tech);
continue; continue;
} }
...@@ -348,9 +350,11 @@ static int page_exec(struct ast_channel *chan, const char *data) ...@@ -348,9 +350,11 @@ static int page_exec(struct ast_channel *chan, const char *data)
if (ast_test_flag(&options.flags, PAGE_SKIP)) { if (ast_test_flag(&options.flags, PAGE_SKIP)) {
state = ast_device_state(tech); state = ast_device_state(tech);
if (state == AST_DEVICE_UNKNOWN) { if (state == AST_DEVICE_UNKNOWN) {
ast_log(LOG_WARNING, "Destination '%s' has device state '%s'. Paging anyway.\n", tech, ast_devstate2str(state)); ast_verb(3, "Destination '%s' has device state '%s'. Paging anyway.\n",
tech, ast_devstate2str(state));
} else if (state != AST_DEVICE_NOT_INUSE) { } else if (state != AST_DEVICE_NOT_INUSE) {
ast_log(LOG_WARNING, "Destination '%s' has device state '%s'.\n", tech, ast_devstate2str(state)); ast_verb(3, "Destination '%s' has device state '%s'.\n",
tech, ast_devstate2str(state));
continue; continue;
} }
} }
...@@ -365,7 +369,7 @@ static int page_exec(struct ast_channel *chan, const char *data) ...@@ -365,7 +369,7 @@ static int page_exec(struct ast_channel *chan, const char *data)
/* Append technology and resource */ /* Append technology and resource */
if (ast_dial_append(dial, tech, resource, NULL) == -1) { if (ast_dial_append(dial, tech, resource, NULL) == -1) {
ast_log(LOG_ERROR, "Failed to add %s to outbound dial\n", tech); ast_log(LOG_ERROR, "Failed to add %s/%s to outbound dial\n", tech, resource);
ast_dial_destroy(dial); ast_dial_destroy(dial);
continue; continue;
} }
......
Subject: app_page
The Page application now tolerates empty positions in the supplied
destination list. Dialplan can now be simplified by not having to check
for empty positions in the destination list.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment