@ -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 * s earch_key, s truct ast_flags op tions )
{
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 , s earch_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 * s tation)
enum smdi_message_type type , const char * s earch_key, s truct ast_flags op tions )
{
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 , s tation ) ) ) {
if ( ( msg = smdi_msg_find ( iface , type , s earch_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 , s tation ) ) ) {
if ( ( msg = smdi_msg_find ( iface , type , s earch_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 ( s tation ) ;
AST_APP_ARG ( s earch_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 . s tation ) ) {
if ( ast_strlen_zero ( args . port ) | | ast_strlen_zero ( args . s earch_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 . s tation ) ) ) {
ast_log ( LOG_WARNING , " No SMDI message retrieved for s tation '%s' after "
" waiting %u ms. \n " , args . s tation , timeout ) ;
if ( ! ( md_msg = smdi_message_wait ( iface , timeout , SMDI_MD , args . s earch_key, options ) ) ) {
ast_log ( LOG_WARNING , " No SMDI message retrieved for s earch key '%s' after "
" waiting %u ms. \n " , args . s earch_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>,<s tation>[,timeout ])" ,
. syntax = " SMDI_MSG_RETRIEVE(<smdi port>,<s earch 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 "