aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_smdi.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_smdi.c')
-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 bd3170ee8..aa86b188d 100644
--- a/res/res_smdi.c
+++ b/res/res_smdi.c
@@ -364,8 +364,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;
@@ -373,10 +378,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;
}
@@ -384,7 +414,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;
@@ -396,7 +426,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;
}
@@ -410,7 +440,7 @@ static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
ast_cond_timedwait(&iface->md_q_cond, &iface->md_q_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;
}
@@ -431,7 +461,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)
@@ -441,13 +472,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)
@@ -1039,14 +1072,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, const 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;
@@ -1072,7 +1112,7 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, const char *cmd, cha
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;
}
@@ -1082,6 +1122,10 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, const char *cmd, cha
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);
@@ -1089,9 +1133,9 @@ static int smdi_msg_retrieve_read(struct ast_channel *chan, const char *cmd, cha
}
}
- 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;
}
@@ -1180,7 +1224,11 @@ static int smdi_msg_read(struct ast_channel *chan, const char *cmd, char *data,
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);
@@ -1203,7 +1251,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"
@@ -1212,6 +1260,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,
};
@@ -1225,6 +1281,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"