aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-05 16:38:52 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-05 16:38:52 +0000
commit55a7d769ac2d76dd6f42f54c2e3545129a3ee180 (patch)
tree043a1e8915788e4d20aeba1033570abdd1db36e9 /res
parenta5b32044b586d19f2710687603292f9d415b29fc (diff)
It turns out that searching on the forwarding station isn't very useful for
most people, so pull in the changes that allow searching for SMDI messages based on other components of the SMDI message. Also, update the SMDI documentation. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@120671 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_smdi.c90
1 files changed, 74 insertions, 16 deletions
diff --git a/res/res_smdi.c b/res/res_smdi.c
index b6a0b4593..83a5e1f7c 100644
--- a/res/res_smdi.c
+++ b/res/res_smdi.c
@@ -369,8 +369,13 @@ static void *smdi_msg_pop(struct ast_smdi_interface *iface, enum smdi_message_ty
return msg;
}
+enum {
+ OPT_SEARCH_TERMINAL = (1 << 0),
+ OPT_SEARCH_NUMBER = (1 << 1),
+};
+
static void *smdi_msg_find(struct ast_smdi_interface *iface,
- enum smdi_message_type type, const char *station)
+ enum smdi_message_type type, const char *search_key, struct ast_flags options)
{
void *msg = NULL;
@@ -378,10 +383,35 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
switch (type) {
case SMDI_MD:
- msg = ASTOBJ_CONTAINER_FIND(&iface->md_q, station);
+ if (ast_test_flag(&options, OPT_SEARCH_TERMINAL)) {
+ struct ast_smdi_md_message *md_msg = NULL;
+
+ /* Searching by the message desk terminal */
+
+ ASTOBJ_CONTAINER_TRAVERSE(&iface->md_q, !md_msg, do {
+ if (!strcasecmp(iterator->mesg_desk_term, search_key))
+ md_msg = ASTOBJ_REF(iterator);
+ } while (0); );
+
+ msg = md_msg;
+ } else if (ast_test_flag(&options, OPT_SEARCH_NUMBER)) {
+ struct ast_smdi_md_message *md_msg = NULL;
+
+ /* Searching by the message desk number */
+
+ ASTOBJ_CONTAINER_TRAVERSE(&iface->md_q, !md_msg, do {
+ if (!strcasecmp(iterator->mesg_desk_num, search_key))
+ md_msg = ASTOBJ_REF(iterator);
+ } while (0); );
+
+ msg = md_msg;
+ } else {
+ /* Searching by the forwarding station */
+ msg = ASTOBJ_CONTAINER_FIND(&iface->md_q, search_key);
+ }
break;
case SMDI_MWI:
- msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, station);
+ msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, search_key);
break;
}
@@ -389,7 +419,7 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
}
static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
- enum smdi_message_type type, const char *station)
+ enum smdi_message_type type, const char *search_key, struct ast_flags options)
{
struct timeval start;
long diff = 0;
@@ -415,7 +445,7 @@ static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
lock_msg_q(iface, type);
- if ((msg = smdi_msg_find(iface, type, station))) {
+ if ((msg = smdi_msg_find(iface, type, search_key, options))) {
unlock_msg_q(iface, type);
return msg;
}
@@ -429,7 +459,7 @@ static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
ast_cond_timedwait(cond, lock, &ts);
- if ((msg = smdi_msg_find(iface, type, station))) {
+ if ((msg = smdi_msg_find(iface, type, search_key, options))) {
unlock_msg_q(iface, type);
return msg;
}
@@ -450,7 +480,8 @@ struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *i
struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout)
{
- return smdi_message_wait(iface, timeout, SMDI_MD, NULL);
+ struct ast_flags options = { 0 };
+ return smdi_message_wait(iface, timeout, SMDI_MD, NULL, options);
}
struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface *iface)
@@ -460,13 +491,15 @@ struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface
struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait(struct ast_smdi_interface *iface, int timeout)
{
- return smdi_message_wait(iface, timeout, SMDI_MWI, NULL);
+ struct ast_flags options = { 0 };
+ return smdi_message_wait(iface, timeout, SMDI_MWI, NULL, options);
}
struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait_station(struct ast_smdi_interface *iface, int timeout,
const char *station)
{
- return smdi_message_wait(iface, timeout, SMDI_MWI, station);
+ struct ast_flags options = { 0 };
+ return smdi_message_wait(iface, timeout, SMDI_MWI, station, options);
}
struct ast_smdi_interface *ast_smdi_interface_find(const char *iface_name)
@@ -1059,14 +1092,21 @@ static int smdi_msg_id;
/*! In milliseconds */
#define SMDI_RETRIEVE_TIMEOUT_DEFAULT 3000
+AST_APP_OPTIONS(smdi_msg_ret_options, BEGIN_OPTIONS
+ AST_APP_OPTION('t', OPT_SEARCH_TERMINAL),
+ AST_APP_OPTION('n', OPT_SEARCH_NUMBER),
+END_OPTIONS );
+
static int smdi_msg_retrieve_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
struct ast_module_user *u;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(port);
- AST_APP_ARG(station);
+ AST_APP_ARG(search_key);
AST_APP_ARG(timeout);
+ AST_APP_ARG(options);
);
+ struct ast_flags options = { 0 };
unsigned int timeout = SMDI_RETRIEVE_TIMEOUT_DEFAULT;
int res = -1;
char *parse = NULL;
@@ -1092,7 +1132,7 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, char *cmd, char *dat
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
- if (ast_strlen_zero(args.port) || ast_strlen_zero(args.station)) {
+ if (ast_strlen_zero(args.port) || ast_strlen_zero(args.search_key)) {
ast_log(LOG_ERROR, "Invalid arguments provided to SMDI_MSG_RETRIEVE\n");
goto return_error;
}
@@ -1102,6 +1142,10 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, char *cmd, char *dat
goto return_error;
}
+ if (!ast_strlen_zero(args.options)) {
+ ast_app_parse_options(smdi_msg_ret_options, &options, NULL, args.options);
+ }
+
if (!ast_strlen_zero(args.timeout)) {
if (sscanf(args.timeout, "%u", &timeout) != 1) {
ast_log(LOG_ERROR, "'%s' is not a valid timeout\n", args.timeout);
@@ -1109,9 +1153,9 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, char *cmd, char *dat
}
}
- if (!(md_msg = smdi_message_wait(iface, timeout, SMDI_MD, args.station))) {
- ast_log(LOG_WARNING, "No SMDI message retrieved for station '%s' after "
- "waiting %u ms.\n", args.station, timeout);
+ if (!(md_msg = smdi_message_wait(iface, timeout, SMDI_MD, args.search_key, options))) {
+ ast_log(LOG_WARNING, "No SMDI message retrieved for search key '%s' after "
+ "waiting %u ms.\n", args.search_key, timeout);
goto return_error;
}
@@ -1200,7 +1244,11 @@ static int smdi_msg_read(struct ast_channel *chan, char *cmd, char *data, char *
smd = datastore->data;
- if (!strcasecmp(args.component, "station")) {
+ if (!strcasecmp(args.component, "number")) {
+ ast_copy_string(buf, smd->md_msg->mesg_desk_num, len);
+ } else if (!strcasecmp(args.component, "terminal")) {
+ ast_copy_string(buf, smd->md_msg->mesg_desk_term, len);
+ } else if (!strcasecmp(args.component, "station")) {
ast_copy_string(buf, smd->md_msg->fwd_st, len);
} else if (!strcasecmp(args.component, "callerid")) {
ast_copy_string(buf, smd->md_msg->calling_st, len);
@@ -1223,7 +1271,7 @@ return_error:
static struct ast_custom_function smdi_msg_retrieve_function = {
.name = "SMDI_MSG_RETRIEVE",
.synopsis = "Retrieve an SMDI message.",
- .syntax = "SMDI_MSG_RETRIEVE(<smdi port>,<station>[,timeout])",
+ .syntax = "SMDI_MSG_RETRIEVE(<smdi port>,<search key>[,timeout[,options]])",
.desc =
" This function is used to retrieve an incoming SMDI message. It returns\n"
"an ID which can be used with the SMDI_MSG() function to access details of\n"
@@ -1232,6 +1280,14 @@ static struct ast_custom_function smdi_msg_retrieve_function = {
"the global SMDI message queue, and can not be accessed by any other Asterisk\n"
"channels. The timeout for this function is optional, and the default is\n"
"3 seconds. When providing a timeout, it should be in milliseconds.\n"
+ " The default search is done on the forwarding station ID. However, if\n"
+ "you set one of the search key options in the options field, you can change\n"
+ "this behavior.\n"
+ " Options:\n"
+ " t - Instead of searching on the forwarding station, search on the message\n"
+ " desk terminal.\n"
+ " n - Instead of searching on the forwarding station, search on the message\n"
+ " desk number.\n"
"",
.read = smdi_msg_retrieve_read,
};
@@ -1245,6 +1301,8 @@ static struct ast_custom_function smdi_msg_function = {
"pulled from the incoming SMDI message queue using the SMDI_MSG_RETRIEVE()\n"
"function.\n"
" Valid message components are:\n"
+ " number - The message desk number\n"
+ " terminal - The message desk terminal\n"
" station - The forwarding station\n"
" callerid - The callerID of the calling party that was forwarded\n"
" type - The call type. The value here is the exact character\n"