diff --git a/CHANGES b/CHANGES index a68e22597397d91ca1c3b592b50d3ec538b984c7..2ec0534557ffe7256641b6289643c365229524a7 100644 --- a/CHANGES +++ b/CHANGES @@ -267,6 +267,7 @@ Queue changes result is that if a member becomes auto-paused, he will be paused in all queues for which he is a member, not just the queue that failed to reach the member. + * Added dialplan function QUEUE_EXISTS to check if a queue exists mISDN channel driver (chan_misdn) changes ---------------------------------------- diff --git a/apps/app_queue.c b/apps/app_queue.c index 11de4d903ab9613b9bb2e8ffe285f57cdb845cf1..286d7a9494434307dfbd3d1dbd4652e5cca1184b 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -469,6 +469,17 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <ref type="function">QUEUE_MEMBER_LIST</ref> </see-also> </function> + <function name="QUEUE_EXISTS" language="en_US"> + <synopsis> + Check if a named queue exists on this server + </synopsis> + <syntax> + <parameter name="queuename" /> + </syntax> + <description> + <para>Returns 1 if the specified queue exists, 0 if it does not</para> + </description> + </function> <function name="QUEUE_WAITING_COUNT" language="en_US"> <synopsis> Count number of calls currently waiting in a queue. @@ -5926,6 +5937,29 @@ static int queue_function_var(struct ast_channel *chan, const char *cmd, char *d return 0; } +/*! + * \brief Check if a given queue exists + * + */ +static int queue_function_exists(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) +{ + struct call_queue *q; + + buf[0] = '\0'; + + if (ast_strlen_zero(data)) { + ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd); + return -1; + } + q = load_realtime_queue(data); + snprintf(buf, len, "%d", q != NULL? 1 : 0); + if (q) { + queue_t_unref(q, "Done with temporary reference in QUEUE_EXISTS()"); + } + + return 0; +} + /*! * \brief Get number either busy / free / ready or total members of a specific queue * \retval number of members (busy / free / ready / total) @@ -6192,6 +6226,11 @@ static int queue_function_memberpenalty_write(struct ast_channel *chan, const ch return 0; } +static struct ast_custom_function queueexists_function = { + .name = "QUEUE_EXISTS", + .read = queue_function_exists, +}; + static struct ast_custom_function queuevar_function = { .name = "QUEUE_VARIABLES", .read = queue_function_var, @@ -8038,6 +8077,7 @@ static int unload_module(void) res |= ast_unregister_application(app_upqm); res |= ast_unregister_application(app_ql); res |= ast_unregister_application(app); + res |= ast_custom_function_unregister(&queueexists_function); res |= ast_custom_function_unregister(&queuevar_function); res |= ast_custom_function_unregister(&queuemembercount_function); res |= ast_custom_function_unregister(&queuemembercount_dep); @@ -8112,6 +8152,7 @@ static int load_module(void) res |= ast_manager_register_xml("QueueReload", 0, manager_queue_reload); res |= ast_manager_register_xml("QueueReset", 0, manager_queue_reset); res |= ast_custom_function_register(&queuevar_function); + res |= ast_custom_function_register(&queueexists_function); res |= ast_custom_function_register(&queuemembercount_function); res |= ast_custom_function_register(&queuemembercount_dep); res |= ast_custom_function_register(&queuememberlist_function);