⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverinvitesession.cxx

📁 这是国外的resip协议栈
💻 CXX
📖 第 1 页 / 共 3 页
字号:
#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 + -