Index: CHANGES =================================================================== --- CHANGES (revision 149587) +++ CHANGES (working copy) @@ -229,6 +229,7 @@ o atxfernoanswertimeout variable added o parkcall variable added (one step parking) o improved documentation for dynamic feature declarations! + o added parkedcallltransfers option to control builtin transfers with parking 9. iax.conf o adsi variable added o mohinterpret variable added Index: configs/features.conf.sample =================================================================== --- configs/features.conf.sample (revision 149587) +++ configs/features.conf.sample (working copy) @@ -15,6 +15,8 @@ ; or the Touch Monitor is activated/deactivated. ;parkedplay = caller ; Who to play the courtesy tone to when picking up a parked call ; one of: parked, caller, both (default is caller) +;parkedcalltransfers = caller ; Enables or disables DTMF based transfers when picking up a parked call. + ; one of: callee, caller, both, no (default is both) ;adsipark = yes ; if you want ADSI parking announcements ;findslot => next ; Continue to the 'next' free parking space. ; Defaults to 'first' available Index: res/res_features.c =================================================================== --- res/res_features.c (revision 149587) +++ res/res_features.c (working copy) @@ -92,6 +92,8 @@ static int parking_start; /*!< First available extension for parking */ static int parking_stop; /*!< Last available extension for parking */ +static int parkedcalltransfers; /*!< Who can REDIRECT after picking up a parked a call */ + static char courtesytone[256]; /*!< Courtesy tone */ static int parkedplay = 0; /*!< Who to play the courtesy tone to */ static char xfersound[256]; /*!< Call transfer sound */ @@ -2192,8 +2194,13 @@ pbx_builtin_setvar_helper(chan, "PARKEDCHANNEL", peer->name); ast_cdr_setdestchan(chan->cdr, peer->name); memset(&config, 0, sizeof(struct ast_bridge_config)); - ast_set_flag(&(config.features_callee), AST_FEATURE_REDIRECT); - ast_set_flag(&(config.features_caller), AST_FEATURE_REDIRECT); + + if ((parkedcalltransfers == AST_FEATURE_FLAG_BYCALLEE) || (parkedcalltransfers == AST_FEATURE_FLAG_BYBOTH)) { + ast_set_flag(&(config.features_callee), AST_FEATURE_REDIRECT); + } + if ((parkedcalltransfers == AST_FEATURE_FLAG_BYCALLER) || (parkedcalltransfers == AST_FEATURE_FLAG_BYBOTH)) { + ast_set_flag(&(config.features_caller), AST_FEATURE_REDIRECT); + } res = ast_bridge_call(chan, peer, &config); pbx_builtin_setvar_helper(chan, "PARKEDCHANNEL", peer->name); @@ -2484,6 +2491,7 @@ parkfindnext = 0; adsipark = 0; parkaddhints = 0; + parkedcalltransfers = AST_FEATURE_FLAG_BYBOTH; transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT; featuredigittimeout = DEFAULT_FEATURE_DIGIT_TIMEOUT; @@ -2516,6 +2524,15 @@ parkfindnext = (!strcasecmp(var->value, "next")); } else if (!strcasecmp(var->name, "parkinghints")) { parkaddhints = ast_true(var->value); + } else if (!strcasecmp(var->name, "parkedcalltransfers")) { + if (!strcasecmp(var->value, "no")) + parkedcalltransfers = 0; + else if (!strcasecmp(var->value, "caller")) + parkedcalltransfers = AST_FEATURE_FLAG_BYCALLER; + else if (!strcasecmp(var->value, "callee")) + parkedcalltransfers = AST_FEATURE_FLAG_BYCALLEE; + else if (!strcasecmp(var->value, "both")) + parkedcalltransfers = AST_FEATURE_FLAG_BYBOTH; } else if (!strcasecmp(var->name, "adsipark")) { adsipark = ast_true(var->value); } else if (!strcasecmp(var->name, "transferdigittimeout")) {