[asterisk-commits] russell: branch russell/smdi-msg-searching r107233 - in /team/russell/smdi-ms...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Mar 10 17:10:29 CDT 2008
Author: russell
Date: Mon Mar 10 17:10:29 2008
New Revision: 107233
URL: http://svn.digium.com/view/asterisk?view=rev&rev=107233
Log:
Implement the ability to search for SMDI messages using the SMDI_MSG_RETRIEVE()
function using a search key other than the forwarding station. You can now
also search via the message desk number and the message desk terminal.
See the updated docs in doc/smdi.txt for more information.
Modified:
team/russell/smdi-msg-searching/doc/smdi.txt
team/russell/smdi-msg-searching/res/res_smdi.c
Modified: team/russell/smdi-msg-searching/doc/smdi.txt
URL: http://svn.digium.com/view/asterisk/team/russell/smdi-msg-searching/doc/smdi.txt?view=diff&rev=107233&r1=107232&r2=107233
==============================================================================
--- team/russell/smdi-msg-searching/doc/smdi.txt (original)
+++ team/russell/smdi-msg-searching/doc/smdi.txt Mon Mar 10 17:10:29 2008
@@ -13,10 +13,10 @@
*CLI> core show function SMDI_MSG_RETRIEVE
- -= Info about function 'SMDI_MSG_RETRIEVE' =-
+ -= Info about function 'SMDI_MSG_RETRIEVE' =-
[Syntax]
-SMDI_MSG_RETRIEVE(<smdi port>,<station>[,timeout])
+SMDI_MSG_RETRIEVE(<smdi port>,<search key>[,timeout[,options]])
[Synopsis]
Retrieve an SMDI message.
@@ -29,6 +29,14 @@
the global SMDI message queue, and can not be accessed by any other Asterisk
channels. The timeout for this function is optional, and the default is
3 seconds. When providing a timeout, it should be in milliseconds.
+ The default search is done on the forwarding station ID. However, if
+you set one of the search key options in the options field, you can change
+this behavior.
+ Options:
+ t - Instead of searching on the forwarding station, search on the message
+ desk terminal, instead.
+ n - Instead of searching on the forwarding station, search on the message
+ desk number, instead.
*CLI> core show function SMDI_MSG
Modified: team/russell/smdi-msg-searching/res/res_smdi.c
URL: http://svn.digium.com/view/asterisk/team/russell/smdi-msg-searching/res/res_smdi.c?view=diff&rev=107233&r1=107232&r2=107233
==============================================================================
--- team/russell/smdi-msg-searching/res/res_smdi.c (original)
+++ team/russell/smdi-msg-searching/res/res_smdi.c Mon Mar 10 17:10:29 2008
@@ -364,8 +364,13 @@
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 @@
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_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 @@
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 @@
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_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_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 @@
/*! 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 @@
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;
}
@@ -1080,6 +1120,10 @@
if (!(iface = ast_smdi_interface_find(args.port))) {
ast_log(LOG_ERROR, "SMDI port '%s' not found\n", args.port);
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)) {
@@ -1089,9 +1133,9 @@
}
}
- 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 @@
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 @@
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 @@
"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, instead.\n"
+ " n - Instead of searching on the forwarding station, search on the message\n"
+ " desk number, instead.\n"
"",
.read = smdi_msg_retrieve_read,
};
@@ -1225,6 +1281,8 @@
"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"
More information about the asterisk-commits
mailing list