📄 serverinvitesession.cxx
字号:
case UAS_Accepted: case UAS_WaitingToOffer: case UAS_WaitingToRequestOffer: case UAS_SentUpdateAccepted: case UAS_AcceptedWaitingAnswer: if(mCurrentRetransmit200) // If retransmit200 timer is active then ACK is not received yet - wait for it { transition(UAS_WaitingToHangup); } else { // ACK has likely timedout - hangup immediately sendBye(); transition(Terminated); mDum.mInviteSessionHandler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended); } break; case UAS_WaitingToHangup: // This can happen if we are waiting for an ACK to hangup and the ACK timesout break; default: InviteSession::end(reason); break; }}void ServerInviteSession::reject(int code, WarningCategory *warning){ InfoLog (<< toData(mState) << ": reject(" << code << ")"); switch (mState) { case UAS_EarlyNoOffer: case UAS_EarlyOffer: case UAS_EarlyProvidedAnswer: case UAS_EarlyProvidedOffer: case UAS_NoOffer: case UAS_Offer: case UAS_OfferProvidedAnswer: case UAS_ProvidedOffer: case UAS_NegotiatedReliable: case UAS_FirstSentAnswerReliable: case UAS_FirstSentOfferReliable: case UAS_NoOfferReliable: case UAS_ReceivedOfferReliable: case UAS_ReceivedUpdate: case UAS_SentUpdate: { // !jf! the cleanup for 3xx may be a bit strange if we are in the middle of // an offer/answer exchange with PRACK. // e.g. we sent 183 reliably and then 302 before PRACK was received. Ideally, // we should send 200PRACK SharedPtr<SipMessage> response(new SipMessage); mDialog.makeResponse(*response, mFirstRequest, code); if(warning) { response->header(h_Warnings).push_back(*warning); } send(response); transition(Terminated); mDum.mInviteSessionHandler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended); mDum.destroy(this); break; } case UAS_Accepted: case UAS_WaitingToOffer: case UAS_WaitingToRequestOffer: case UAS_ReceivedUpdateWaitingAnswer: case UAS_SentUpdateAccepted: case UAS_Start: case UAS_WaitingToHangup: case UAS_WaitingToTerminate: assert(0); break; default: InviteSession::reject(code); break; }}void ServerInviteSession::accept(int code){ InfoLog (<< toData(mState) << ": accept(" << code << ")"); InviteSessionHandler* handler = mDum.mInviteSessionHandler; switch (mState) { case UAS_Offer: case UAS_EarlyOffer: assert(0); break; case UAS_OfferProvidedAnswer: case UAS_EarlyProvidedAnswer: transition(UAS_Accepted); sendAccept(code, mCurrentLocalSdp.get()); handler->onConnected(getSessionHandle(), *mInvite200); break; case UAS_NoOffer: case UAS_EarlyNoOffer: assert(0); case UAS_ProvidedOffer: case UAS_EarlyProvidedOffer: transition(UAS_AcceptedWaitingAnswer); sendAccept(code, mProposedLocalSdp.get()); break; case UAS_Accepted: case UAS_WaitingToOffer: case UAS_WaitingToRequestOffer: assert(0); // Already Accepted break; case UAS_FirstSentAnswerReliable: // queue 2xx // waiting for PRACK transition(UAS_Accepted); mDialog.makeResponse(*mInvite200, mFirstRequest, code); handleSessionTimerRequest(*mInvite200, mFirstRequest); break; case UAS_NegotiatedReliable: transition(Connected); sendAccept(code, 0); handler->onConnected(getSessionHandle(), *mInvite200); break; case UAS_SentUpdate: transition(UAS_SentUpdateAccepted); sendAccept(code, 0); break; case UAS_ReceivedUpdate: transition(UAS_ReceivedUpdateWaitingAnswer); mDialog.makeResponse(*mInvite200, mFirstRequest, code);// queue 2xx handleSessionTimerRequest(*mInvite200, mFirstRequest); break; case UAS_FirstSentOfferReliable: case UAS_NoOfferReliable: case UAS_ReceivedOfferReliable: case UAS_ReceivedUpdateWaitingAnswer: case UAS_SentUpdateAccepted: case UAS_Start: case UAS_WaitingToHangup: case UAS_WaitingToTerminate: default: assert(0); break; }}class ServerInviteSessionAcceptCommand : public DumCommandAdapter{public: ServerInviteSessionAcceptCommand(ServerInviteSession& serverInviteSession, int statusCode) : mServerInviteSession(serverInviteSession), mStatusCode(statusCode) { } virtual void executeCommand() { mServerInviteSession.accept(mStatusCode); } virtual std::ostream& encodeBrief(std::ostream& strm) const { return strm << "ServerInviteSessionAcceptCommand"; }private: ServerInviteSession& mServerInviteSession; int mStatusCode;};void ServerInviteSession::acceptCommand(int statusCode){ mDum.post(new ServerInviteSessionAcceptCommand(*this, statusCode));}void ServerInviteSession::dispatch(const SipMessage& msg){ switch (mState) { case UAS_Start: dispatchStart(msg); break; case UAS_Offer: case UAS_EarlyOffer: case UAS_EarlyProvidedAnswer: case UAS_NoOffer: case UAS_ProvidedOffer: case UAS_EarlyNoOffer: case UAS_EarlyProvidedOffer: case UAS_OfferProvidedAnswer: dispatchOfferOrEarly(msg); break; case UAS_Accepted: dispatchAccepted(msg); break; case UAS_WaitingToOffer: dispatchWaitingToOffer(msg); break; case UAS_WaitingToRequestOffer: dispatchWaitingToRequestOffer(msg); break; case UAS_AcceptedWaitingAnswer: dispatchAcceptedWaitingAnswer(msg); break; case UAS_NegotiatedReliable: dispatchEarlyReliable(msg); break; case UAS_FirstSentAnswerReliable: dispatchFirstEarlyReliable(msg); break; case UAS_FirstSentOfferReliable: dispatchFirstSentOfferReliable(msg); break; case UAS_NoOfferReliable: dispatchNoOfferReliable(msg); break; case UAS_ReceivedOfferReliable: dispatchOfferReliable(msg); break; case UAS_ReceivedUpdate: dispatchReceivedUpdate(msg); break; case UAS_ReceivedUpdateWaitingAnswer: dispatchReceivedUpdateWaitingAnswer(msg); break; case UAS_SentUpdate: dispatchSentUpdate(msg); break; case UAS_WaitingToHangup: dispatchWaitingToHangup(msg); break; case UAS_WaitingToTerminate: dispatchWaitingToTerminate(msg); break; case UAS_SentUpdateAccepted: dispatchSentUpdateAccepted(msg); break; default: InviteSession::dispatch(msg); break; }}void ServerInviteSession::dispatch(const DumTimeout& timeout){ if (timeout.type() == DumTimeout::Retransmit1xx) { if (mCurrentRetransmit1xx && m1xx->header(h_CSeq).sequence() == timeout.seq()) // If timer isn't stopped and this timer is for last 1xx sent, then resend { send(m1xx); startRetransmit1xxTimer(); } } else { InviteSession::dispatch(timeout); }}voidServerInviteSession::dispatchStart(const SipMessage& msg){ assert(msg.isRequest()); assert(msg.header(h_CSeq).method() == INVITE); InviteSessionHandler* handler = mDum.mInviteSessionHandler; std::auto_ptr<SdpContents> sdp = InviteSession::getSdp(msg); storePeerCapabilities(msg); switch (toEvent(msg, sdp.get())) { case OnInviteOffer: *mLastRemoteSessionModification = msg; transition(UAS_Offer); mProposedRemoteSdp = InviteSession::makeSdp(*sdp); mCurrentEncryptionLevel = getEncryptionLevel(msg); handler->onNewSession(getHandle(), Offer, msg); if(!isTerminated()) { handler->onOffer(getSessionHandle(), msg, *sdp); } break; case OnInvite: *mLastRemoteSessionModification = msg; transition(UAS_NoOffer); handler->onNewSession(getHandle(), None, msg); if(!isTerminated()) { handler->onOfferRequired(getSessionHandle(), msg); } break; case OnInviteReliableOffer: *mLastRemoteSessionModification = msg; transition(UAS_ReceivedOfferReliable); mProposedRemoteSdp = InviteSession::makeSdp(*sdp); mCurrentEncryptionLevel = getEncryptionLevel(msg); handler->onNewSession(getHandle(), Offer, msg); if(!isTerminated()) { handler->onOffer(getSessionHandle(), msg, *sdp); } break; case OnInviteReliable: *mLastRemoteSessionModification = msg; transition(UAS_NoOfferReliable); handler->onNewSession(getHandle(), None, msg); if(!isTerminated()) { handler->onOfferRequired(getSessionHandle(), msg); } break; default: assert(0); break; }}// Offer, Early, EarlyNoOffer, NoOffervoidServerInviteSession::dispatchOfferOrEarly(const SipMessage& msg){ std::auto_ptr<SdpContents> sdp = InviteSession::getSdp(msg); switch (toEvent(msg, sdp.get())) { case OnCancel: dispatchCancel(msg); break; case OnBye: dispatchBye(msg); break; default: assert(msg.isRequest()); dispatchUnknown(msg); break; }}voidServerInviteSession::dispatchAccepted(const SipMessage& msg){ InviteSessionHandler* handler = mDum.mInviteSessionHandler; std::auto_ptr<SdpContents> sdp = InviteSession::getSdp(msg); InfoLog (<< "dispatchAccepted: " << msg.brief()); switch (toEvent(msg, sdp.get())) { case OnAck: case OnAckAnswer: { mCurrentRetransmit200 = 0; // stop the 200 retransmit timer transition(Connected); handler->onConnectedConfirmed(getSessionHandle(), msg); break; }// .bwc. unsolicited SDP in ACK; it would probably make sense to just// ignore.// case OnAckAnswer:// {// mCurrentRetransmit200 = 0; // stop the 200 retransmit timer// sendBye();// transition(Terminated);// handler->onTerminated(getSessionHandle(), InviteSessionHandler::GeneralFailure, &msg);// break;// } case OnCancel: { // Cancel and 200 crossed SharedPtr<SipMessage> c200(new SipMessage); mDialog.makeResponse(*c200, msg, 200); send(c200); break; } case OnBye: { SharedPtr<SipMessage> b200(new SipMessage); mDialog.makeResponse(*b200, msg, 200); send(b200); transition(Terminated); handler->onTerminated(getSessionHandle(), InviteSessionHandler::PeerEnded, &msg); mDum.destroy(this); break; } default: if(msg.isRequest()) { dispatchUnknown(msg); } break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -