]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
func_channel: Add lastcontext and lastexten.
authorNaveen Albert <asterisk@phreaknet.org>
Thu, 6 Jan 2022 13:57:01 +0000 (13:57 +0000)
committerKevin Harwell <kharwell@digium.com>
Fri, 25 Feb 2022 20:43:09 +0000 (14:43 -0600)
Adds the lastcontext and lastexten channel fields to allow users
to access previous dialplan execution locations.

ASTERISK-29840 #close

Change-Id: Ib455fe300cc8e9a127686896ee2d0bd11e900307

doc/CHANGES-staging/channel_internal_api.txt [new file with mode: 0644]
funcs/func_channel.c
include/asterisk/channel.h
main/channel_internal_api.c

diff --git a/doc/CHANGES-staging/channel_internal_api.txt b/doc/CHANGES-staging/channel_internal_api.txt
new file mode 100644 (file)
index 0000000..f40a4c7
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: channel_internal_api
+
+CHANNEL(lastcontext) and CHANNEL(lastexten)
+are now available for use in the dialplan.
index c6e5ec1a34b23eb154acf55c6b7498972da7c85e..49c4b057793375667ad949815c5cabea5b42a32c 100644 (file)
                                        <enum name="context">
                                                <para>R/O returns the context for an outbound channel.</para>
                                        </enum>
+                                       <enum name="lastexten">
+                                               <para>R/O returns the last unique extension for an outbound channel.</para>
+                                       </enum>
+                                       <enum name="lastcontext">
+                                               <para>R/O returns the last unique context for an outbound channel.</para>
+                                       </enum>
                                        <enum name="channame">
                                                <para>R/O returns the channel name for an outbound channel.</para>
                                        </enum>
@@ -410,6 +416,10 @@ static int func_channel_read(struct ast_channel *chan, const char *function,
                locked_copy_string(chan, buf, ast_channel_exten(chan), len);
        else if (!strcasecmp(data, "context"))
                locked_copy_string(chan, buf, ast_channel_context(chan), len);
+       else if (!strcasecmp(data, "lastexten"))
+               locked_copy_string(chan, buf, ast_channel_lastexten(chan), len);
+       else if (!strcasecmp(data, "lastcontext"))
+               locked_copy_string(chan, buf, ast_channel_lastcontext(chan), len);
        else if (!strcasecmp(data, "userfield"))
                locked_copy_string(chan, buf, ast_channel_userfield(chan), len);
        else if (!strcasecmp(data, "channame"))
index 5b060e2c9d01ddb56d693957e1e655a9b10e4500..f3e191fcc52e89dbd60dc4a891bd476f95db3374 100644 (file)
@@ -4092,8 +4092,10 @@ void ast_channel_blockproc_set(struct ast_channel *chan, const char *value);
 const char *ast_channel_data(const struct ast_channel *chan);
 void ast_channel_data_set(struct ast_channel *chan, const char *value);
 
+const char *ast_channel_lastcontext(const struct ast_channel *chan);
 const char *ast_channel_context(const struct ast_channel *chan);
 void ast_channel_context_set(struct ast_channel *chan, const char *value);
+const char *ast_channel_lastexten(const struct ast_channel *chan);
 const char *ast_channel_exten(const struct ast_channel *chan);
 void ast_channel_exten_set(struct ast_channel *chan, const char *value);
 const char *ast_channel_macrocontext(const struct ast_channel *chan);
index a427ea46cff3efac2a75cf4e6f4f0c3a9c6870dc..c52b9727aacd2a44f747e2356b5631b9987f2693 100644 (file)
@@ -207,6 +207,8 @@ struct ast_channel {
 
        char context[AST_MAX_CONTEXT];                  /*!< Dialplan: Current extension context */
        char exten[AST_MAX_EXTENSION];                  /*!< Dialplan: Current extension number */
+       char lastcontext[AST_MAX_CONTEXT];              /*!< Dialplan: Previous extension context */
+       char lastexten[AST_MAX_EXTENSION];              /*!< Dialplan: Previous extension number */
        char macrocontext[AST_MAX_CONTEXT];             /*!< Macro: Current non-macro context. See app_macro.c */
        char macroexten[AST_MAX_EXTENSION];             /*!< Macro: Current non-macro extension. See app_macro.c */
        char unbridged;                                                 /*!< non-zero if the bridge core needs to re-evaluate the current
@@ -320,16 +322,32 @@ const char *ast_channel_context(const struct ast_channel *chan)
 {
        return chan->context;
 }
+const char *ast_channel_lastcontext(const struct ast_channel *chan)
+{
+       return chan->lastcontext;
+}
 void ast_channel_context_set(struct ast_channel *chan, const char *value)
 {
+       if (!*chan->lastcontext || strcmp(value, chan->context)) {
+               /* only copy to last context when it changes, unless it's empty to begin with */
+               ast_copy_string(chan->lastcontext, chan->context, sizeof(chan->lastcontext));
+       }
        ast_copy_string(chan->context, value, sizeof(chan->context));
 }
 const char *ast_channel_exten(const struct ast_channel *chan)
 {
        return chan->exten;
 }
+const char *ast_channel_lastexten(const struct ast_channel *chan)
+{
+       return chan->lastexten;
+}
 void ast_channel_exten_set(struct ast_channel *chan, const char *value)
 {
+       if (!*chan->lastexten || strcmp(value, chan->exten)) {
+               /* only copy to last exten when it changes, unless it's empty to begin with */
+               ast_copy_string(chan->lastexten, chan->exten, sizeof(chan->lastexten));
+       }
        ast_copy_string(chan->exten, value, sizeof(chan->exten));
 }
 const char *ast_channel_macrocontext(const struct ast_channel *chan)