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

📄 serverinvitesession.cxx

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