diff options
-rw-r--r-- | apps/app_dial.c | 48 | ||||
-rw-r--r-- | apps/app_queue.c | 11 | ||||
-rw-r--r-- | include/asterisk/pbx.h | 2 | ||||
-rw-r--r-- | res/res_features.c | 89 |
4 files changed, 53 insertions, 97 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c index 41a6f7285..303b36121 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1837,37 +1837,29 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags res = -1; } - if (res != AST_PBX_NO_HANGUP_PEER && res != AST_PBX_NO_HANGUP_PEER_PARKED) { - if (res != AST_PBX_KEEPALIVE && !chan->_softhangup) - chan->hangupcause = peer->hangupcause; - ast_hangup(peer); - } + if (!chan->_softhangup) + chan->hangupcause = peer->hangupcause; + ast_hangup(peer); } out: - /* cleaning up chan is not a good idea here if AST_PBX_KEEPALIVE - is returned; chan will get the love it needs from another - thread */ - if (res != AST_PBX_KEEPALIVE) { - if (moh) { - moh = 0; - ast_moh_stop(chan); - } else if (sentringing) { - sentringing = 0; - ast_indicate(chan, -1); - } - ast_rtp_early_bridge(chan, NULL); - hanguptree(outgoing, NULL); - pbx_builtin_setvar_helper(chan, "DIALSTATUS", status); - if (option_debug) - ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status); - - if ((ast_test_flag(peerflags, OPT_GO_ON)) && (!chan->_softhangup) && (res != AST_PBX_KEEPALIVE)) { - if (timelimit) - chan->whentohangup = 0; - res = 0; - } + if (moh) { + moh = 0; + ast_moh_stop(chan); + } else if (sentringing) { + sentringing = 0; + ast_indicate(chan, -1); + } + ast_rtp_early_bridge(chan, NULL); + hanguptree(outgoing, NULL); + pbx_builtin_setvar_helper(chan, "DIALSTATUS", status); + if (option_debug) + ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status); + + if (ast_test_flag(peerflags, OPT_GO_ON) && !chan->_softhangup) { + if (calldurationlimit) + chan->whentohangup = 0; + res = 0; } - done: ast_module_user_remove(u); return res; diff --git a/apps/app_queue.c b/apps/app_queue.c index d0f81a699..25be3e4fc 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3155,7 +3155,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce transfer_ds = setup_transfer_datastore(qe, member, callstart, callcompletedinsl); bridge = ast_bridge_call(qe->chan,peer, &bridge_config); - if (bridge != AST_PBX_KEEPALIVE && !attended_transfer_occurred(qe->chan)) { + if (!attended_transfer_occurred(qe->chan)) { struct ast_datastore *tds; if (strcasecmp(oldcontext, qe->chan->context) || strcasecmp(oldexten, qe->chan->exten)) { ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld", @@ -3164,7 +3164,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } else if (qe->chan->_softhangup) { ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETECALLER", "%ld|%ld|%d", (long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos); - if (bridge != AST_PBX_NO_HANGUP_PEER && bridge != AST_PBX_NO_HANGUP_PEER_PARKED && qe->parent->eventwhencalled) + if (qe->parent->eventwhencalled) manager_event(EVENT_FLAG_AGENT, "AgentComplete", "Queue: %s\r\n" "Uniqueid: %s\r\n" @@ -3181,7 +3181,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } else { ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETEAGENT", "%ld|%ld|%d", (long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos); - if (bridge != AST_PBX_NO_HANGUP_PEER && bridge != AST_PBX_NO_HANGUP_PEER_PARKED && qe->parent->eventwhencalled) + if (qe->parent->eventwhencalled) manager_event(EVENT_FLAG_AGENT, "AgentComplete", "Queue: %s\r\n" "Uniqueid: %s\r\n" @@ -3206,8 +3206,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce if (transfer_ds) { ast_channel_datastore_free(transfer_ds); } - if (bridge != AST_PBX_NO_HANGUP_PEER && bridge != AST_PBX_NO_HANGUP_PEER_PARKED) - ast_hangup(peer); + ast_hangup(peer); res = bridge ? bridge : 1; ao2_ref(member, -1); } @@ -4079,7 +4078,7 @@ stop: } /* Don't allow return code > 0 */ - if (res >= 0 && res != AST_PBX_KEEPALIVE) { + if (res >= 0) { res = 0; if (ringing) { ast_indicate(chan, -1); diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index 001826380..0ac09f39d 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -38,8 +38,6 @@ extern "C" { /*! \brief Special return values from applications to the PBX { */ #define AST_PBX_KEEPALIVE 10 /*!< Destroy the thread, but don't hang up the channel */ -#define AST_PBX_NO_HANGUP_PEER 11 /*!< The peer has been involved in a transfer */ -#define AST_PBX_NO_HANGUP_PEER_PARKED 12 /*!< Don't touch the peer channel - it was sent to the parking lot and might be gone by now */ /*! } */ #define PRIORITY_HINT -1 /*!< Special Priority for a hint */ diff --git a/res/res_features.c b/res/res_features.c index 8e6799298..e476676f4 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -535,12 +535,8 @@ static int masq_park_call_announce(struct ast_channel *rchan, struct ast_channel { return masq_park_call(rchan, peer, timeout, extout, 1); } - #define FEATURE_RETURN_HANGUP -1 #define FEATURE_RETURN_SUCCESSBREAK 0 -#define FEATURE_RETURN_PBX_KEEPALIVE AST_PBX_KEEPALIVE -#define FEATURE_RETURN_NO_HANGUP_PEER AST_PBX_NO_HANGUP_PEER -#define FEATURE_RETURN_NO_HANGUP_PEER_PARKED AST_PBX_NO_HANGUP_PEER_PARKED #define FEATURE_RETURN_PASSDIGITS 21 #define FEATURE_RETURN_STOREDIGITS 22 #define FEATURE_RETURN_SUCCESS 23 @@ -575,30 +571,22 @@ static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, u = ast_module_user_add(chan); set_peers(&parker, &parkee, peer, chan, sense); - /* Setup the exten/priority to be s/1 since we don't know - where this call should return */ - strcpy(chan->exten, "s"); - chan->priority = 1; + /* we used to set chan's exten and priority to "s" and 1 + here, but this generates (in some cases) an invalid + extension, and if "s" exists, could errantly + cause execution of extensions you don't expect It + makes more sense to let nature take its course + when chan finishes, and let the pbx do its thing + and hang up when the park is over. + */ if (chan->_state != AST_STATE_UP) res = ast_answer(chan); if (!res) res = ast_safe_sleep(chan, 1000); - if (!res) { - if (sense == FEATURE_SENSE_CHAN) { - res = ast_park_call(parkee, parker, 0, NULL); - if (!res) { - if (sense == FEATURE_SENSE_CHAN) { - res = AST_PBX_NO_HANGUP_PEER_PARKED; - } else { - res = AST_PBX_KEEPALIVE; - } - } - } - else if (sense == FEATURE_SENSE_PEER) { - masq_park_call_announce(parkee, parker, 0, NULL); - res = 0; /* PBX should hangup zombie channel */ - } + if (!res) { /* one direction used to call park_call.... */ + masq_park_call_announce(parkee, parker, 0, NULL); + res = 0; /* PBX should hangup zombie channel */ } ast_module_user_remove(u); @@ -1118,17 +1106,7 @@ static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, ast_autoservice_stop(idle); - if (res == AST_PBX_KEEPALIVE) { - /* do not hangup peer if feature is to be activated on it */ - if ((ast_test_flag(feature, AST_FEATURE_FLAG_ONPEER) && sense == FEATURE_SENSE_CHAN) || (ast_test_flag(feature, AST_FEATURE_FLAG_ONSELF) && sense == FEATURE_SENSE_PEER)) { - return FEATURE_RETURN_NO_HANGUP_PEER; - } else - return FEATURE_RETURN_PBX_KEEPALIVE; - } else if (res == AST_PBX_NO_HANGUP_PEER) { - return FEATURE_RETURN_NO_HANGUP_PEER; - } else if (res == AST_PBX_NO_HANGUP_PEER_PARKED) { - return FEATURE_RETURN_NO_HANGUP_PEER_PARKED; - } else if (res) + if (res) return FEATURE_RETURN_SUCCESSBREAK; return FEATURE_RETURN_SUCCESS; /*! \todo XXX should probably return res */ @@ -1729,13 +1707,13 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast } before_you_go: - if (res != AST_PBX_KEEPALIVE && config->end_bridge_callback) { + if (config->end_bridge_callback) { config->end_bridge_callback(config->end_bridge_callback_data); } autoloopflag = ast_test_flag(chan, AST_FLAG_IN_AUTOLOOP); ast_set_flag(chan, AST_FLAG_IN_AUTOLOOP); - if (res != AST_PBX_KEEPALIVE && !ast_test_flag(&(config->features_caller),AST_FEATURE_NO_H_EXTEN) && ast_exists_extension(chan, chan->context, "h", 1, chan->cid.cid_num)) { + if (!ast_test_flag(&(config->features_caller),AST_FEATURE_NO_H_EXTEN) && ast_exists_extension(chan, chan->context, "h", 1, chan->cid.cid_num)) { struct ast_cdr *swapper = NULL; char savelastapp[AST_MAX_EXTENSION]; char savelastdata[AST_MAX_EXTENSION]; @@ -1787,10 +1765,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast ast_set2_flag(chan, autoloopflag, AST_FLAG_IN_AUTOLOOP); /* obey the NoCDR() wishes. -- move the DISABLED flag to the bridge CDR if it was set on the channel during the bridge... */ - if (res != AST_PBX_KEEPALIVE) { - new_chan_cdr = pick_unlocked_cdr(chan->cdr); /* the proper chan cdr, if there are forked cdrs */ - if (bridge_cdr && new_chan_cdr && ast_test_flag(new_chan_cdr, AST_CDR_FLAG_POST_DISABLED)) - ast_set_flag(bridge_cdr, AST_CDR_FLAG_POST_DISABLED); + new_chan_cdr = pick_unlocked_cdr(chan->cdr); /* the proper chan cdr, if there are forked cdrs */ + if (bridge_cdr && new_chan_cdr && ast_test_flag(new_chan_cdr, AST_CDR_FLAG_POST_DISABLED)) { + ast_set_flag(bridge_cdr, AST_CDR_FLAG_POST_DISABLED); } /* we can post the bridge CDR at this point */ @@ -1821,23 +1798,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast 5. After a bridge occurs, we have 2 or 3 channels' CDRs to attend to; if the chan or peer changed names, we have the before and after attached CDR's. - 6. Parking has to be accounted for in the code: - a. Parking will cause ast_bridge_call to return - either AST_PBX_NO_HANGUP_PEER or AST_PBX_NO_HANGUP_PEER_PARKED; - in the latter case, peer is (most likely) a bad - pointer, you can no longer deref it. If it does still - exist, it is under another's thread control, and - could be destroyed at any time. - b. The same applies to AST_PBX_KEEPALIVE, in which - case, the chan ptr cannot be used, as another thread - owns it and may have destroyed the channel. - c. In the former case, you need to check peer to see if it - still exists before you deref it, and obtain a lock. - d. In neither case should you do an ast_hangup(peer). - e. Do not overwrite the result code from ast_bridge_call. */ - if (res != AST_PBX_KEEPALIVE && new_chan_cdr) { + if (new_chan_cdr) { struct ast_channel *chan_ptr = NULL; if (strcasecmp(orig_channame, chan->name) != 0) { @@ -1863,7 +1826,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast } } - if (res != AST_PBX_NO_HANGUP_PEER_PARKED) { /* if the peer was involved in a park, don't even touch it; it's probably gone */ + { struct ast_channel *chan_ptr = NULL; new_peer_cdr = pick_unlocked_cdr(peer->cdr); /* the proper chan cdr, if there are forked cdrs */ if (new_chan_cdr && ast_test_flag(new_chan_cdr, AST_CDR_FLAG_POST_DISABLED) && new_peer_cdr && !ast_test_flag(new_peer_cdr, AST_CDR_FLAG_POST_DISABLED)) @@ -2121,14 +2084,19 @@ static int park_call_exec(struct ast_channel *chan, void *data) res = ast_safe_sleep(chan, 1000); /* Park the call */ if (!res) { - res = park_call_full(chan, chan, 0, NULL, orig_chan_name); + res = park_call_full(chan, chan, 0, NULL, orig_chan_name); /* In experiments, using the masq_park_call + func here yielded no difference with + current implementation. I saw no advantage + in calling it instead. + */ /* Continue on in the dialplan */ if (res == 1) { ast_copy_string(chan->exten, orig_exten, sizeof(chan->exten)); chan->priority = orig_priority; res = 0; - } else if (!res) - res = AST_PBX_KEEPALIVE; + } else if (!res) { + res = 1; + } } ast_module_user_remove(u); @@ -2261,8 +2229,7 @@ static int park_exec(struct ast_channel *chan, void *data) ast_cdr_setdestchan(chan->cdr, peer->name); /* Simulate the PBX hanging up */ - if (res != AST_PBX_NO_HANGUP_PEER && res != AST_PBX_NO_HANGUP_PEER_PARKED) - ast_hangup(peer); + ast_hangup(peer); ast_module_user_remove(u); return res; } else { |