Index: res/res_features.c =================================================================== RCS file: /usr/cvsroot/asterisk/res/res_features.c,v retrieving revision 1.21 diff -u -r1.21 res_features.c --- res/res_features.c 3 Nov 2004 22:37:55 -0000 1.21 +++ res/res_features.c 4 Dec 2004 06:57:48 -0000 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -299,9 +300,13 @@ struct ast_option_header *aoh; struct ast_channel *transferer; struct ast_channel *transferee; + struct ast_channel *recorder; struct timeval start, end; char *transferer_real_context; + char *reckey; + char recordkey; int allowdisconnect_in,allowdisconnect_out,allowredirect_in,allowredirect_out; + int recording = 0; char *monitor_exec; if (chan && peer) { @@ -412,7 +417,50 @@ res = -1; break; } - + /* Find out if we're supposed to record this call */ + if (f && (f->frametype == AST_FRAME_DTMF)) { + reckey = pbx_builtin_getvar_helper(chan, "RECORDKEY"); + if (reckey) { + recordkey = *reckey; + if (f->subclass == (int)recordkey) { + if (who == peer) + recorder = peer; + else + recorder = chan; + if ((option_verbose > 3)&&(recording == 0)) + ast_verbose(VERBOSE_PREFIX_3 "User hit '%s', starting recording.\n", &recordkey); + else if ((option_verbose >3)&&(recording == 1)) + ast_verbose(VERBOSE_PREFIX_3 "User hit '%s', ending recording.\n", &recordkey); + if (recording == 0) { + recording = 1; + res = ast_play_and_wait(recorder, "beep"); + f->frametype = AST_FRAME_NULL; + if (monitor_app) { + res = pbx_exec(chan, monitor_app, pbx_builtin_getvar_helper(chan, "MYMONITOR"), 1); + } else { + if((monitor_app = pbx_findapp("Monitor"))) + res = pbx_exec(chan, monitor_app, pbx_builtin_getvar_helper(chan, "MYMONITOR"), 1); + else + res = -1; + break; + } + } else { + recording = 0; + if (monitor_app) + res = ast_monitor_stop(chan, 1); + else + ast_log(LOG_ERROR, "Unable to stop monitor on %s!! Recording will end when channel disconnects.\n", recorder->name); + res = ast_play_and_wait(recorder, "beep"); + if (!res) + ast_play_and_wait(recorder, "beep"); + f->frametype = AST_FRAME_NULL; + } + if (res) + break; + } + } + } + /* If the user hit '#', transfer */ if ((f->frametype == AST_FRAME_DTMF) && ((allowredirect_in && who == peer) || (allowredirect_out && who == chan)) && (f->subclass == '#')) {