📄 serverinvitesession.cxx
字号:
#include "resip/stack/MultipartMixedContents.hxx"#include "resip/stack/MultipartAlternativeContents.hxx"#include "resip/dum/Dialog.hxx"#include "resip/dum/DialogUsageManager.hxx"#include "resip/dum/DumTimeout.hxx"#include "resip/dum/InviteSessionHandler.hxx"#include "resip/dum/ServerInviteSession.hxx"#include "resip/dum/MasterProfile.hxx"#include "resip/dum/UsageUseException.hxx"#include "resip/dum/DumHelper.hxx"#include "resip/dum/DumCommand.hxx"#include "rutil/Logger.hxx"#include "rutil/compat.hxx"#include "rutil/WinLeakCheck.hxx"using namespace resip;#define RESIPROCATE_SUBSYSTEM Subsystem::DUMServerInviteSession::ServerInviteSession(DialogUsageManager& dum, Dialog& dialog, const SipMessage& request) : InviteSession(dum, dialog), mFirstRequest(request), m1xx(new SipMessage), mCurrentRetransmit1xx(0){ assert(request.isRequest()); mState = UAS_Start;}ServerInviteSessionHandle ServerInviteSession::getHandle(){ return ServerInviteSessionHandle(mDum, getBaseHandle().getId());}void ServerInviteSession::redirect(const NameAddrs& contacts, int code){ InfoLog (<< toData(mState) << ": redirect(" << code << ")"); // -> " << contacts); switch (mState) { case UAS_EarlyNoOffer: case UAS_EarlyOffer: case UAS_EarlyProvidedAnswer: case UAS_EarlyProvidedOffer: case UAS_NegotiatedReliable: case UAS_FirstSentAnswerReliable: case UAS_FirstSentOfferReliable: case UAS_NoOffer: case UAS_NoOfferReliable: case UAS_Offer: case UAS_OfferProvidedAnswer: case UAS_ReceivedOfferReliable: case UAS_ProvidedOffer: case UAS_ReceivedUpdate: case UAS_ReceivedUpdateWaitingAnswer: 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); response->header(h_Contacts) = contacts; 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_WaitingToHangup: case UAS_WaitingToTerminate: case UAS_SentUpdateAccepted: case UAS_Start: default: assert(0); throw UsageUseException("Can't redirect after accepted", __FILE__, __LINE__); break; }}class ServerInviteSessionRedirectCommand : public DumCommandAdapter{public: ServerInviteSessionRedirectCommand(ServerInviteSession& serverInviteSession, const NameAddrs& contacts, int code) : mServerInviteSession(serverInviteSession), mContacts(contacts), mCode(code) { } virtual void executeCommand() { mServerInviteSession.redirect(mContacts, mCode); } virtual std::ostream& encodeBrief(std::ostream& strm) const { return strm << "ServerInviteSessionRedirectCommand"; }private: ServerInviteSession& mServerInviteSession; NameAddrs mContacts; int mCode;};void ServerInviteSession::redirectCommand(const NameAddrs& contacts, int code){ mDum.post(new ServerInviteSessionRedirectCommand(*this, contacts, code));}void ServerInviteSession::provisional(int code, bool earlyFlag){ InfoLog (<< toData(mState) << ": provisional(" << code << ")"); switch (mState) { case UAS_Offer: transition(UAS_EarlyOffer); sendProvisional(code, earlyFlag); break; case UAS_OfferProvidedAnswer: case UAS_EarlyProvidedAnswer: transition(UAS_EarlyProvidedAnswer); sendProvisional(code, earlyFlag); break; case UAS_ProvidedOffer: case UAS_EarlyProvidedOffer: transition(UAS_EarlyProvidedOffer); sendProvisional(code, earlyFlag); break; case UAS_EarlyOffer: transition(UAS_EarlyOffer); sendProvisional(code, earlyFlag); break; case UAS_NoOffer: case UAS_EarlyNoOffer: transition(UAS_EarlyNoOffer); sendProvisional(code, earlyFlag); break; case UAS_NoOfferReliable: case UAS_NegotiatedReliable: // TBD assert(0); break; case UAS_Accepted: case UAS_WaitingToOffer: case UAS_WaitingToRequestOffer: case UAS_FirstSentAnswerReliable: case UAS_FirstSentOfferReliable: case UAS_ReceivedOfferReliable: case UAS_ReceivedUpdate: case UAS_ReceivedUpdateWaitingAnswer: case UAS_SentUpdate: case UAS_SentUpdateAccepted: case UAS_Start: case UAS_WaitingToHangup: case UAS_WaitingToTerminate: default: assert(0); break; }}class ServerInviteSessionProvisionalCommand : public DumCommandAdapter{public: ServerInviteSessionProvisionalCommand(ServerInviteSession& serverInviteSession, int statusCode) : mServerInviteSession(serverInviteSession), mStatusCode(statusCode) { } virtual void executeCommand() { mServerInviteSession.provisional(mStatusCode); } virtual std::ostream& encodeBrief(std::ostream& strm) const { return strm << "ServerInviteSessionProvisionalCommand"; }private: ServerInviteSession& mServerInviteSession; int mStatusCode;};void ServerInviteSession::provisionalCommand(int statusCode){ mDum.post(new ServerInviteSessionProvisionalCommand(*this, statusCode));}voidServerInviteSession::provideOffer(const SdpContents& offer, DialogUsageManager::EncryptionLevel level, const SdpContents* alternative){ InfoLog (<< toData(mState) << ": provideOffer"); switch (mState) { case UAS_NoOffer: transition(UAS_ProvidedOffer); mProposedLocalSdp = InviteSession::makeSdp(offer, alternative); mProposedEncryptionLevel = level; break; case UAS_EarlyNoOffer: transition(UAS_EarlyProvidedOffer); mProposedLocalSdp = InviteSession::makeSdp(offer, alternative); mProposedEncryptionLevel = level; break; case UAS_NoOfferReliable: mProposedLocalSdp = InviteSession::makeSdp(offer, alternative); mProposedEncryptionLevel = level; // !jf! transition ? break; case UAS_NegotiatedReliable: // queue offer transition(UAS_SentUpdate); mProposedLocalSdp = InviteSession::makeSdp(offer, alternative); mProposedEncryptionLevel = level; sendUpdate(offer); break; case UAS_Accepted: // queue the offer to be sent after the ACK is received transition(UAS_WaitingToOffer); mProposedLocalSdp = InviteSession::makeSdp(offer); mProposedEncryptionLevel = level; break; case UAS_WaitingToOffer: InviteSession::provideOffer(offer, level, alternative); break; case UAS_EarlyProvidedAnswer: case UAS_EarlyProvidedOffer: case UAS_FirstSentAnswerReliable: case UAS_FirstSentOfferReliable: case UAS_Offer: case UAS_EarlyOffer: case UAS_ReceivedOfferReliable: case UAS_OfferProvidedAnswer: case UAS_ProvidedOffer: case UAS_ReceivedUpdate: case UAS_ReceivedUpdateWaitingAnswer: case UAS_SentUpdate: case UAS_SentUpdateAccepted: case UAS_Start: case UAS_WaitingToHangup: case UAS_WaitingToTerminate: case UAS_WaitingToRequestOffer: case UAS_AcceptedWaitingAnswer: assert(0); break; default: InviteSession::provideOffer(offer, level, alternative); break; }}void ServerInviteSession::provideOffer(const SdpContents& offer){ this->provideOffer(offer, mCurrentEncryptionLevel, 0);}voidServerInviteSession::requestOffer(){ InfoLog (<< toData(mState) << ": requestOffer"); switch (mState) { case UAS_Accepted: // queue the request to be sent after the ACK is received transition(UAS_WaitingToRequestOffer); break; case UAS_WaitingToRequestOffer: InviteSession::requestOffer(); break; default: InviteSession::requestOffer(); break; }}void ServerInviteSession::provideAnswer(const SdpContents& answer){ InviteSessionHandler* handler = mDum.mInviteSessionHandler; InfoLog (<< toData(mState) << ": provideAnswer"); switch (mState) { case UAS_Offer: transition(UAS_OfferProvidedAnswer); mCurrentRemoteSdp = mProposedRemoteSdp; mCurrentLocalSdp = InviteSession::makeSdp(answer); break; case UAS_EarlyOffer: transition(UAS_EarlyProvidedAnswer); mCurrentRemoteSdp = mProposedRemoteSdp; mCurrentLocalSdp = InviteSession::makeSdp(answer); break; case UAS_ReceivedOfferReliable: // send1XX-answer, timer::1xx transition(UAS_FirstSentAnswerReliable); break; case UAS_ReceivedUpdate: // send::200U-answer transition(UAS_NegotiatedReliable); break; case UAS_ReceivedUpdateWaitingAnswer: // send::2XXU-answer // send::2XXI transition(Connected); handler->onConnected(getSessionHandle(), *mInvite200); break; case UAS_Accepted: case UAS_WaitingToOffer: case UAS_WaitingToRequestOffer: case UAS_EarlyNoOffer: case UAS_EarlyProvidedAnswer: case UAS_EarlyProvidedOffer: case UAS_NegotiatedReliable: case UAS_FirstSentAnswerReliable: case UAS_FirstSentOfferReliable: case UAS_NoOffer: case UAS_NoOfferReliable: case UAS_OfferProvidedAnswer: case UAS_ProvidedOffer: case UAS_SentUpdate: case UAS_SentUpdateAccepted: case UAS_Start: case UAS_WaitingToHangup: case UAS_WaitingToTerminate: case UAS_AcceptedWaitingAnswer: assert(0); break; default: InviteSession::provideAnswer(answer); break; }}voidServerInviteSession::end(){ end(NotSpecified);}void ServerInviteSession::end(EndReason reason){ InfoLog (<< toData(mState) << ": end"); if (mEndReason == NotSpecified) { mEndReason = reason; } 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: reject(480); break; case UAS_ReceivedOfferReliable: case UAS_NegotiatedReliable: case UAS_FirstSentOfferReliable: case UAS_FirstSentAnswerReliable: case UAS_NoOfferReliable: case UAS_ReceivedUpdate: // !slg! todo: send 488U case UAS_ReceivedUpdateWaitingAnswer: // !slg! todo: send 488U case UAS_SentUpdate: case UAS_WaitingToTerminate: reject(480); break; case UAS_Start: assert(0); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -