mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-14 16:33:34 +00:00
Add new "macrocontext" field (yes, you need to "make clean ; make install"
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@808 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -65,6 +65,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|||||||
char oldcontext[256] = "";
|
char oldcontext[256] = "";
|
||||||
char *offsets;
|
char *offsets;
|
||||||
int offset;
|
int offset;
|
||||||
|
int setmacrocontext=0;
|
||||||
|
|
||||||
char *save_macro_exten;
|
char *save_macro_exten;
|
||||||
char *save_macro_context;
|
char *save_macro_context;
|
||||||
@@ -94,6 +95,10 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|||||||
oldpriority = chan->priority;
|
oldpriority = chan->priority;
|
||||||
strncpy(oldexten, chan->exten, sizeof(oldexten) - 1);
|
strncpy(oldexten, chan->exten, sizeof(oldexten) - 1);
|
||||||
strncpy(oldcontext, chan->context, sizeof(oldcontext) - 1);
|
strncpy(oldcontext, chan->context, sizeof(oldcontext) - 1);
|
||||||
|
if (!strlen(chan->macrocontext)) {
|
||||||
|
strncpy(chan->macrocontext, chan->context, sizeof(chan->macrocontext) - 1);
|
||||||
|
setmacrocontext=1;
|
||||||
|
}
|
||||||
argc = 1;
|
argc = 1;
|
||||||
/* Save old macro variables */
|
/* Save old macro variables */
|
||||||
save_macro_exten = pbx_builtin_getvar_helper(chan, "MACRO_EXTEN");
|
save_macro_exten = pbx_builtin_getvar_helper(chan, "MACRO_EXTEN");
|
||||||
@@ -115,10 +120,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|||||||
|
|
||||||
/* Setup environment for new run */
|
/* Setup environment for new run */
|
||||||
strcpy(chan->exten, "s");
|
strcpy(chan->exten, "s");
|
||||||
#if 0
|
|
||||||
/* Don't overwrite it because sometimes we have to know the real context */
|
|
||||||
strncpy(chan->context, fullmacro, sizeof(chan->context));
|
strncpy(chan->context, fullmacro, sizeof(chan->context));
|
||||||
#endif
|
|
||||||
chan->priority = 1;
|
chan->priority = 1;
|
||||||
|
|
||||||
while((cur = strsep(&rest, "|")) && (argc < MAX_ARGS)) {
|
while((cur = strsep(&rest, "|")) && (argc < MAX_ARGS)) {
|
||||||
@@ -131,8 +133,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|||||||
pbx_builtin_setvar_helper(chan, varname, cur);
|
pbx_builtin_setvar_helper(chan, varname, cur);
|
||||||
argc++;
|
argc++;
|
||||||
}
|
}
|
||||||
while(ast_exists_extension(chan, fullmacro, chan->exten, chan->priority, chan->callerid)) {
|
while(ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid)) {
|
||||||
if ((res = ast_spawn_extension(chan, fullmacro, chan->exten, chan->priority, chan->callerid))) {
|
if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
|
||||||
/* Something bad happened, or a hangup has been requested. */
|
/* Something bad happened, or a hangup has been requested. */
|
||||||
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
|
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
|
||||||
/* Just return result as to the previous application as if it had been dialed */
|
/* Just return result as to the previous application as if it had been dialed */
|
||||||
@@ -155,7 +157,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcmp(chan->context, oldcontext) || strcmp(chan->exten, "s")) {
|
if (strcasecmp(chan->context, fullmacro)) {
|
||||||
if (option_verbose > 1)
|
if (option_verbose > 1)
|
||||||
ast_verbose(VERBOSE_PREFIX_2 "Channel '%s' jumping out of macro '%s'\n", chan->name, macro);
|
ast_verbose(VERBOSE_PREFIX_2 "Channel '%s' jumping out of macro '%s'\n", chan->name, macro);
|
||||||
break;
|
break;
|
||||||
@@ -186,6 +188,8 @@ out:
|
|||||||
if (save_macro_context) free(save_macro_context);
|
if (save_macro_context) free(save_macro_context);
|
||||||
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
|
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
|
||||||
if (save_macro_priority) free(save_macro_priority);
|
if (save_macro_priority) free(save_macro_priority);
|
||||||
|
if (setmacrocontext)
|
||||||
|
strcpy(chan->macrocontext, "");
|
||||||
|
|
||||||
if (!strcasecmp(chan->context, fullmacro)) {
|
if (!strcasecmp(chan->context, fullmacro)) {
|
||||||
/* If we're leaving the macro normally, restore original information */
|
/* If we're leaving the macro normally, restore original information */
|
||||||
|
@@ -492,7 +492,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
|||||||
make_dir(dir, sizeof(dir), ext, "INBOX");
|
make_dir(dir, sizeof(dir), ext, "INBOX");
|
||||||
if (mkdir(dir, 0700) && (errno != EEXIST))
|
if (mkdir(dir, 0700) && (errno != EEXIST))
|
||||||
ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dir, strerror(errno));
|
ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dir, strerror(errno));
|
||||||
if (ast_exists_extension(chan, chan->context, "o", 1, chan->callerid))
|
if (ast_exists_extension(chan, strlen(chan->macrocontext) ? chan->macrocontext : chan->context, "o", 1, chan->callerid))
|
||||||
ecodes = "#0";
|
ecodes = "#0";
|
||||||
/* Play the beginning intro if desired */
|
/* Play the beginning intro if desired */
|
||||||
if (strlen(prefile)) {
|
if (strlen(prefile)) {
|
||||||
@@ -520,6 +520,8 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
|||||||
}
|
}
|
||||||
} else if (silent == '0') {
|
} else if (silent == '0') {
|
||||||
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
||||||
|
if (strlen(chan->macrocontext))
|
||||||
|
strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
|
||||||
chan->priority = 0;
|
chan->priority = 0;
|
||||||
ast_softhangup(chan, AST_SOFTHANGUP_ASYNCGOTO);
|
ast_softhangup(chan, AST_SOFTHANGUP_ASYNCGOTO);
|
||||||
free(copy);
|
free(copy);
|
||||||
|
@@ -142,6 +142,8 @@ struct ast_channel {
|
|||||||
|
|
||||||
/*! Current extension context */
|
/*! Current extension context */
|
||||||
char context[AST_MAX_EXTENSION];
|
char context[AST_MAX_EXTENSION];
|
||||||
|
/*! Current non-macro context */
|
||||||
|
char macrocontext[AST_MAX_EXTENSION];
|
||||||
/*! Current extension number */
|
/*! Current extension number */
|
||||||
char exten[AST_MAX_EXTENSION];
|
char exten[AST_MAX_EXTENSION];
|
||||||
/* Current extension priority */
|
/* Current extension priority */
|
||||||
|
Reference in New Issue
Block a user