diff options
Diffstat (limited to 'res/res_smdi.c')
-rw-r--r-- | res/res_smdi.c | 90 |
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" |