From ddf729f296975358a6aed82f131949b55d41dc98 Mon Sep 17 00:00:00 2001 From: Jakub Adam Date: Sat, 24 Jul 2010 20:37:27 +0200 Subject: [PATCH] audio: proper handling of incoming CANCEL Send 200 OK in response for the CANCEL message and 487 Request Terminated in response for cancelled INVITE that was in progress. --- src/core/sipe-incoming.c | 13 +------------ src/core/sipe-media.c | 17 +++++++++++++++++ src/core/sipe-media.h | 9 +++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/core/sipe-incoming.c b/src/core/sipe-incoming.c index 4cb42aa6..b53eff24 100644 --- a/src/core/sipe-incoming.c +++ b/src/core/sipe-incoming.c @@ -106,18 +106,7 @@ void process_incoming_cancel(SIPE_UNUSED_PARAMETER struct sipe_core_private *sip { #ifdef HAVE_VV if (is_media_session_msg(sipe_private->media_call, msg)) { - const gchar *callid = sipmsg_find_header(msg, "Call-ID"); - struct sip_session *session - = sipe_session_find_chat_by_callid(sipe_private, callid); - - sipe_media_hangup(sipe_private); - if (session) { - gchar *from = parse_from(sipmsg_find_header(msg, "From")); - sipe_dialog_remove(session, from); - g_free(from); - - sipe_session_close(sipe_private, session); - } + process_incoming_cancel_call(sipe_private, msg); } #endif } diff --git a/src/core/sipe-media.c b/src/core/sipe-media.c index 5399ee02..c9500bbf 100644 --- a/src/core/sipe-media.c +++ b/src/core/sipe-media.c @@ -633,6 +633,23 @@ process_incoming_invite_call(struct sipe_core_private *sipe_private, } } +void process_incoming_cancel_call(struct sipe_core_private *sipe_private, + struct sipmsg *msg) +{ + struct sipe_media_call_private *call_private = sipe_private->media_call; + + // We respond to the CANCEL request with 200 OK response and + // with 487 Request Terminated to the remote INVITE in progress. + sip_transport_response(sipe_private, msg, 200, "OK", NULL); + + if (call_private->invitation) { + sip_transport_response(sipe_private, call_private->invitation, + 487, "Request Terminated", NULL); + } + + sipe_media_hangup(sipe_private); +} + static gboolean sipe_media_send_ack(struct sipe_core_private *sipe_private, SIPE_UNUSED_PARAMETER struct sipmsg *msg, diff --git a/src/core/sipe-media.h b/src/core/sipe-media.h index 3185fd1c..8896d5ac 100644 --- a/src/core/sipe-media.h +++ b/src/core/sipe-media.h @@ -35,6 +35,15 @@ void process_incoming_invite_call(struct sipe_core_private *sipe_private, struct sipmsg *msg); /** + * Handles incoming SIP CANCEL message. + * + * @param sipe_private (in) SIPE core data. + * @param msg (in) a SIP CANCEL message + */ +void process_incoming_cancel_call(struct sipe_core_private *sipe_private, + struct sipmsg *msg); + +/** * Hangs up a media session and closes all allocated resources. * * @param sipe_private (in) SIPE core data. -- 2.11.4.GIT