Index: telepathy-sofiasip-0.6.3/src/sip-media-session.c =================================================================== --- telepathy-sofiasip-0.6.3.orig/src/sip-media-session.c 2012-09-16 11:37:01.973187745 +0200 +++ telepathy-sofiasip-0.6.3/src/sip-media-session.c 2012-09-16 11:42:06.207738910 +0200 @@ -143,6 +143,7 @@ sdp_session_t *backup_remote_sdp; /* previous remote session */ GPtrArray *streams; gboolean remote_initiated; /*< session is remotely intiated */ + gboolean invite_3pcc; /*< did we receive a 3pcc invite? (or normal) */ gboolean accepted; /*< session has been locally accepted for use */ gboolean se_ready; /*< connection established with stream-engine */ gboolean pending_offer; /*< local media have been changed, but a re-INVITE is pending */ @@ -771,6 +772,22 @@ } gboolean +tpsip_media_session_get_invite_3pcc (TpsipMediaSession *session) +{ + TpsipMediaSessionPrivate *priv = TPSIP_MEDIA_SESSION_GET_PRIVATE (session); + return priv->invite_3pcc; +} + +void +tpsip_media_session_set_invite_3pcc (TpsipMediaSession *session, + gboolean state) +{ + TpsipMediaSessionPrivate *priv = TPSIP_MEDIA_SESSION_GET_PRIVATE (session); + g_assert(priv->remote_initiated == TRUE); + priv->invite_3pcc = state; +} + +gboolean tpsip_media_session_set_remote_media (TpsipMediaSession *session, const sdp_session_t* sdp) { @@ -1090,6 +1107,14 @@ priv->accepted = TRUE; + if(priv->invite_3pcc && !priv->streams->len) + { + /* We've received a 3pcc INVITE and have no media at all. Simply trigger + * creation of a audio stream locally and propose that. */ + tpsip_media_session_add_stream (self, TP_MEDIA_STREAM_TYPE_AUDIO, + TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL, TRUE); + } + /* Apply the pending send flags */ priv_apply_streams_pending_direction (self, TP_MEDIA_STREAM_PENDING_LOCAL_SEND | @@ -1783,6 +1808,15 @@ g_return_if_fail (priv->nua_op != NULL); + if (reinvite && priv->invite_3pcc && priv->remote_sdp == NULL) + { + /* We don't send the INVITE here since we're still in call setup phase + * (this is we did not yet ack the incoming connection). Otherwise + * this would lead to an outgoing call. */ + DEBUG("defering INVITE during 3pcc call setup phase"); + return; + } + user_sdp = g_string_new (NULL); if (priv_session_local_sdp (session, user_sdp, TRUE)) @@ -1822,7 +1856,7 @@ user_sdp = g_string_new (NULL); - if (priv_session_local_sdp (session, user_sdp, FALSE)) + if (priv_session_local_sdp (session, user_sdp, priv->invite_3pcc)) { msg_t *msg; Index: telepathy-sofiasip-0.6.3/src/sip-media-channel.c =================================================================== --- telepathy-sofiasip-0.6.3.orig/src/sip-media-channel.c 2012-09-16 11:37:01.985188643 +0200 +++ telepathy-sofiasip-0.6.3/src/sip-media-channel.c 2012-09-16 11:37:30.753190851 +0200 @@ -1356,9 +1356,15 @@ if (tpsip_media_session_get_state (priv->session) != TPSIP_MEDIA_SESSION_STATE_INVITE_RECEIVED) break; - if (r_sdp != NULL) + if (r_sdp == NULL) + { + DEBUG("flagging incoming call as 3pcc INVITE'd"); + tpsip_media_session_set_invite_3pcc (priv->session, TRUE); + } + else priv_initial_media_properties_from_sdp (self, r_sdp); g_signal_emit (self, signals[SIG_INCOMING_CALL], 0); + break; case nua_callstate_proceeding: switch (status) Index: telepathy-sofiasip-0.6.3/src/sip-media-session.h =================================================================== --- telepathy-sofiasip-0.6.3.orig/src/sip-media-session.h 2012-09-16 11:37:01.965196575 +0200 +++ telepathy-sofiasip-0.6.3/src/sip-media-session.h 2012-09-16 11:37:30.753190851 +0200 @@ -77,6 +77,9 @@ TpsipMediaSessionState tpsip_media_session_get_state (TpsipMediaSession *session); void tpsip_media_session_change_state (TpsipMediaSession *session, TpsipMediaSessionState new_state); +gboolean tpsip_media_session_get_invite_3pcc (TpsipMediaSession *session); +void tpsip_media_session_set_invite_3pcc (TpsipMediaSession *session, + gboolean state); gboolean tpsip_media_session_set_remote_media (TpsipMediaSession *chan, const sdp_session_t* r_sdp); TpsipMediaStream* tpsip_media_session_add_stream (TpsipMediaSession *self,