mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-08 10:58:15 +00:00
Add the ability to use a pattern match for a hint.
(closes issue #7767) Reported by: Corydon76 Patches: 20070314__simple_hint_lookup.diff.txt uploaded by Corydon76 pbx-trunk-98436.diff uploaded by plack (license 365) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@109970 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
6
CHANGES
6
CHANGES
@@ -12,6 +12,12 @@ Zaptel channel driver (chan_zap) Changes
|
|||||||
* Channels can now be configured using named sections in zapata.conf, just
|
* Channels can now be configured using named sections in zapata.conf, just
|
||||||
like other channel drivers, including the use of templates.
|
like other channel drivers, including the use of templates.
|
||||||
|
|
||||||
|
PBX Changes
|
||||||
|
-----------
|
||||||
|
* It is now possible to specify a pattern match as a hint. Once a phone subscribes
|
||||||
|
to something that matches the pattern a hint will be created using the contents
|
||||||
|
and variables evaluated.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
--- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0 -------------
|
--- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0 -------------
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|||||||
50
main/pbx.c
50
main/pbx.c
@@ -2836,7 +2836,7 @@ static struct ast_exten *ast_hint_extension(struct ast_channel *c, const char *c
|
|||||||
/*! \brief Check state of extension by using hints */
|
/*! \brief Check state of extension by using hints */
|
||||||
static int ast_extension_state2(struct ast_exten *e)
|
static int ast_extension_state2(struct ast_exten *e)
|
||||||
{
|
{
|
||||||
char hint[AST_MAX_EXTENSION];
|
char hint[AST_MAX_EXTENSION] = "";
|
||||||
char *cur, *rest;
|
char *cur, *rest;
|
||||||
int allunavailable = 1, allbusy = 1, allfree = 1, allonhold = 1;
|
int allunavailable = 1, allbusy = 1, allfree = 1, allonhold = 1;
|
||||||
int busy = 0, inuse = 0, ring = 0;
|
int busy = 0, inuse = 0, ring = 0;
|
||||||
@@ -3073,6 +3073,20 @@ int ast_extension_state_add(const char *context, const char *exten,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If this is a pattern, dynamically create a new extension for this
|
||||||
|
* particular match. Note that this will only happen once for each
|
||||||
|
* individual extension, because the pattern will no longer match first.
|
||||||
|
*/
|
||||||
|
if (e->exten[0] == '_') {
|
||||||
|
ast_add_extension(e->parent->name, 0, exten, e->priority, e->label,
|
||||||
|
e->cidmatch, e->app, strdup(e->data), free,
|
||||||
|
e->registrar);
|
||||||
|
e = ast_hint_extension(NULL, context, exten);
|
||||||
|
if (!e || e->exten[0] == '_') {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Find the hint in the list of hints */
|
/* Find the hint in the list of hints */
|
||||||
AST_RWLIST_WRLOCK(&hints);
|
AST_RWLIST_WRLOCK(&hints);
|
||||||
|
|
||||||
@@ -5498,6 +5512,16 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
|
|||||||
while ((this = AST_LIST_REMOVE_HEAD(&store, list))) {
|
while ((this = AST_LIST_REMOVE_HEAD(&store, list))) {
|
||||||
struct pbx_find_info q = { .stacklen = 0 };
|
struct pbx_find_info q = { .stacklen = 0 };
|
||||||
exten = pbx_find_extension(NULL, NULL, &q, this->context, this->exten, PRIORITY_HINT, NULL, "", E_MATCH);
|
exten = pbx_find_extension(NULL, NULL, &q, this->context, this->exten, PRIORITY_HINT, NULL, "", E_MATCH);
|
||||||
|
/* If this is a pattern, dynamically create a new extension for this
|
||||||
|
* particular match. Note that this will only happen once for each
|
||||||
|
* individual extension, because the pattern will no longer match first.
|
||||||
|
*/
|
||||||
|
if (exten && exten->exten[0] == '_') {
|
||||||
|
ast_add_extension(exten->parent->name, 0, this->exten, PRIORITY_HINT, NULL,
|
||||||
|
0, exten->app, strdup(exten->data), free, registrar);
|
||||||
|
exten = ast_hint_extension(NULL, this->context, this->exten);
|
||||||
|
}
|
||||||
|
|
||||||
/* Find the hint in the list of hints */
|
/* Find the hint in the list of hints */
|
||||||
AST_RWLIST_TRAVERSE(&hints, hint, list) {
|
AST_RWLIST_TRAVERSE(&hints, hint, list) {
|
||||||
if (hint->exten == exten)
|
if (hint->exten == exten)
|
||||||
@@ -6360,15 +6384,23 @@ int ast_add_extension2(struct ast_context *con,
|
|||||||
struct ast_exten dummy_exten = {0};
|
struct ast_exten dummy_exten = {0};
|
||||||
char dummy_name[1024];
|
char dummy_name[1024];
|
||||||
|
|
||||||
/* if we are adding a hint, and there are global variables, and the hint
|
/* If we are adding a hint evalulate in variables and global variables */
|
||||||
contains variable references, then expand them
|
if (priority == PRIORITY_HINT && strstr(application, "${") && !strstr(extension, "_")) {
|
||||||
*/
|
struct ast_channel c = {0, };
|
||||||
ast_rwlock_rdlock(&globalslock);
|
|
||||||
if (priority == PRIORITY_HINT && AST_LIST_FIRST(&globals) && strstr(application, "${")) {
|
/* Start out with regular variables */
|
||||||
pbx_substitute_variables_varshead(&globals, application, expand_buf, sizeof(expand_buf));
|
ast_copy_string(c.exten, extension, sizeof(c.exten));
|
||||||
application = expand_buf;
|
ast_copy_string(c.context, con->name, sizeof(c.context));
|
||||||
|
pbx_substitute_variables_helper(&c, application, expand_buf, sizeof(expand_buf));
|
||||||
|
|
||||||
|
/* Move on to global variables if they exist */
|
||||||
|
ast_rwlock_rdlock(&globalslock);
|
||||||
|
if (AST_LIST_FIRST(&globals)) {
|
||||||
|
pbx_substitute_variables_varshead(&globals, application, expand_buf, sizeof(expand_buf));
|
||||||
|
application = expand_buf;
|
||||||
|
}
|
||||||
|
ast_rwlock_unlock(&globalslock);
|
||||||
}
|
}
|
||||||
ast_rwlock_unlock(&globalslock);
|
|
||||||
|
|
||||||
length = sizeof(struct ast_exten);
|
length = sizeof(struct ast_exten);
|
||||||
length += strlen(extension) + 1;
|
length += strlen(extension) + 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user