void SIPNict::handleRetransmitRequest() { SIPTransaction::Ptr pTransaction = static_cast<SIPTransaction::WeakPtr*>(_owner)->lock(); if (!pTransaction) return; if (pTransaction->getState() == SIPTransaction::TRN_STATE_TERMINATED) return; if (pTransaction->getState() <= PROCEEDING) { if (pTransaction->transport()->isReliableTransport()) pTransaction->transport()->writeMessage(_pRequest); else pTransaction->transport()->writeMessage(_pRequest, pTransaction->remoteAddress().toString(), OSS::string_from_number<unsigned short>(pTransaction->remoteAddress().getPort())); // // Restart Timer E with a compounded value // if (_timerEMultiplier == 0) _timerEMultiplier = 2; else _timerEMultiplier = 4; if ( pTransaction->getState() != PROCEEDING) _timerEValue = _timerEValue * _timerEMultiplier > _timerProps.timerT2() ? _timerProps.timerT2() : _timerProps.timerT1() *_timerEMultiplier; else _timerEValue = _timerProps.timerT2(); startTimerE(_timerEValue); } }
void SIPFSMDispatch::sendRequest( const SIPMessage::Ptr& pRequest, const OSS::Net::IPAddress& localAddress, const OSS::Net::IPAddress& remoteAddress, SIPTransaction::Callback& callback, SIPTransaction::TerminateCallback& terminateCallback) { SIPTransaction::Ptr trn = createClientTransaction(pRequest); if (trn) { if (!trn->transportService()) { // // This is a newly created transaction // trn->transportService() = &_transport; trn->localAddress() = localAddress; trn->remoteAddress() = remoteAddress; } trn->sendRequest(pRequest, localAddress, remoteAddress, callback, terminateCallback); } }