void WaitingForMediaAnswer::ProvisionalResponse( DialogTracker& impl, SipMessage& response, const char* address, int port ) const { if( response.getResponseStatusCode() != SIP_TRYING_CODE ) { if( response.hasSdpBody() ) { // Both reliable and unreliable provisional responses can carry SDP bodies. According to // draft-ietf-sipping-sip-offeranswer-04.txt section 3.1, unreliable provisional responses // carrying an answer is a mere previes of what the 'real' SDP answer will be and that it // must be identical to it. Since we may be changing the SDP of the 'real' answer to compensate // for NATs we need to also manipulate the 'preview' answer to make match the requirement that // the preview and 'real' answers be identical. // we are receiving a provisional response - check if it is sent reliably... impl.ProcessMediaAnswer( response, INITIAL_OFFER_ANSWER ); if( response.getHeaderValue( 0, SIP_RSEQ_FIELD ) ) { // Presence of RSeq: header in the message indicates that it is sent reliably ChangeState( impl, impl.pWaitingForPrack ); } else { // We have received an unreliable provisional response - although that does // not cause a state machine state change, we need to reset the tick counter // to show that there is still activity in this dialog. impl.resetTimerTickCounter(); } } } }
void WaitingFor200OkWithMediaOffer::ProvisionalResponse( DialogTracker& impl, SipMessage& response, const char* address, int port ) const { if( response.getResponseStatusCode() != SIP_TRYING_CODE ) { // RFC requires that all SDP previews be identical. In ensure that this // requirement is met, we apply the saved copy of the patched SDP preview // to the response. if( response.hasSdpBody() ) { impl.applyPatchedSdpPreview( response ); } // we are receiving a provisional response - check if it is sent reliably... if( response.getHeaderValue( 0, SIP_RSEQ_FIELD ) ) { // Presence of RSeq: header in the message indicates that it is sent reliably ChangeState( impl, impl.pWaitingForPrackWithMediaAnswer ); } else { // We have received an unreliable provisional response - although that does // not cause a state machine state change, we need to reset the tick counter // to show that there is still activity in this dialog. impl.resetTimerTickCounter(); } } }
void ProcessingPrack::SuccessfulResponse( DialogTracker& impl, SipMessage& response, const char* address, int port ) const { int seqNum; UtlString seqMethod; if( response.getCSeqField( &seqNum, &seqMethod ) ) { if( seqMethod.compareTo( SIP_INVITE_METHOD ) == 0 ) { // normally we would not be expecting this 200 OK response to carry // an SDP in this state however we have encountered in the field some endpoints // that repeat the SDP answer they already sent in a previous // Successful response (see XECS-2079 for the details). // Given that, if an SDP answer is found, we will reprocess it // to make sure it gets the same transformations that the initial // one got as per XECS-2089. if( response.hasSdpBody() ) { impl.ProcessMediaAnswer( response, INITIAL_OFFER_ANSWER ); } } else { OsSysLog::add(FAC_NAT,PRI_DEBUG,"'%s:%s' - Received unexpected Successful Response for %s request", impl.name(), impl.GetCurrentState()->name(), seqMethod.data() ); } // We have received a response - although that does // not cause a state machine state change, we need to reset the tick counter // to show that there is still activity in this dialog. impl.resetTimerTickCounter(); } }
void TimeBoundState::DoEntryAction( DialogTracker& impl ) const { impl.resetTimerTickCounter(); }