diff options
Diffstat (limited to 'res')
-rw-r--r-- | res/res_features.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/res/res_features.c b/res/res_features.c index b62c299e0..1f01f71c6 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -570,10 +570,11 @@ static void set_peers(struct ast_channel **caller, struct ast_channel **callee, * \param config unsed * \param code unused * \param sense feature options + * \param data * Setup channel, set return exten,priority to 's,1' * answer chan, sleep chan, park call */ -static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { struct ast_channel *parker; struct ast_channel *parkee; @@ -613,12 +614,13 @@ static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, * \param config * \param code * \param sense + * \param data * Check monitor app enabled, setup channels, both caller/callee chans not null * get TOUCH_MONITOR variable for filename if exists, exec monitor app. * \retval FEATURE_RETURN_SUCCESS on success. * \retval -1 on error. */ -static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { char *caller_chan_id = NULL, *callee_chan_id = NULL, *args = NULL, *touch_filename = NULL; int x = 0; @@ -700,7 +702,7 @@ static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *pee return -1; } -static int builtin_disconnect(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int builtin_disconnect(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { ast_verb(4, "User hit '%s' to disconnect call.\n", code); return FEATURE_RETURN_HANGUP; @@ -739,12 +741,13 @@ static const char *real_ctx(struct ast_channel *transferer, struct ast_channel * * \param config * \param code * \param sense + * \param data * Place peer on hold, check if tranfered to parkinglot extension, * otherwise check extension exists and transfer caller. * \retval FEATURE_RETURN_SUCCESS. * \retval -1 on failure. */ -static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { struct ast_channel *transferer; struct ast_channel *transferee; @@ -858,12 +861,13 @@ static int check_compat(struct ast_channel *c, struct ast_channel *newchan) * \param config * \param code * \param sense + * \param data * Get extension to transfer to, if you cannot generate channel (or find extension) * return to host channel. After called channel answered wait for hangup of transferer, * bridge call between transfer peer (taking them off hold) to attended transfer channel. * \return -1 means what failure/success both? */ -static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { struct ast_channel *transferer; struct ast_channel *transferee; @@ -1311,20 +1315,13 @@ struct ast_call_feature *ast_find_call_feature(const char *name) * \retval -1 error. * \retval -2 when an application cannot be found. */ -static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense) +static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data) { struct ast_app *app; - struct ast_call_feature *feature; + struct ast_call_feature *feature = data; struct ast_channel *work, *idle; int res; - AST_LIST_LOCK(&feature_list); - AST_LIST_TRAVERSE(&feature_list, feature, feature_entry) { - if (!strcasecmp(feature->exten, code)) - break; - } - AST_LIST_UNLOCK(&feature_list); - if (!feature) { /* shouldn't ever happen! */ ast_log(LOG_NOTICE, "Found feature before, but at execing we've lost it??\n"); return -1; @@ -1437,7 +1434,7 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p !ast_strlen_zero(builtin_features[x].exten)) { /* Feature is up for consideration */ if (!strcmp(builtin_features[x].exten, code)) { - res = builtin_features[x].operation(chan, peer, config, code, sense); + res = builtin_features[x].operation(chan, peer, config, code, sense, NULL); break; } else if (!strncmp(builtin_features[x].exten, code, strlen(code))) { if (res == FEATURE_RETURN_PASSDIGITS) @@ -1458,7 +1455,7 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p fg = find_group(tok); if (fg && (fge = find_group_exten(fg, code))) { - res = fge->feature->operation(chan, peer, config, code, sense); + res = fge->feature->operation(chan, peer, config, code, sense, fge->feature); AST_RWLIST_UNLOCK(&feature_groups); continue; } @@ -1474,7 +1471,7 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p /* Feature is up for consideration */ if (!strcmp(feature->exten, code)) { ast_verb(3, " Feature Found: %s exten: %s\n",feature->sname, tok); - res = feature->operation(chan, peer, config, code, sense); + res = feature->operation(chan, peer, config, code, sense, feature); AST_LIST_UNLOCK(&feature_list); break; } else if (!strncmp(feature->exten, code, strlen(code))) |