--- res_features.c.orig 2004-09-26 15:47:01.000000000 -0500 +++ res_features.c 2004-10-22 18:58:20.000000000 -0500 @@ -299,6 +299,14 @@ struct ast_channel *transferee; struct timeval start, end; char *transferer_real_context; + +/* BEGIN PATCH FOR DOUBLE-HASH */ + int ms; + int result; + int sip_chan; + struct ast_frame *ft; +/* END PATCH FOR DOUBLE-HASH */ + int allowdisconnect_in,allowdisconnect_out,allowredirect_in,allowredirect_out; char *monitor_exec; @@ -407,6 +415,36 @@ transferer = chan; transferee = peer; } + +/* BEGIN PATCH FOR DOUBLE-HASH */ + sip_chan = ( !strcmp(transferer->type,"SIP") || !strcmp(transferer->type, "sip") ); + result = 0; + if( sip_chan) { + ms = 1000; /* ms */ + ft = 0; + while(ms ) { + ms = ast_waitfor(transferer, ms); + if (ms > 0) { + ft = ast_read(transferer); + if (ft) { /* Got second keypress */ + if (ft->frametype == AST_FRAME_DTMF) { + result = ft->subclass; + if( result != '#') { + ast_write(transferee,f); + ast_write(transferee,ft); + } + ast_frfree(ft); + break; + } else + ast_frfree(ft); + } + } else + ast_write( transferee, f); + } + } + if( !sip_chan || result == '#') { +/* END PATCH FOR DOUBLE-HASH */ + if (!(transferer_real_context=pbx_builtin_getvar_helper(transferee, "TRANSFER_CONTEXT")) && !(transferer_real_context=pbx_builtin_getvar_helper(transferer, "TRANSFER_CONTEXT"))) { /* Use the non-macro context to transfer the call */ @@ -482,6 +520,10 @@ } else if (ast_exists_extension(transferee, transferer_real_context, newext, 1, transferer->callerid)) { ast_moh_stop(transferee); res=ast_autoservice_stop(transferee); +/* BEGIN PATCH FOR DOUBLE-HASH */ + ast_streamfile(transferer, "auth-thankyou", transferer->language); +/* END PATCH FOR DOUBLE-HASH */ + if (!transferee->pbx) { /* Doh! Use our handy async_goto funcitons */ if (option_verbose > 2) @@ -489,12 +531,22 @@ ,transferee->name, newext, transferer_real_context); if (ast_async_goto(transferee, transferer_real_context, newext, 1)) ast_log(LOG_WARNING, "Async goto fialed :(\n"); + +/* BEGIN PATCH FOR DOUBLE-HASH */ + ast_waitstream(transferer, 1000); +/* END PATCH FOR DOUBLE-HASH */ + res = -1; } else { /* Set the channel's new extension, since it exists, using transferer context */ strncpy(transferee->exten, newext, sizeof(transferee->exten)-1); strncpy(transferee->context, transferer_real_context, sizeof(transferee->context)-1); transferee->priority = 0; + +/* BEGIN PATCH FOR DOUBLE-HASH */ + ast_waitstream(transferer, 1000); +/* END PATCH FOR DOUBLE-HASH */ + ast_frfree(f); } break; @@ -516,6 +568,11 @@ if (option_verbose > 1) ast_verbose(VERBOSE_PREFIX_2 "Hungup during autoservice stop on '%s'\n", transferee->name); } + +/* BEGIN PATCH FOR DOUBLE-HASH */ + } +/* END PATCH FOR DOUBLE-HASH */ + } else { if (f && (f->frametype == AST_FRAME_DTMF)) { if (who == peer)