@@ -206,6 +206,8 @@ struct ast_channel {
206206
207207 char context [AST_MAX_CONTEXT ]; /*!< Dialplan: Current extension context */
208208 char exten [AST_MAX_EXTENSION ]; /*!< Dialplan: Current extension number */
209+ char lastcontext [AST_MAX_CONTEXT ]; /*!< Dialplan: Previous extension context */
210+ char lastexten [AST_MAX_EXTENSION ]; /*!< Dialplan: Previous extension number */
209211 char macrocontext [AST_MAX_CONTEXT ]; /*!< Macro: Current non-macro context. See app_macro.c */
210212 char macroexten [AST_MAX_EXTENSION ]; /*!< Macro: Current non-macro extension. See app_macro.c */
211213 char unbridged ; /*!< non-zero if the bridge core needs to re-evaluate the current
@@ -345,17 +347,33 @@ const char *ast_channel_context(const struct ast_channel *chan)
345347{
346348 return chan -> context ;
347349}
350+ const char * ast_channel_lastcontext (const struct ast_channel * chan )
351+ {
352+ return chan -> lastcontext ;
353+ }
348354void ast_channel_context_set (struct ast_channel * chan , const char * value )
349355{
356+ if (!* chan -> lastcontext || strcmp (value , chan -> context )) {
357+ /* only copy to last context when it changes, unless it's empty to begin with */
358+ ast_copy_string (chan -> lastcontext , chan -> context , sizeof (chan -> lastcontext ));
359+ }
350360 ast_copy_string (chan -> context , value , sizeof (chan -> context ));
351361 ast_channel_snapshot_invalidate_segment (chan , AST_CHANNEL_SNAPSHOT_INVALIDATE_DIALPLAN );
352362}
353363const char * ast_channel_exten (const struct ast_channel * chan )
354364{
355365 return chan -> exten ;
356366}
367+ const char * ast_channel_lastexten (const struct ast_channel * chan )
368+ {
369+ return chan -> lastexten ;
370+ }
357371void ast_channel_exten_set (struct ast_channel * chan , const char * value )
358372{
373+ if (!* chan -> lastexten || strcmp (value , chan -> exten )) {
374+ /* only copy to last exten when it changes, unless it's empty to begin with */
375+ ast_copy_string (chan -> lastexten , chan -> exten , sizeof (chan -> lastexten ));
376+ }
359377 ast_copy_string (chan -> exten , value , sizeof (chan -> exten ));
360378 ast_channel_snapshot_invalidate_segment (chan , AST_CHANNEL_SNAPSHOT_INVALIDATE_DIALPLAN );
361379}
0 commit comments