aboutsummaryrefslogtreecommitdiffstats
path: root/pbx
diff options
context:
space:
mode:
Diffstat (limited to 'pbx')
-rw-r--r--pbx/pbx_ael.c12
-rw-r--r--pbx/pbx_config.c16
2 files changed, 19 insertions, 9 deletions
diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c
index fa4b7d516..0e40c9496 100644
--- a/pbx/pbx_ael.c
+++ b/pbx/pbx_ael.c
@@ -41,6 +41,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/cli.h"
#include "asterisk/app.h"
#include "asterisk/callerid.h"
+#include "asterisk/hashtab.h"
#include "asterisk/ael_structs.h"
#include "asterisk/pval.h"
#ifdef AAL_ARGCHECK
@@ -88,7 +89,7 @@ void linkprio(struct ael_extension *exten, struct ael_priority *prio);
void destroy_extensions(struct ael_extension *exten);
void set_priorities(struct ael_extension *exten);
void add_extensions(struct ael_extension *exten);
-void ast_compile_ael2(struct ast_context **local_contexts, struct pval *root);
+void ast_compile_ael2(struct ast_context **local_contexts, struct ast_hashtab *local_table, struct pval *root);
void destroy_pval(pval *item);
void destroy_pval_item(pval *item);
int is_float(char *arg );
@@ -108,6 +109,8 @@ static int pbx_load_module(void)
int errs=0, sem_err=0, sem_warn=0, sem_note=0;
char *rfilename;
struct ast_context *local_contexts=NULL, *con;
+ struct ast_hashtab *local_table=NULL;
+
struct pval *parse_tree;
ast_log(LOG_NOTICE, "Starting AEL load process.\n");
@@ -127,10 +130,13 @@ static int pbx_load_module(void)
ael2_semantic_check(parse_tree, &sem_err, &sem_warn, &sem_note);
if (errs == 0 && sem_err == 0) {
ast_log(LOG_NOTICE, "AEL load process: checked config file name '%s'.\n", rfilename);
- ast_compile_ael2(&local_contexts, parse_tree);
+ local_table = ast_hashtab_create(11, ast_hashtab_compare_contexts, ast_hashtab_resize_java, ast_hashtab_newsize_java, ast_hashtab_hash_contexts, 0);
+ ast_compile_ael2(&local_contexts, local_table, parse_tree);
ast_log(LOG_NOTICE, "AEL load process: compiled config file name '%s'.\n", rfilename);
- ast_merge_contexts_and_delete(&local_contexts, registrar);
+ ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
+ local_table = NULL; /* it's the dialplan global now */
+ local_contexts = NULL;
ast_log(LOG_NOTICE, "AEL load process: merged config file name '%s'.\n", rfilename);
for (con = ast_walk_contexts(NULL); con; con = ast_walk_contexts(con))
ast_context_verify_includes(con);
diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c
index 4a7a3d368..bf707a950 100644
--- a/pbx/pbx_config.c
+++ b/pbx/pbx_config.c
@@ -51,7 +51,7 @@ static int extenpatternmatchnew_config = 0;
AST_MUTEX_DEFINE_STATIC(save_dialplan_lock);
static struct ast_context *local_contexts = NULL;
-
+static struct ast_hashtab *local_table = NULL;
/*
* Prototypes for our completion functions
*/
@@ -1371,7 +1371,6 @@ static int pbx_load_config(const char *config_file)
const char *aft;
const char *newpm;
struct ast_flags config_flags = { 0 };
-
cfg = ast_config_load(config_file, config_flags);
if (!cfg)
return 0;
@@ -1399,7 +1398,7 @@ static int pbx_load_config(const char *config_file)
/* All categories but "general" or "globals" are considered contexts */
if (!strcasecmp(cxt, "general") || !strcasecmp(cxt, "globals"))
continue;
- con=ast_context_find_or_create(&local_contexts,cxt, registrar);
+ con=ast_context_find_or_create(&local_contexts, local_table, cxt, registrar);
if (con == NULL)
continue;
@@ -1601,7 +1600,7 @@ static void pbx_load_users(void)
/* Only create a context here when it is really needed. Otherwise default empty context
created by pbx_config may conflict with the one explicitly created by pbx_ael */
if (!con)
- con = ast_context_find_or_create(&local_contexts, userscontext, registrar);
+ con = ast_context_find_or_create(&local_contexts, local_table, userscontext, registrar);
if (!con) {
ast_log(LOG_ERROR, "Can't find/create user context '%s'\n", userscontext);
@@ -1626,12 +1625,17 @@ static int pbx_load_module(void)
{
struct ast_context *con;
- if(!pbx_load_config(config))
+ if (!local_table)
+ local_table = ast_hashtab_create(17, ast_hashtab_compare_contexts, ast_hashtab_resize_java, ast_hashtab_newsize_java, ast_hashtab_hash_contexts, 0);
+
+ if (!pbx_load_config(config))
return AST_MODULE_LOAD_DECLINE;
pbx_load_users();
- ast_merge_contexts_and_delete(&local_contexts, registrar);
+ ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
+ local_table = NULL; /* the local table has been moved into the global one. */
+ local_contexts = NULL;
for (con = NULL; (con = ast_walk_contexts(con));)
ast_context_verify_includes(con);