Index: apps/app_dial.c
===================================================================
--- head/apps/app_dial.c
+++ local/apps/app_dial.c
@@ -467,6 +467,20 @@
Allow the calling party to enable recording of the call by sending
the DTMF sequence defined for one-touch automixmonitor in features.conf.
+
+
@@ -609,6 +623,8 @@
#define OPT_CALLER_ANSWER (1LLU << 40)
#define OPT_PREDIAL_CALLEE (1LLU << 41)
#define OPT_PREDIAL_CALLER (1LLU << 42)
+#define OPT_RINGING_MACRO (1LLU << 43)
+#define OPT_PROGRESS_MACRO (1LLU << 44)
enum {
OPT_ARG_ANNOUNCE = 0,
@@ -632,6 +648,8 @@
OPT_ARG_PREDIAL_CALLER,
/* note: this entry _MUST_ be the last one in the enum */
OPT_ARG_ARRAY_SIZE,
+ OPT_ARG_PROGRESS_MACRO,
+ OPT_ARG_RINGING_MACRO,
};
AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS
@@ -674,13 +692,15 @@
AST_APP_OPTION('W', OPT_CALLER_MONITOR),
AST_APP_OPTION('x', OPT_CALLEE_MIXMONITOR),
AST_APP_OPTION('X', OPT_CALLER_MIXMONITOR),
+ AST_APP_OPTION_ARG('y', OPT_PROGRESS_MACRO, OPT_ARG_PROGRESS_MACRO),
+ AST_APP_OPTION_ARG('Y', OPT_RINGING_MACRO, OPT_ARG_RINGING_MACRO),
AST_APP_OPTION('z', OPT_CANCEL_TIMEOUT),
END_OPTIONS );
#define CAN_EARLY_BRIDGE(flags,chan,peer) (!ast_test_flag64(flags, OPT_CALLEE_HANGUP | \
OPT_CALLER_HANGUP | OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER | \
OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR | OPT_CALLEE_PARK | \
- OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB) && \
+ OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_PROGRESS_MACRO | OPT_RINGING_MACRO | OPT_CALLEE_GOSUB) && \
!ast_channel_audiohooks(chan) && !ast_channel_audiohooks(peer) && \
ast_framehook_list_is_empty(ast_channel_framehooks(chan)) && ast_framehook_list_is_empty(ast_channel_framehooks(peer)))
@@ -1398,6 +1418,7 @@
++num_ringing;
if (ignore_cc || cc_frame_received || num_ringing == numlines) {
ast_verb(3, "%s is ringing\n", ast_channel_name(c));
+
/* Setup early media if appropriate */
if (single && !caller_entertained
&& CAN_EARLY_BRIDGE(peerflags, in, c)) {
@@ -1407,6 +1428,12 @@
ast_indicate(in, AST_CONTROL_RINGING);
pa->sentringing++;
}
+
+ /* Handle macro callback for this callee-ring event */
+ if(!ast_strlen_zero(opt_args[OPT_ARG_RINGING_MACRO])){
+ ast_log(LOG_NOTICE, "Executing callback macro '%s' for ringing event\n", opt_args[OPT_ARG_RINGING_MACRO]);
+ ast_app_exec_macro(in, c, opt_args[OPT_ARG_RINGING_MACRO]);
+ }
}
break;
case AST_CONTROL_PROGRESS:
@@ -1427,6 +1454,10 @@
dtmf_progress);
ast_dtmf_stream(c, in, dtmf_progress, 250, 0);
}
+ if(!ast_strlen_zero(opt_args[OPT_ARG_PROGRESS_MACRO])){
+ ast_log(LOG_NOTICE, "Executing callback macro '%s' for progress event\n", opt_args[OPT_ARG_PROGRESS_MACRO]);
+ ast_app_exec_macro(in, c, opt_args[OPT_ARG_PROGRESS_MACRO]);
+ }
break;
case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE:
@@ -2303,7 +2334,8 @@
/* Set per dial instance flags. These flags are also passed back to RetryDial. */
ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID
| OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING | OPT_CANCEL_TIMEOUT
- | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_FORCECLID);
+ | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_RINGING_MACRO | OPT_PROGRESS_MACRO
+ | OPT_CALLEE_GOSUB | OPT_FORCECLID);
/* PREDIAL: Run gosub on the caller's channel */
if (ast_test_flag64(&opts, OPT_PREDIAL_CALLER)