void WaitingFor200OkforInvite::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 however we have encountered in the field some endpoints // that repeat the SDP answer they already sent in a previous // reliable provisional 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 ); } ChangeState( impl, impl.pWaitingForAckForInvite ); } else { OsSysLog::add(FAC_NAT,PRI_DEBUG,"'%s:%s' - Received unexpected successful response for %s request", impl.name(), impl.GetCurrentState()->name(), seqMethod.data() ); } } }
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 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(); } }
bool WaitingForAckWithAnswerForInvite::AckRequest( DialogTracker& impl, SipMessage& request, TransactionDirectionality direction, const char* address, int port ) const { impl.ProcessMediaAnswer( request, INITIAL_OFFER_ANSWER ); impl.setDialogEstablishedFlag(); impl.promoteTentativeMediaRelaySessionsToCurrent(); ChangeState( impl, impl.pWaitingForInvite ); return false; }
void WaitingForMediaAnswer::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 ) { impl.ProcessMediaAnswer( response, INITIAL_OFFER_ANSWER ); ChangeState( impl, impl.pWaitingForAckForInvite ); } } }
void WaitingFor200OkWithAnswerForPrack::SuccessfulResponse( DialogTracker& impl, SipMessage& response, const char* address, int port ) const { int seqNum; UtlString seqMethod; if( response.getCSeqField( &seqNum, &seqMethod ) ) { if( seqMethod.compareTo( SIP_PRACK_METHOD ) == 0 ) { impl.ProcessMediaAnswer( response, NON_INITIAL_OFFER_ANSWER ); impl.modifyNonIntialOfferAnswerExchangeDoneFlag( true ); ChangeState( impl, impl.pWaitingFor200OkforInvite ); } else { OsSysLog::add(FAC_NAT,PRI_DEBUG,"'%s:%s' - Received unexpected successful response for %s request", impl.name(), impl.GetCurrentState()->name(), seqMethod.data() ); } } }
void WaitingFor200OkWithAnswerForPrack::SuccessfulResponse( DialogTracker& impl, SipMessage& response, const char* address, int port ) const { int seqNum; UtlString seqMethod; if( response.getCSeqField( &seqNum, &seqMethod ) ) { if( seqMethod.compareTo( SIP_PRACK_METHOD ) == 0 ) { impl.ProcessMediaAnswer( response, NON_INITIAL_OFFER_ANSWER ); impl.modifyNonIntialOfferAnswerExchangeDoneFlag( true ); ChangeState( impl, impl.pProcessingPrackWaitingForAckforInvite ); } else { // Not interesting for us but our parent class provides some handling for // other successful responses. ProcessingPrack::SuccessfulResponse( impl, response, address, port ); } } }
bool WaitingForPrackWithMediaAnswer::PrackRequest( DialogTracker& impl, SipMessage& request, TransactionDirectionality direction, const char* address, int port ) const { impl.ProcessMediaAnswer( request, INITIAL_OFFER_ANSWER ); ChangeState( impl, impl.pWaitingFor200OkForSlowStartPrack ); return true; }