diff options
-rw-r--r-- | include/asterisk/pbx.h | 2 | ||||
-rw-r--r-- | main/pbx.c | 41 |
2 files changed, 43 insertions, 0 deletions
diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index f7b97e8f2..1761a9bd7 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -758,6 +758,8 @@ const char *ast_get_include_name(struct ast_include *include); const char *ast_get_ignorepat_name(struct ast_ignorepat *ip); const char *ast_get_switch_name(struct ast_sw *sw); const char *ast_get_switch_data(struct ast_sw *sw); +int ast_get_switch_eval(struct ast_sw *sw); + /*! @} */ /*! @name Other Extension stuff */ diff --git a/main/pbx.c b/main/pbx.c index d32994fe7..548e20268 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -5292,6 +5292,36 @@ struct store_hint { AST_LIST_HEAD(store_hints, store_hint); +static void context_merge_incls_swits_igps_other_registrars(struct ast_context *new, struct ast_context *old, const char *registrar) +{ + struct ast_include *i; + struct ast_ignorepat *ip; + struct ast_sw *sw; + + /* copy in the includes, switches, and ignorepats */ + /* walk through includes */ + for (i = NULL; (i = ast_walk_context_includes(old, i)) ; ) { + if (strcmp(ast_get_include_registrar(i), registrar) == 0) + continue; /* not mine */ + ast_context_add_include2(new, ast_get_include_name(i), ast_get_include_registrar(i)); + } + + /* walk through switches */ + for (sw = NULL; (sw = ast_walk_context_switches(old, sw)) ; ) { + if (strcmp(ast_get_switch_registrar(sw), registrar) == 0) + continue; /* not mine */ + ast_context_add_switch2(new, ast_get_switch_name(sw), ast_get_switch_data(sw), ast_get_switch_eval(sw), ast_get_switch_registrar(sw)); + } + + /* walk thru ignorepats ... */ + for (ip = NULL; (ip = ast_walk_context_ignorepats(old, ip)); ) { + if (strcmp(ast_get_ignorepat_registrar(ip), registrar) == 0) + continue; /* not mine */ + ast_context_add_ignorepat2(new, ast_get_ignorepat_name(ip), ast_get_ignorepat_registrar(ip)); + } +} + + /* the purpose of this routine is to duplicate a context, with all its substructure, except for any extens that have a matching registrar */ static void context_merge(struct ast_context **extcontexts, struct ast_hashtab *exttable, struct ast_context *context, const char *registrar) @@ -5329,6 +5359,9 @@ static void context_merge(struct ast_context **extcontexts, struct ast_hashtab * /* make sure the new context exists, so we have somewhere to stick this exten/prio */ if (!new) { new = ast_context_find_or_create(extcontexts, exttable, context->name, prio_item->registrar); /* a new context created via priority from a different context in the old dialplan, gets its registrar from the prio's registrar */ + + /* copy in the includes, switches, and ignorepats */ + context_merge_incls_swits_igps_other_registrars(new, context, registrar); } if (!new) { ast_log(LOG_ERROR,"Could not allocate a new context for %s in merge_and_delete! Danger!\n", context->name); @@ -5357,6 +5390,9 @@ static void context_merge(struct ast_context **extcontexts, struct ast_hashtab * /* we could have given it the registrar of the other module who incremented the refcount, but that's not available, so we give it the registrar we know about */ new = ast_context_find_or_create(extcontexts, exttable, context->name, context->registrar); + + /* copy in the includes, switches, and ignorepats */ + context_merge_incls_swits_igps_other_registrars(new, context, registrar); } } @@ -7945,6 +7981,11 @@ const char *ast_get_switch_data(struct ast_sw *sw) return sw ? sw->data : NULL; } +int ast_get_switch_eval(struct ast_sw *sw) +{ + return sw->eval; +} + const char *ast_get_switch_registrar(struct ast_sw *sw) { return sw ? sw->registrar : NULL; |