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

📄 invitesession.cxx

📁 这是国外的resip协议栈
💻 CXX
📖 第 1 页 / 共 5 页
字号:
voidInviteSession::provideOfferCommand(const SdpContents& offer){   mDum.post(new InviteSessionProvideOfferCommand(*this, offer));}voidInviteSession::provideAnswer(const SdpContents& answer){   switch (mState)   {      case ReceivedReinvite:         transition(Connected);         mDialog.makeResponse(*mInvite200, *mLastRemoteSessionModification, 200);         handleSessionTimerRequest(*mInvite200, *mLastRemoteSessionModification);         InviteSession::setSdp(*mInvite200, answer, 0);         mCurrentLocalSdp = InviteSession::makeSdp(answer);         mCurrentRemoteSdp = mProposedRemoteSdp;         InfoLog (<< "Sending " << mInvite200->brief());         DumHelper::setOutgoingEncryptionLevel(*mInvite200, mCurrentEncryptionLevel);         send(mInvite200);         startRetransmit200Timer();         break;      case ReceivedUpdate: // same as ReceivedReinvite case.      {         transition(Connected);         SharedPtr<SipMessage> response(new SipMessage);         mDialog.makeResponse(*response, *mLastRemoteSessionModification, 200);         handleSessionTimerRequest(*response, *mLastRemoteSessionModification);         InviteSession::setSdp(*response, answer, 0);         mCurrentLocalSdp = InviteSession::makeSdp(answer);         mCurrentRemoteSdp = mProposedRemoteSdp;         InfoLog (<< "Sending " << response->brief());         DumHelper::setOutgoingEncryptionLevel(*response, mCurrentEncryptionLevel);         send(response);         break;      }      case SentReinviteAnswered:         transition(Connected);         sendAck(&answer);         mCurrentRemoteSdp = mProposedRemoteSdp;         mCurrentLocalSdp = InviteSession::makeSdp(answer);         break;      default:         WarningLog (<< "Incorrect state to provideAnswer: " << toData(mState));         throw DialogUsage::Exception("Can't provide an answer", __FILE__,__LINE__);   }}class InviteSessionProvideAnswerCommand : public DumCommandAdapter{public:   InviteSessionProvideAnswerCommand(InviteSession& inviteSession, const SdpContents& answer)      : mInviteSession(inviteSession),        mAnswer(answer)   {   }   virtual void executeCommand()   {      mInviteSession.provideOffer(mAnswer);   }   virtual std::ostream& encodeBrief(std::ostream& strm) const   {      return strm << "InviteSessionProvideAnswerCommand";   }private:   InviteSession& mInviteSession;   SdpContents mAnswer;};voidInviteSession::provideAnswerCommand(const SdpContents& answer){   mDum.post(new InviteSessionProvideAnswerCommand(*this, answer));}voidInviteSession::end(){   end(NotSpecified);}voidInviteSession::end(EndReason reason){   if (mEndReason == NotSpecified)   {      mEndReason = reason;      }      InviteSessionHandler* handler = mDum.mInviteSessionHandler;   switch (mState)   {      case Connected:      case SentUpdate:      case SentUpdateGlare:      case SentReinviteGlare:      case SentReinviteNoOfferGlare:      case SentReinviteAnswered:      {         // !jf! do we need to store the BYE somewhere?         sendBye();         transition(Terminated);         handler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended);          break;      }      case SentReinvite:      case SentReinviteNoOffer:         transition(WaitingToTerminate);         break;      case Answered:      case WaitingToOffer:      case WaitingToRequestOffer:      case ReceivedReinviteSentOffer:         if(mCurrentRetransmit200)  // If retransmit200 timer is active then ACK is not received yet - wait for it         {            transition(WaitingToHangup);         }         else         {             // ACK has likely timedout - hangup immediately             sendBye();             transition(Terminated);             mDum.mInviteSessionHandler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended);         }         break;      case ReceivedUpdate:      case ReceivedReinvite:      case ReceivedReinviteNoOffer:      {         SharedPtr<SipMessage> response(new SipMessage);         mDialog.makeResponse(*response, *mLastRemoteSessionModification, 488);         InfoLog (<< "Sending " << response->brief());         send(response);         sendBye();         transition(Terminated);         handler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended);          break;      }      case WaitingToTerminate:  // ?slg?  Why is this here?      {         sendBye();         transition(Terminated);         handler->onTerminated(getSessionHandle(), InviteSessionHandler::Ended);          break;      }      case Terminated:         // no-op.         break;      default:         assert(0);         break;   }}class InviteSessionEndCommand : public DumCommandAdapter{public:   InviteSessionEndCommand(InviteSession& inviteSession, InviteSession::EndReason reason)      : mInviteSession(inviteSession),        mReason(reason)   {   }   virtual void executeCommand()   {      mInviteSession.end(mReason);   }   virtual std::ostream& encodeBrief(std::ostream& strm) const   {      return strm << "InviteSessionEndCommand";   }private:   InviteSession& mInviteSession;   InviteSession::EndReason mReason;};voidInviteSession::endCommand(EndReason reason){   mDum.post(new InviteSessionEndCommand(*this, reason));}voidInviteSession::reject(int statusCode, WarningCategory *warning){   switch (mState)   {      case ReceivedUpdate:      case ReceivedReinvite:      case ReceivedReinviteNoOffer:      {         transition(Connected);         SharedPtr<SipMessage> response(new SipMessage);         mDialog.makeResponse(*response, *mLastRemoteSessionModification, statusCode);         if(warning)         {            response->header(h_Warnings).push_back(*warning);         }         InfoLog (<< "Sending " << response->brief());         send(response);         break;      }      default:         assert(0);         break;   }}class InviteSessionRejectCommand : public DumCommandAdapter{public:   InviteSessionRejectCommand(InviteSession& inviteSession, int code, WarningCategory* warning)      : mInviteSession(inviteSession),        mCode(code),        mWarning(warning?new WarningCategory(*warning):0)   {   }   virtual void executeCommand()   {      mInviteSession.reject(mCode, mWarning.get());   }   virtual std::ostream& encodeBrief(std::ostream& strm) const   {      return strm << "InviteSessionRejectCommand";   }private:   InviteSession& mInviteSession;   int mCode;   std::auto_ptr<WarningCategory> mWarning;};voidInviteSession::rejectCommand(int code, WarningCategory *warning){   mDum.post(new InviteSessionRejectCommand(*this, code, warning));}voidInviteSession::targetRefresh(const NameAddr& localUri){   if (isConnected()) // ?slg? likely not safe in any state except Connected - what should behaviour be if state is ReceivedReinvite?   {      mDialog.mLocalContact = localUri;      sessionRefresh();   }   else   {      WarningLog (<< "Can't targetRefresh before Connected");      throw UsageUseException("targetRefresh not allowed in this context", __FILE__, __LINE__);   }}voidInviteSession::refer(const NameAddr& referTo, bool referSub){   refer(referTo,std::auto_ptr<resip::Contents>(0),referSub);}voidInviteSession::refer(const NameAddr& referTo, std::auto_ptr<resip::Contents> contents,bool referSub){   if (isConnected()) // ?slg? likely not safe in any state except Connected - what should behaviour be if state is ReceivedReinvite?   {      SharedPtr<SipMessage> refer(new SipMessage());      mDialog.makeRequest(*refer, REFER);      refer->header(h_ReferTo) = referTo;      refer->header(h_ReferredBy) = myAddr();       refer->header(h_ReferredBy).remove(p_tag);   // tag-param not permitted in rfc3892; not the same as generic-param      refer->setContents(contents);      if (!referSub)      {         refer->header(h_ReferSub).value() = "false";         refer->header(h_Supporteds).push_back(Token(Symbols::NoReferSub));      }      if(mNitState == NitComplete)      {         mNitState = NitProceeding;         mReferSub = referSub;         send(refer);         return;      }      mNITQueue.push(new QueuedNIT(refer,referSub));      DebugLog(<< "refer - queuing NIT:" << refer->brief()<<endl);      return;   }   else   {      WarningLog (<< "Can't refer before Connected");      assert(0);      throw UsageUseException("REFER not allowed in this context", __FILE__, __LINE__);   }}voidInviteSession::nitComplete(){   mNitState = NitComplete;   if (mNITQueue.size())   {      QueuedNIT *qn=mNITQueue.front();      mNITQueue.pop();      mNitState = NitProceeding;      mReferSub = qn->referSubscription();      DebugLog(<< "checkNITQueue - sending queued NIT:" << qn->getNIT()->brief()<<endl);      send(qn->getNIT());      delete qn;   }}class InviteSessionReferCommand : public DumCommandAdapter{public:   InviteSessionReferCommand(InviteSession& inviteSession, const NameAddr& referTo, bool referSub)      : mInviteSession(inviteSession),      mReferTo(referTo),      mReferSub(referSub)   {   }   virtual void executeCommand()   {      mInviteSession.refer(mReferTo, mReferSub);   }   virtual std::ostream& encodeBrief(std::ostream& strm) const   {      return strm << "InviteSessionReferCommand";   }private:   InviteSession& mInviteSession;   NameAddr mReferTo;   bool mReferSub;};voidInviteSession::referCommand(const NameAddr& referTo, bool referSub){   mDum.post(new InviteSessionReferCommand(*this, referTo, referSub));}voidInviteSession::refer(const NameAddr& referTo, InviteSessionHandle sessionToReplace, bool referSub){   if (!sessionToReplace.isValid())   {      throw UsageUseException("Attempted to make a refer w/ and invalid replacement target", __FILE__, __LINE__);   }   if (isConnected())  // ?slg? likely not safe in any state except Connected - what should behaviour be if state is ReceivedReinvite?   {      SharedPtr<SipMessage> refer(new SipMessage());            mDialog.makeRequest(*refer, REFER);      refer->header(h_ReferTo) = referTo;      refer->header(h_ReferredBy) = myAddr();      refer->header(h_ReferredBy).remove(p_tag);      CallId replaces;      DialogId id = sessionToReplace->mDialog.getId();      replaces.value() = id.getCallId();      replaces.param(p_toTag) = id.getRemoteTag();      replaces.param(p_fromTag) = id.getLocalTag();      refer->header(h_ReferTo).uri().embedded().header(h_Replaces) = replaces;            if (!referSub)      {         refer->header(h_ReferSub).value() = "false";         refer->header(h_Supporteds).push_back(Token(Symbols::NoReferSub));      }      if(mNitState == NitComplete)      {         mNitState = NitProceeding;         mReferSub = referSub;         send(refer);         return;      }      mNITQueue.push(new QueuedNIT(refer,referSub));      DebugLog(<< "refer/replace - queuing NIT:" << refer->brief()<<endl);      return;   }   else   {      WarningLog (<< "Can't refer before Connected");      assert(0);      throw UsageUseException("REFER not allowed in this context", __FILE__, __LINE__);   }}class InviteSessionReferExCommand : public DumCommandAdapter{public:   InviteSessionReferExCommand(InviteSession& inviteSession, const NameAddr& referTo, InviteSessionHandle sessionToReplace, bool referSub)      : mInviteSession(inviteSession),      mSessionToReplace(sessionToReplace),      mReferTo(referTo),      mReferSub(referSub)   {   }   virtual void executeCommand()   {      mInviteSession.referCommand(mReferTo, mSessionToReplace, mReferSub);   }   virtual std::ostream& encodeBrief(std::ostream& strm) const   {      return strm << "InviteSessionReferExCommand";   }private:   InviteSession& mInviteSession;   InviteSessionHandle mSessionToReplace;   NameAddr mReferTo;   bool mReferSub;};voidInviteSession::referCommand(const NameAddr& referTo, InviteSessionHandle sessionToReplace, bool referSub){   mDum.post(new InviteSessionReferExCommand(*this, referTo, sessionToReplace, referSub));}voidInviteSession::info(const Contents& contents){   if (isConnected())  // ?slg? likely not safe in any state except Connected - what should behaviour be if state is ReceivedReinvite?   {      SharedPtr<SipMessage> info(new SipMessage());      mDialog.makeRequest(*info, INFO);      // !jf! handle multipart here      info->setContents(&contents);      DumHelper::setOutgoingEncryptionLevel(*info, mCurrentEncryptionLevel);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -