aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-08 00:06:09 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-08 00:06:09 +0000
commitfb1a9790fde4136d5a74bd962c818a62d0f8eac0 (patch)
treef86ec74cd29f101887e8fe9b10c544fc0efbf1e1
parentbb17438140ce3ae3aa82a93b8115d58dff6fd4ad (diff)
issue #5638
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@7001 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xChangeLog2
-rwxr-xr-xapps/app_osplookup.c138
2 files changed, 101 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 335697980..b7d72532f 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
2005-11-07 Kevin P. Fleming <kpfleming@digium.com>
+ * apps/app_osplookup.c: upgrade to new arg/option API and implement priority jumping control
+
* channels/chan_misdn.c: various fixes from issue #5639
* channels/misdn/isdn_lib.c: various fixes from issue #5639
diff --git a/apps/app_osplookup.c b/apps/app_osplookup.c
index 79648f327..f42cf7ab3 100755
--- a/apps/app_osplookup.c
+++ b/apps/app_osplookup.c
@@ -43,6 +43,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/utils.h"
#include "asterisk/causes.h"
#include "asterisk/astosp.h"
+#include "asterisk/app.h"
+#include "asterisk/options.h"
static char *tdesc = "OSP Lookup";
@@ -63,23 +65,33 @@ static char *descrip =
" ${OSPHANDLE}: The OSP Handle for anything remaining\n"
" ${OSPRESULTS}: The number of OSP results total remaining\n"
"\n"
-"If the lookup was *not* successful and there exists a priority n + 101,\n"
-"then that priority will be taken next.\n" ;
+"The option string may contain the following character:\n"
+" 'j' -- jump to n+101 priority if the lookup was NOT successful\n"
+"This application sets the following channel variable upon completion:\n"
+" OSPLOOKUPSTATUS The status of the OSP Lookup attempt as a text string, one of\n"
+" SUCCESS | FAILED \n";
+
static char *descrip2 =
-" OSPNext: Looks up the next OSP Destination for ${OSPHANDLE}\n"
+" OSPNext(cause[|options]): Looks up the next OSP Destination for ${OSPHANDLE}\n"
"See OSPLookup for more information\n"
"\n"
-"If the lookup was *not* successful and there exists a priority n + 101,\n"
-"then that priority will be taken next.\n" ;
+"The option string may contain the following character:\n"
+" 'j' -- jump to n+101 priority if the lookup was NOT successful\n"
+"This application sets the following channel variable upon completion:\n"
+" OSPNEXTSTATUS The status of the OSP Next attempt as a text string, one of\n"
+" SUCCESS | FAILED \n";
static char *descrip3 =
-" OSPFinish(status): Records call state for ${OSPHANDLE}, according to\n"
-"status, which should be one of BUSY, CONGESTION, ANSWER, NOANSWER, or NOCHANAVAIL\n"
-"or coincidentally, just what the Dial application stores in its ${DIALSTATUS}\n"
+" OSPFinish(status[|options]): Records call state for ${OSPHANDLE}, according to\n"
+"status, which should be one of BUSY, CONGESTION, ANSWER, NOANSWER, or CHANUNAVAIL\n"
+"or coincidentally, just what the Dial application stores in its ${DIALSTATUS}.\n"
"\n"
-"If the finishing was *not* successful and there exists a priority n + 101,\n"
-"then that priority will be taken next.\n" ;
+"The option string may contain the following character:\n"
+" 'j' -- jump to n+101 priority if the finish attempt was NOT successful\n"
+"This application sets the following channel variable upon completion:\n"
+" OSPFINISHSTATUS The status of the OSP Finish attempt as a text string, one of\n"
+" SUCCESS | FAILED \n";
STANDARD_LOCAL_USER;
@@ -108,11 +120,16 @@ static int osplookup_exec(struct ast_channel *chan, void *data)
int res=0;
struct localuser *u;
char *temp;
- char *provider, *opts=NULL;
struct ast_osp_result result;
+ int priority_jump = 0;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(extension);
+ AST_APP_ARG(provider);
+ AST_APP_ARG(options);
+ );
if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "OSPLookup requires an argument (extension)\n");
+ ast_log(LOG_WARNING, "OSPLookup requires an argument OSPLookup(exten[|provider[|options]])\n");
return -1;
}
@@ -125,19 +142,15 @@ static int osplookup_exec(struct ast_channel *chan, void *data)
return -1;
}
- provider = strchr(temp, '|');
- if (provider) {
- *provider = '\0';
- provider++;
- opts = strchr(provider, '|');
- if (opts) {
- *opts = '\0';
- opts++;
- }
+ AST_STANDARD_APP_ARGS(args, temp);
+
+ if (args.options) {
+ if (strchr(args.options, 'j'))
+ priority_jump = 1;
}
-
- ast_log(LOG_DEBUG, "Whoo hoo, looking up OSP on '%s' via '%s'\n", temp, provider ? provider : "<default>");
- if ((res = ast_osp_lookup(chan, provider, temp, chan->cid.cid_num, &result)) > 0) {
+
+ ast_log(LOG_DEBUG, "Whoo hoo, looking up OSP on '%s' via '%s'\n", args.extension, args.provider ? args.provider : "<default>");
+ if ((res = ast_osp_lookup(chan, args.provider, args.extension, chan->cid.cid_num, &result)) > 0) {
char tmp[80];
snprintf(tmp, sizeof(tmp), "%d", result.handle);
pbx_builtin_setvar_helper(chan, "_OSPHANDLE", tmp);
@@ -146,16 +159,19 @@ static int osplookup_exec(struct ast_channel *chan, void *data)
pbx_builtin_setvar_helper(chan, "_OSPTOKEN", result.token);
snprintf(tmp, sizeof(tmp), "%d", result.numresults);
pbx_builtin_setvar_helper(chan, "_OSPRESULTS", tmp);
+ pbx_builtin_setvar_helper(chan, "OSPLOOKUPSTATUS", "SUCCESS");
} else {
- if (!res)
- ast_log(LOG_NOTICE, "OSP Lookup failed for '%s' (provider '%s')\n", temp, provider ? provider : "<default>");
- else
- ast_log(LOG_DEBUG, "Got hangup on '%s' while doing OSP Lookup for '%s' (provider '%s')!\n", chan->name, temp, provider ? provider : "<default>" );
+ if (!res) {
+ ast_log(LOG_NOTICE, "OSP Lookup failed for '%s' (provider '%s')\n", args.extension, args.provider ? args.provider : "<default>");
+ pbx_builtin_setvar_helper(chan, "OSPLOOKUPSTATUS", "FAILED");
+ } else
+ ast_log(LOG_DEBUG, "Got hangup on '%s' while doing OSP Lookup for '%s' (provider '%s')!\n", chan->name, args.extension, args.provider ? args.provider : "<default>" );
}
if (!res) {
/* Look for a "busy" place */
- ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
+ if (priority_jump || option_priority_jumping)
+ ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
} else if (res > 0)
res = 0;
LOCAL_USER_REMOVE(u);
@@ -169,15 +185,34 @@ static int ospnext_exec(struct ast_channel *chan, void *data)
char *temp;
int cause;
struct ast_osp_result result;
-
+ int priority_jump = 0;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(cause);
+ AST_APP_ARG(options);
+ );
+
if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "OSPNext should have an argument (cause)\n");
+ ast_log(LOG_WARNING, "OSPNext should have an argument (cause[|options])\n");
return -1;
}
-
+
LOCAL_USER_ADD(u);
- cause = str2cause((char *)data);
+ temp = ast_strdupa(data);
+ if (!temp) {
+ ast_log(LOG_ERROR, "Out of memory!\n");
+ LOCAL_USER_REMOVE(u);
+ return -1;
+ }
+
+ AST_STANDARD_APP_ARGS(args, temp);
+
+ if (args.options) {
+ if (strchr(args.options, 'j'))
+ priority_jump = 1;
+ }
+
+ cause = str2cause(args.cause);
temp = pbx_builtin_getvar_helper(chan, "OSPHANDLE");
result.handle = -1;
if (!ast_strlen_zero(temp) && (sscanf(temp, "%d", &result.handle) == 1) && (result.handle > -1)) {
@@ -190,6 +225,7 @@ static int ospnext_exec(struct ast_channel *chan, void *data)
pbx_builtin_setvar_helper(chan, "_OSPTOKEN", result.token);
snprintf(tmp, sizeof(tmp), "%d", result.numresults);
pbx_builtin_setvar_helper(chan, "_OSPRESULTS", tmp);
+ pbx_builtin_setvar_helper(chan, "OSPNEXTSTATUS", "SUCCESS");
}
} else {
if (!res) {
@@ -197,12 +233,14 @@ static int ospnext_exec(struct ast_channel *chan, void *data)
ast_log(LOG_NOTICE, "OSP Lookup Next failed for handle '%d'\n", result.handle);
else
ast_log(LOG_DEBUG, "No OSP handle specified\n");
+ pbx_builtin_setvar_helper(chan, "OSPNEXTSTATUS", "FAILED");
} else
ast_log(LOG_DEBUG, "Got hangup on '%s' while doing OSP Next!\n", chan->name);
}
if (!res) {
/* Look for a "busy" place */
- ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
+ if (priority_jump || option_priority_jumping)
+ ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
} else if (res > 0)
res = 0;
LOCAL_USER_REMOVE(u);
@@ -217,13 +255,32 @@ static int ospfinished_exec(struct ast_channel *chan, void *data)
int cause;
time_t start=0, duration=0;
struct ast_osp_result result;
-
+ int priority_jump = 0;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(status);
+ AST_APP_ARG(options);
+ );
+
if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "OSPFinish should have an argument (cause)\n");
+ ast_log(LOG_WARNING, "OSPFinish should have an argument (status[|options])\n");
+ return -1;
+ }
+
+ LOCAL_USER_ADD(u);
+
+ temp = ast_strdupa(data);
+ if (!temp) {
+ ast_log(LOG_ERROR, "Out of memory!\n");
+ LOCAL_USER_REMOVE(u);
return -1;
}
- LOCAL_USER_ADD(u);
+ AST_STANDARD_APP_ARGS(args, temp);
+
+ if (args.options) {
+ if (strchr(args.options, 'j'))
+ priority_jump = 1;
+ }
if (chan->cdr) {
start = chan->cdr->answer.tv_sec;
@@ -234,12 +291,13 @@ static int ospfinished_exec(struct ast_channel *chan, void *data)
} else
ast_log(LOG_WARNING, "OSPFinish called on channel '%s' with no CDR!\n", chan->name);
- cause = str2cause((char *)data);
+ cause = str2cause(args.status);
temp = pbx_builtin_getvar_helper(chan, "OSPHANDLE");
result.handle = -1;
if (!ast_strlen_zero(temp) && (sscanf(temp, "%d", &result.handle) == 1) && (result.handle > -1)) {
if (!ast_osp_terminate(result.handle, cause, start, duration)) {
pbx_builtin_setvar_helper(chan, "_OSPHANDLE", "");
+ pbx_builtin_setvar_helper(chan, "OSPFINISHSTATUS", "SUCCESS");
res = 1;
}
} else {
@@ -248,12 +306,14 @@ static int ospfinished_exec(struct ast_channel *chan, void *data)
ast_log(LOG_NOTICE, "OSP Finish failed for handle '%d'\n", result.handle);
else
ast_log(LOG_DEBUG, "No OSP handle specified\n");
+ pbx_builtin_setvar_helper(chan, "OSPFINISHSTATUS", "FAILED");
} else
ast_log(LOG_DEBUG, "Got hangup on '%s' while doing OSP Terminate!\n", chan->name);
}
if (!res) {
/* Look for a "busy" place */
- ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
+ if (priority_jump || option_priority_jumping)
+ ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
} else if (res > 0)
res = 0;
LOCAL_USER_REMOVE(u);