📄 invitesession.cxx
字号:
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 + -