Author: rmudgett Date: Wed Aug 20 11:18:31 2014 New Revision: 421560 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=421560 Log: Resolve, reset.
Modified: team/rmudgett/bridge_tasks/ (props changed) team/rmudgett/bridge_tasks/include/asterisk/stasis_bridges.h team/rmudgett/bridge_tasks/main/bridge.c team/rmudgett/bridge_tasks/main/manager.c team/rmudgett/bridge_tasks/main/stasis_bridges.c team/rmudgett/bridge_tasks/res/ari/ari_model_validators.c team/rmudgett/bridge_tasks/res/ari/ari_model_validators.h team/rmudgett/bridge_tasks/res/stasis/app.c team/rmudgett/bridge_tasks/rest-api/api-docs/events.json team/rmudgett/bridge_tasks/tests/test_cel.c Propchange: team/rmudgett/bridge_tasks/ ------------------------------------------------------------------------------ automerge = * Propchange: team/rmudgett/bridge_tasks/ ------------------------------------------------------------------------------ Binary property 'branch-13-merged' - no diff available. Propchange: team/rmudgett/bridge_tasks/ ------------------------------------------------------------------------------ --- bridge_tasks-integrated (original) +++ bridge_tasks-integrated Wed Aug 20 11:18:31 2014 @@ -1,1 +1,1 @@ -/trunk:1-421506 +/trunk:1-421559 Modified: team/rmudgett/bridge_tasks/include/asterisk/stasis_bridges.h URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/include/asterisk/stasis_bridges.h?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/include/asterisk/stasis_bridges.h (original) +++ team/rmudgett/bridge_tasks/include/asterisk/stasis_bridges.h Wed Aug 20 11:18:31 2014 @@ -300,6 +300,8 @@ char exten[AST_MAX_EXTENSION]; /*! Transferee channel. NULL if there were multiple transferee channels */ struct ast_channel_snapshot *transferee; + /*! The channel replacing the transferer when multiple parties are being transferred */ + struct ast_channel_snapshot *replace_channel; }; /*! @@ -312,11 +314,15 @@ * \param to_transferee The bridge between the transferer and transferee plus the transferer channel * \param context The destination context for the blind transfer * \param exten The destination extension for the blind transfer - * \param transferee_channel If a single channel is being transferred, this is it. If multiple parties are being transferred, this is NULL. + * \param transferee_channel If a single channel is being transferred, this is it. If + * multiple parties are being transferred, this is NULL. + * \param replace_channel If multiple parties are being transferred or the transfer + * cannot reach across the bridge due to bridge flags, this is + * the channel connecting their bridge to the destination. */ void ast_bridge_publish_blind_transfer(int is_external, enum ast_transfer_result result, struct ast_bridge_channel_pair *to_transferee, const char *context, const char *exten, - struct ast_channel *transferee_channel); + struct ast_channel *transferee_channel, struct ast_channel *replace_channel); enum ast_attended_transfer_dest_type { /*! The transfer failed, so there is no appropriate final state */ Modified: team/rmudgett/bridge_tasks/main/bridge.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/main/bridge.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/main/bridge.c (original) +++ team/rmudgett/bridge_tasks/main/bridge.c Wed Aug 20 11:18:31 2014 @@ -3832,6 +3832,26 @@ return mute; } +static void publish_blind_transfer_full(int is_external, enum ast_transfer_result result, + struct ast_channel *transferer, struct ast_bridge *bridge, + const char *context, const char *exten, struct ast_channel *transferee_channel, + struct ast_channel *replace_channel) +{ + struct ast_bridge_channel_pair pair; + + pair.channel = transferer; + pair.bridge = bridge; + + if (bridge) { + ast_bridge_lock(bridge); + } + ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten, + transferee_channel, replace_channel); + if (bridge) { + ast_bridge_unlock(bridge); + } +} + /*! * \internal * \brief Transfer an entire bridge to a specific destination. @@ -3844,16 +3864,21 @@ * bridges, this method is only used for multi-party bridges since this method would * be less efficient for two-party bridges. * + * \param is_external Whether the transfer is externally initiated * \param transferer The channel performing a transfer * \param bridge The bridge where the transfer is being performed * \param exten The destination extension for the blind transfer + * \param transferee The party being transferred if there is only one * \param context The destination context for the blind transfer * \param hook Framehook to attach to local channel + * * \return The success or failure of the operation */ -static enum ast_transfer_result blind_transfer_bridge(struct ast_channel *transferer, - struct ast_bridge *bridge, const char *exten, const char *context, - transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper) +static enum ast_transfer_result blind_transfer_bridge(int is_external, + struct ast_channel *transferer, struct ast_bridge *bridge, + const char *exten, const char *context, struct ast_channel *transferee, + transfer_channel_cb new_channel_cb, + struct transfer_channel_data *user_data_wrapper) { struct ast_channel *local; char chan_name[AST_MAX_EXTENSION + AST_MAX_CONTEXT + 2]; @@ -3885,6 +3910,8 @@ ast_hangup(local); return AST_BRIDGE_TRANSFER_FAIL; } + publish_blind_transfer_full(is_external, AST_BRIDGE_TRANSFER_SUCCESS, transferer, bridge, + context, exten, transferee, local); return AST_BRIDGE_TRANSFER_SUCCESS; } @@ -4241,16 +4268,8 @@ struct ast_channel *transferer, struct ast_bridge *bridge, const char *context, const char *exten, struct ast_channel *transferee_channel) { - struct ast_bridge_channel_pair pair; - pair.channel = transferer; - pair.bridge = bridge; - if (bridge) { - ast_bridge_lock(bridge); - } - ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten, transferee_channel); - if (bridge) { - ast_bridge_unlock(bridge); - } + publish_blind_transfer_full(is_external, result, transferer, bridge, context, + exten, transferee_channel, NULL); } enum ast_transfer_result ast_bridge_transfer_blind(int is_external, @@ -4328,8 +4347,12 @@ set_transfer_variables_all(transferer, channels, 0); if (do_bridge_transfer) { - transfer_result = blind_transfer_bridge(transferer, bridge, exten, context, - new_channel_cb, user_data_wrapper); + /* if blind_transfer_bridge succeeds, it publishes its own message */ + transfer_result = blind_transfer_bridge(is_external, transferer, bridge, + exten, context, transferee, new_channel_cb, user_data_wrapper); + if (transfer_result == AST_BRIDGE_TRANSFER_SUCCESS) { + return transfer_result; + } goto publish; } Modified: team/rmudgett/bridge_tasks/main/manager.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/main/manager.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/main/manager.c (original) +++ team/rmudgett/bridge_tasks/main/manager.c Wed Aug 20 11:18:31 2014 @@ -216,6 +216,14 @@ </parameter> <parameter name="Variables"> <para>Comma <literal>,</literal> separated list of variable to include.</para> + </parameter> + <parameter name="AllVariables"> + <para>If set to "true", the Status event will include all channel variables for + the requested channel(s).</para> + <enumlist> + <enum name="true"/> + <enum name="false"/> + </enumlist> </parameter> </syntax> <description> @@ -3929,19 +3937,132 @@ return 0; } +static void generate_status(struct mansession *s, struct ast_channel *chan, char **vars, int varc, int all_variables, char *id_text) +{ + struct timeval now; + long elapsed_seconds; + struct ast_bridge *bridge; + RAII_VAR(struct ast_str *, variable_str, NULL, ast_free); + struct ast_str *write_transpath = ast_str_alloca(256); + struct ast_str *read_transpath = ast_str_alloca(256); + struct ast_str *codec_buf = ast_str_alloca(128); + struct ast_party_id effective_id; + int i; + RAII_VAR(struct ast_channel_snapshot *, snapshot, + ast_channel_snapshot_get_latest(ast_channel_uniqueid(chan)), + ao2_cleanup); + RAII_VAR(struct ast_str *, snapshot_str, NULL, ast_free); + + if (!snapshot) { + return; + } + + snapshot_str = ast_manager_build_channel_state_string(snapshot); + if (!snapshot_str) { + return; + } + + if (all_variables) { + variable_str = ast_str_create(2048); + } else { + variable_str = ast_str_create(1024); + } + + if (!variable_str) { + return; + } + + now = ast_tvnow(); + elapsed_seconds = ast_tvdiff_sec(now, ast_channel_creationtime(chan)); + + /* Even if all_variables has been specified, explicitly requested variables + * may be global variables or dialplan functions */ + for (i = 0; i < varc; i++) { + char valbuf[512], *ret = NULL; + + if (vars[i][strlen(vars[i]) - 1] == ')') { + if (ast_func_read(chan, vars[i], valbuf, sizeof(valbuf)) < 0) { + valbuf[0] = '\0'; + } + ret = valbuf; + } else { + pbx_retrieve_variable(chan, vars[i], &ret, valbuf, sizeof(valbuf), NULL); + } + + ast_str_append(&variable_str, 0, "Variable: %s=%s\r\n", vars[i], ret); + } + + /* Walk all channel variables and add them */ + if (all_variables) { + struct ast_var_t *variables; + + AST_LIST_TRAVERSE(ast_channel_varshead(chan), variables, entries) { + ast_str_append(&variable_str, 0, "Variable: %s=%s\r\n", + ast_var_name(variables), ast_var_value(variables)); + } + } + + bridge = ast_channel_get_bridge(chan); + effective_id = ast_channel_connected_effective_id(chan); + + astman_append(s, + "Event: Status\r\n" + "Privilege: Call\r\n" + "%s" + "Type: %s\r\n" + "DNID: %s\r\n" + "EffectiveConnectedLineNum: %s\r\n" + "EffectiveConnectedLineName: %s\r\n" + "TimeToHangup: %ld\r\n" + "BridgeID: %s\r\n" + "Linkedid: %s\r\n" + "Application: %s\r\n" + "Data: %s\r\n" + "Nativeformats: %s\r\n" + "Readformat: %s\r\n" + "Readtrans: %s\r\n" + "Writeformat: %s\r\n" + "Writetrans: %s\r\n" + "Callgroup: %llu\r\n" + "Pickupgroup: %llu\r\n" + "Seconds: %ld\r\n" + "%s" + "%s" + "\r\n", + ast_str_buffer(snapshot_str), + ast_channel_tech(chan)->type, + S_OR(ast_channel_dialed(chan)->number.str, ""), + S_COR(effective_id.number.valid, effective_id.number.str, "<unknown>"), + S_COR(effective_id.name.valid, effective_id.name.str, "<unknown>"), + ast_channel_whentohangup(chan)->tv_sec, + bridge ? bridge->uniqueid : "", + ast_channel_linkedid(chan), + ast_channel_appl(chan), + ast_channel_data(chan), + ast_format_cap_get_names(ast_channel_nativeformats(chan), &codec_buf), + ast_format_get_name(ast_channel_readformat(chan)), + ast_translate_path_to_str(ast_channel_readtrans(chan), &read_transpath), + ast_format_get_name(ast_channel_writeformat(chan)), + ast_translate_path_to_str(ast_channel_writetrans(chan), &write_transpath), + ast_channel_callgroup(chan), + ast_channel_pickupgroup(chan), + (long)elapsed_seconds, + ast_str_buffer(variable_str), + id_text); + + ao2_cleanup(bridge); +} + /*! \brief Manager "status" command to show channels */ -/* Needs documentation... */ static int action_status(struct mansession *s, const struct message *m) { const char *name = astman_get_header(m, "Channel"); const char *chan_variables = astman_get_header(m, "Variables"); + const char *all_chan_variables = astman_get_header(m, "AllVariables"); + int all_variables = 0; const char *id = astman_get_header(m, "ActionID"); char *variables = ast_strdupa(S_OR(chan_variables, "")); - struct ast_str *variable_str = ast_str_create(1024); - struct ast_str *write_transpath = ast_str_alloca(256); - struct ast_str *read_transpath = ast_str_alloca(256); struct ast_channel *chan; - struct ast_str *codec_buf = ast_str_alloca(64); int channels = 0; int all = ast_strlen_zero(name); /* set if we want all channels */ char id_text[256]; @@ -3950,20 +4071,17 @@ AST_APP_ARG(name)[100]; ); - if (!variable_str) { - astman_send_error(s, m, "Memory Allocation Failure"); - return 1; + if (!ast_strlen_zero(all_chan_variables)) { + all_variables = ast_true(all_chan_variables); } if (!(function_capable_string_allowed_with_auths(variables, s->session->writeperm))) { - ast_free(variable_str); astman_send_error(s, m, "Status Access Forbidden: Variables"); return 0; } if (all) { if (!(it_chans = ast_channel_iterator_all_new())) { - ast_free(variable_str); astman_send_error(s, m, "Memory Allocation Failure"); return 1; } @@ -3972,7 +4090,6 @@ chan = ast_channel_get_by_name(name); if (!chan) { astman_send_error(s, m, "No such channel"); - ast_free(variable_str); return 0; } } @@ -3991,106 +4108,10 @@ /* if we look by name, we break after the first iteration */ for (; chan; all ? chan = ast_channel_iterator_next(it_chans) : 0) { - struct timeval now; - long elapsed_seconds; - struct ast_bridge *bridge; - ast_channel_lock(chan); - now = ast_tvnow(); - elapsed_seconds = ast_tvdiff_sec(now, ast_channel_creationtime(chan)); - - if (!ast_strlen_zero(chan_variables)) { - int i; - ast_str_reset(variable_str); - for (i = 0; i < vars.argc; i++) { - char valbuf[512], *ret = NULL; - - if (vars.name[i][strlen(vars.name[i]) - 1] == ')') { - if (ast_func_read(chan, vars.name[i], valbuf, sizeof(valbuf)) < 0) { - valbuf[0] = '\0'; - } - ret = valbuf; - } else { - pbx_retrieve_variable(chan, vars.name[i], &ret, valbuf, sizeof(valbuf), NULL); - } - - ast_str_append(&variable_str, 0, "Variable: %s=%s\r\n", vars.name[i], ret); - } - } - + generate_status(s, chan, vars.name, vars.argc, all_variables, id_text); channels++; - - bridge = ast_channel_get_bridge(chan); - - astman_append(s, - "Event: Status\r\n" - "Privilege: Call\r\n" - "Channel: %s\r\n" - "ChannelState: %u\r\n" - "ChannelStateDesc: %s\r\n" - "CallerIDNum: %s\r\n" - "CallerIDName: %s\r\n" - "ConnectedLineNum: %s\r\n" - "ConnectedLineName: %s\r\n" - "Accountcode: %s\r\n" - "Context: %s\r\n" - "Exten: %s\r\n" - "Priority: %d\r\n" - "Uniqueid: %s\r\n" - "Type: %s\r\n" - "DNID: %s\r\n" - "EffectiveConnectedLineNum: %s\r\n" - "EffectiveConnectedLineName: %s\r\n" - "TimeToHangup: %ld\r\n" - "BridgeID: %s\r\n" - "Linkedid: %s\r\n" - "Application: %s\r\n" - "Data: %s\r\n" - "Nativeformats: %s\r\n" - "Readformat: %s\r\n" - "Readtrans: %s\r\n" - "Writeformat: %s\r\n" - "Writetrans: %s\r\n" - "Callgroup: %llu\r\n" - "Pickupgroup: %llu\r\n" - "Seconds: %ld\r\n" - "%s" - "%s" - "\r\n", - ast_channel_name(chan), - ast_channel_state(chan), - ast_state2str(ast_channel_state(chan)), - S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, "<unknown>"), - S_COR(ast_channel_caller(chan)->id.name.valid, ast_channel_caller(chan)->id.name.str, "<unknown>"), - S_COR(ast_channel_connected(chan)->id.number.valid, ast_channel_connected(chan)->id.number.str, "<unknown>"), - S_COR(ast_channel_connected(chan)->id.name.valid, ast_channel_connected(chan)->id.name.str, "<unknown>"), - ast_channel_accountcode(chan), - ast_channel_context(chan), - ast_channel_exten(chan), - ast_channel_priority(chan), - ast_channel_uniqueid(chan), - ast_channel_tech(chan)->type, - S_OR(ast_channel_dialed(chan)->number.str, ""), - S_COR(ast_channel_connected_effective_id(chan).number.valid, ast_channel_connected_effective_id(chan).number.str, "<unknown>"), - S_COR(ast_channel_connected_effective_id(chan).name.valid, ast_channel_connected_effective_id(chan).name.str, "<unknown>"), - ast_channel_whentohangup(chan)->tv_sec, - bridge ? bridge->uniqueid : "", - ast_channel_linkedid(chan), - ast_channel_appl(chan), - ast_channel_data(chan), - ast_format_cap_get_names(ast_channel_nativeformats(chan), &codec_buf), - ast_format_get_name(ast_channel_readformat(chan)), - ast_translate_path_to_str(ast_channel_readtrans(chan), &read_transpath), - ast_format_get_name(ast_channel_writeformat(chan)), - ast_translate_path_to_str(ast_channel_writetrans(chan), &write_transpath), - ast_channel_callgroup(chan), - ast_channel_pickupgroup(chan), - (long)elapsed_seconds, - ast_str_buffer(variable_str), - id_text); - - ao2_cleanup(bridge); ast_channel_unlock(chan); chan = ast_channel_unref(chan); @@ -4105,8 +4126,6 @@ "%s" "Items: %d\r\n" "\r\n", id_text, channels); - - ast_free(variable_str); return 0; } Modified: team/rmudgett/bridge_tasks/main/stasis_bridges.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/main/stasis_bridges.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/main/stasis_bridges.c (original) +++ team/rmudgett/bridge_tasks/main/stasis_bridges.c Wed Aug 20 11:18:31 2014 @@ -636,7 +636,10 @@ const struct stasis_message_sanitizer *sanitize) { struct ast_blind_transfer_message *transfer_msg = stasis_message_data(msg); - struct ast_json *json_transferer, *json_transferee = NULL, *out; + struct ast_json *json_transferer; + struct ast_json *json_transferee = NULL; + struct ast_json *out; + struct ast_json *json_replace = NULL; const struct timeval *tv = stasis_message_timestamp(msg); json_transferer = ast_channel_snapshot_to_json(transfer_msg->to_transferee.channel_snapshot, sanitize); @@ -647,6 +650,16 @@ if (transfer_msg->transferee) { json_transferee = ast_channel_snapshot_to_json(transfer_msg->transferee, sanitize); if (!json_transferee) { + ast_json_unref(json_transferer); + return NULL; + } + } + + if (transfer_msg->replace_channel) { + json_replace = ast_channel_snapshot_to_json(transfer_msg->replace_channel, sanitize); + if (!json_replace) { + ast_json_unref(json_transferee); + ast_json_unref(json_transferer); return NULL; } } @@ -661,10 +674,18 @@ "is_external", ast_json_boolean(transfer_msg->is_external)); if (!out) { + ast_json_unref(json_transferee); + ast_json_unref(json_replace); return NULL; } if (json_transferee && ast_json_object_set(out, "transferee", json_transferee)) { + ast_json_unref(out); + ast_json_unref(json_replace); + return NULL; + } + + if (json_replace && ast_json_object_set(out, "replace_channel", json_replace)) { ast_json_unref(out); return NULL; } @@ -741,7 +762,7 @@ void ast_bridge_publish_blind_transfer(int is_external, enum ast_transfer_result result, struct ast_bridge_channel_pair *transferer, const char *context, const char *exten, - struct ast_channel *transferee_channel) + struct ast_channel *transferee_channel, struct ast_channel *replace_channel) { struct ast_blind_transfer_message *msg; struct stasis_message *stasis; @@ -758,6 +779,9 @@ if (transferee_channel) { msg->transferee = ast_channel_snapshot_get_latest(ast_channel_uniqueid(transferee_channel)); + } + if (replace_channel) { + msg->replace_channel = ast_channel_snapshot_get_latest(ast_channel_uniqueid(replace_channel)); } msg->is_external = is_external; msg->result = result; Modified: team/rmudgett/bridge_tasks/res/ari/ari_model_validators.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/res/ari/ari_model_validators.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/res/ari/ari_model_validators.c (original) +++ team/rmudgett/bridge_tasks/res/ari/ari_model_validators.c Wed Aug 20 11:18:31 2014 @@ -2062,6 +2062,15 @@ res = 0; } } else + if (strcmp("replace_channel", ast_json_object_iter_key(iter)) == 0) { + int prop_is_valid; + prop_is_valid = ast_ari_validate_channel( + ast_json_object_iter_value(iter)); + if (!prop_is_valid) { + ast_log(LOG_ERROR, "ARI BridgeBlindTransfer field replace_channel failed validation\n"); + res = 0; + } + } else if (strcmp("result", ast_json_object_iter_key(iter)) == 0) { int prop_is_valid; has_result = 1; Modified: team/rmudgett/bridge_tasks/res/ari/ari_model_validators.h URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/res/ari/ari_model_validators.h?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/res/ari/ari_model_validators.h (original) +++ team/rmudgett/bridge_tasks/res/ari/ari_model_validators.h Wed Aug 20 11:18:31 2014 @@ -1304,6 +1304,7 @@ * - context: string (required) * - exten: string (required) * - is_external: boolean (required) + * - replace_channel: Channel * - result: string (required) * - transferee: Channel * BridgeCreated Modified: team/rmudgett/bridge_tasks/res/stasis/app.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/res/stasis/app.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/res/stasis/app.c (original) +++ team/rmudgett/bridge_tasks/res/stasis/app.c Wed Aug 20 11:18:31 2014 @@ -696,19 +696,6 @@ return subscribed; } -static void bridge_blind_transfer_handler(void *data, struct stasis_subscription *sub, - struct stasis_message *message) -{ - struct stasis_app *app = data; - struct ast_blind_transfer_message *transfer_msg = stasis_message_data(message); - struct ast_bridge_snapshot *bridge = transfer_msg->to_transferee.bridge_snapshot; - - if (bridge_app_subscribed(app, transfer_msg->to_transferee.channel_snapshot->uniqueid) || - (bridge && bridge_app_subscribed_involved(app, bridge))) { - stasis_publish(app->topic, message); - } -} - static void set_replacement_channel(struct ast_channel_snapshot *to_be_replaced, struct ast_channel_snapshot *replacing) { @@ -724,6 +711,24 @@ } ast_channel_cleanup(chan); ao2_cleanup(control); +} + +static void bridge_blind_transfer_handler(void *data, struct stasis_subscription *sub, + struct stasis_message *message) +{ + struct stasis_app *app = data; + struct ast_blind_transfer_message *transfer_msg = stasis_message_data(message); + struct ast_bridge_snapshot *bridge = transfer_msg->to_transferee.bridge_snapshot; + + if (transfer_msg->replace_channel) { + set_replacement_channel(transfer_msg->to_transferee.channel_snapshot, + transfer_msg->replace_channel); + } + + if (bridge_app_subscribed(app, transfer_msg->to_transferee.channel_snapshot->uniqueid) || + (bridge && bridge_app_subscribed_involved(app, bridge))) { + stasis_publish(app->topic, message); + } } static void bridge_attended_transfer_handler(void *data, struct stasis_subscription *sub, Modified: team/rmudgett/bridge_tasks/rest-api/api-docs/events.json URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/rest-api/api-docs/events.json?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/rest-api/api-docs/events.json (original) +++ team/rmudgett/bridge_tasks/rest-api/api-docs/events.json Wed Aug 20 11:18:31 2014 @@ -285,6 +285,11 @@ "required": true, "type": "Channel" }, + "replace_channel": { + "description": "The channel that is replacing transferer when the transferee(s) can not be transferred directly", + "required": false, + "type": "Channel" + }, "transferee": { "description": "The channel that is being transferred", "required": false, Modified: team/rmudgett/bridge_tasks/tests/test_cel.c URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_tasks/tests/test_cel.c?view=diff&rev=421560&r1=421559&r2=421560 ============================================================================== --- team/rmudgett/bridge_tasks/tests/test_cel.c (original) +++ team/rmudgett/bridge_tasks/tests/test_cel.c Wed Aug 20 11:18:31 2014 @@ -1257,7 +1257,7 @@ pair.channel = chan_alice; ast_bridge_lock(bridge); ast_bridge_publish_blind_transfer(1, AST_BRIDGE_TRANSFER_SUCCESS, - &pair, "transfer_context", "transfer_extension", NULL); + &pair, "transfer_context", "transfer_extension", NULL, NULL); ast_bridge_unlock(bridge); BLINDTRANSFER_EVENT(chan_alice, bridge, "transfer_extension", "transfer_context"); -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits