mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-17 07:18:15 +00:00
Split Hold event into Hold/Unhold, and move it into core.
(closes issue ASTERISK-21487) Review: https://reviewboard.asterisk.org/r/2565/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@389746 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -9879,16 +9879,9 @@ static int find_sdp(struct sip_request *req)
|
||||
/*! \brief Change hold state for a call */
|
||||
static void change_hold_state(struct sip_pvt *dialog, struct sip_request *req, int holdstate, int sendonly)
|
||||
{
|
||||
if (sip_cfg.notifyhold && (!holdstate || !ast_test_flag(&dialog->flags[1], SIP_PAGE2_CALL_ONHOLD)))
|
||||
if (sip_cfg.notifyhold && (!holdstate || !ast_test_flag(&dialog->flags[1], SIP_PAGE2_CALL_ONHOLD))) {
|
||||
sip_peer_hold(dialog, holdstate);
|
||||
if (sip_cfg.callevents)
|
||||
manager_event(EVENT_FLAG_CALL, "Hold",
|
||||
"Status: %s\r\n"
|
||||
"Channel: %s\r\n"
|
||||
"Uniqueid: %s\r\n",
|
||||
holdstate ? "On" : "Off",
|
||||
ast_channel_name(dialog->owner),
|
||||
ast_channel_uniqueid(dialog->owner));
|
||||
}
|
||||
append_history(dialog, holdstate ? "Hold" : "Unhold", "%s", ast_str_buffer(req->data));
|
||||
if (!holdstate) { /* Put off remote hold */
|
||||
ast_clear_flag(&dialog->flags[1], SIP_PAGE2_CALL_ONHOLD); /* Clear both flags */
|
||||
@@ -10795,16 +10788,14 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
|
||||
|
||||
if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) && (!ast_sockaddr_isnull(sa) || !ast_sockaddr_isnull(vsa) || !ast_sockaddr_isnull(tsa) || !ast_sockaddr_isnull(isa)) && (!sendonly || sendonly == -1)) {
|
||||
if (!ast_test_flag(&p->flags[2], SIP_PAGE3_DISCARD_REMOTE_HOLD_RETRIEVAL)) {
|
||||
ast_queue_control(p->owner, AST_CONTROL_UNHOLD);
|
||||
ast_queue_unhold(p->owner);
|
||||
}
|
||||
/* Activate a re-invite */
|
||||
ast_queue_frame(p->owner, &ast_null_frame);
|
||||
change_hold_state(p, req, FALSE, sendonly);
|
||||
} else if ((sockaddr_is_null_or_any(sa) && sockaddr_is_null_or_any(vsa) && sockaddr_is_null_or_any(tsa) && sockaddr_is_null_or_any(isa)) || (sendonly && sendonly != -1)) {
|
||||
if (!ast_test_flag(&p->flags[2], SIP_PAGE3_DISCARD_REMOTE_HOLD_RETRIEVAL)) {
|
||||
ast_queue_control_data(p->owner, AST_CONTROL_HOLD,
|
||||
S_OR(p->mohsuggest, NULL),
|
||||
!ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
|
||||
ast_queue_hold(p->owner, p->mohsuggest);
|
||||
}
|
||||
if (sendonly)
|
||||
ast_rtp_instance_stop(p->rtp);
|
||||
@@ -25440,7 +25431,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
|
||||
*without* an SDP, which is supposed to mean "Go back to your state"
|
||||
and since they put os on remote hold, we go back to off hold */
|
||||
if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
|
||||
ast_queue_control(p->owner, AST_CONTROL_UNHOLD);
|
||||
ast_queue_unhold(p->owner);
|
||||
/* Activate a re-invite */
|
||||
ast_queue_frame(p->owner, &ast_null_frame);
|
||||
change_hold_state(p, req, FALSE, 0);
|
||||
@@ -26703,7 +26694,7 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
|
||||
bridged_to = ast_bridged_channel(c);
|
||||
if (bridged_to) {
|
||||
/* Don't actually hangup here... */
|
||||
ast_queue_control(c, AST_CONTROL_UNHOLD);
|
||||
ast_queue_unhold(c);
|
||||
ast_channel_unlock(c); /* async_goto can do a masquerade, no locks can be held during a masq */
|
||||
ast_async_goto(bridged_to, p->context, p->refer->refer_to, 1);
|
||||
ast_channel_lock(c);
|
||||
|
||||
Reference in New Issue
Block a user