[Opalvoip-svn] SF.net SVN: opalvoip:[24604] opal/branches/Sirius_B
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2010-07-29 01:00:43
|
Revision: 24604 http://opalvoip.svn.sourceforge.net/opalvoip/?rev=24604&view=rev Author: rjongbloed Date: 2010-07-29 01:00:37 +0000 (Thu, 29 Jul 2010) Log Message: ----------- Fixed failure to increment CSeq index in SUBSCRIBE/NOTIFY commands if get a authentication challenge. Modified Paths: -------------- opal/branches/Sirius_B/include/sip/handlers.h opal/branches/Sirius_B/include/sip/sippdu.h opal/branches/Sirius_B/src/sip/handlers.cxx opal/branches/Sirius_B/src/sip/sipcon.cxx opal/branches/Sirius_B/src/sip/sipep.cxx opal/branches/Sirius_B/src/sip/sippdu.cxx Modified: opal/branches/Sirius_B/include/sip/handlers.h =================================================================== --- opal/branches/Sirius_B/include/sip/handlers.h 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/include/sip/handlers.h 2010-07-29 01:00:37 UTC (rev 24604) @@ -142,7 +142,7 @@ void RetryLater(unsigned after); PDECLARE_NOTIFIER(PTimer, SIPHandler, OnExpireTimeout); static PBoolean WriteSIPHandler(OpalTransport & transport, void * info); - bool WriteSIPHandler(OpalTransport & transport); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); SIPEndPoint & endpoint; @@ -236,6 +236,7 @@ protected: virtual PBoolean SendRequest(SIPHandler::State state); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); void SendStatus(SIP_PDU::StatusCodes code, State state); bool DispatchNOTIFY(SIP_PDU & request, SIP_PDU & response); @@ -278,6 +279,7 @@ protected: virtual PBoolean SendRequest(SIPHandler::State state); + virtual bool WriteSIPHandler(OpalTransport & transport, bool forked); SIPEventPackage m_eventPackage; SIPDialogContext m_dialog; Modified: opal/branches/Sirius_B/include/sip/sippdu.h =================================================================== --- opal/branches/Sirius_B/include/sip/sippdu.h 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/include/sip/sippdu.h 2010-07-29 01:00:37 UTC (rev 24604) @@ -734,7 +734,9 @@ void Update(const SIP_PDU & response); - unsigned GetNextCSeq(unsigned inc = 1) { return m_lastSentCSeq += inc; } + unsigned GetNextCSeq(); + void IncrementCSeq(unsigned inc) { m_lastSentCSeq += inc; } + bool IsDuplicateCSeq(unsigned sequenceNumber); bool IsEstablished() const @@ -747,6 +749,8 @@ bool UsePeerTransportAddress() const { return m_usePeerTransportAddress; } + void SetForking(bool f) { m_forking = f; } + protected: PString m_callId; SIPURL m_requestURI; @@ -758,6 +762,7 @@ unsigned m_lastSentCSeq; unsigned m_lastReceivedCSeq; bool m_usePeerTransportAddress; + bool m_forking; SIPURL m_proxy; }; Modified: opal/branches/Sirius_B/src/sip/handlers.cxx =================================================================== --- opal/branches/Sirius_B/src/sip/handlers.cxx 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/src/sip/handlers.cxx 2010-07-29 01:00:37 UTC (rev 24604) @@ -262,7 +262,7 @@ } else { // We contacted the server on an interface last time, assume it still works! - if (WriteSIPHandler(*m_transport)) + if (WriteSIPHandler(*m_transport, false)) return true; } @@ -336,11 +336,11 @@ PBoolean SIPHandler::WriteSIPHandler(OpalTransport & transport, void * param) { - return param != NULL && ((SIPHandler *)param)->WriteSIPHandler(transport); + return param != NULL && ((SIPHandler *)param)->WriteSIPHandler(transport, true); } -bool SIPHandler::WriteSIPHandler(OpalTransport & transport) +bool SIPHandler::WriteSIPHandler(OpalTransport & transport, bool /*forked*/) { SIPTransaction * transaction = CreateTransaction(transport); @@ -876,6 +876,15 @@ } +bool SIPSubscribeHandler::WriteSIPHandler(OpalTransport & transport, bool forked) +{ + m_dialog.SetForking(forked); + bool ok = SIPHandler::WriteSIPHandler(transport, forked); + m_dialog.SetForking(false); + return ok; +} + + void SIPSubscribeHandler::SendStatus(SIP_PDU::StatusCodes code, State state) { SIPEndPoint::SubscriptionStatus status; @@ -1504,6 +1513,15 @@ } +bool SIPNotifyHandler::WriteSIPHandler(OpalTransport & transport, bool forked) +{ + m_dialog.SetForking(forked); + bool ok = SIPHandler::WriteSIPHandler(transport, forked); + m_dialog.SetForking(false); + return ok; +} + + bool SIPNotifyHandler::SendNotify(const PObject * body) { if (!LockReadWrite()) Modified: opal/branches/Sirius_B/src/sip/sipcon.cxx =================================================================== --- opal/branches/Sirius_B/src/sip/sipcon.cxx 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/src/sip/sipcon.cxx 2010-07-29 01:00:37 UTC (rev 24604) @@ -1440,7 +1440,9 @@ ok = WriteINVITE(); else { PWaitAndSignal mutex(transport->GetWriteMutex()); + m_dialog.SetForking(true); ok = transport->WriteConnect(WriteINVITE, this); + m_dialog.SetForking(false); } if (ok) { @@ -2396,10 +2398,6 @@ m_authentication = newAuth; m_authenticatedCseq = cseq; - // Make sure we increment sequence number as the call inside SIPInvite ctor - // will not do so due to prevention to increment on "interface forked" INVITEs - m_dialog.GetNextCSeq(); - transport->SetInterface(transaction.GetInterface()); SIPTransaction * newTransaction = transaction.CreateDuplicate(); Modified: opal/branches/Sirius_B/src/sip/sipep.cxx =================================================================== --- opal/branches/Sirius_B/src/sip/sipep.cxx 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/src/sip/sipep.cxx 2010-07-29 01:00:37 UTC (rev 24604) @@ -490,7 +490,7 @@ /* This is an extra increment of the sequence number to allow for any PDU's in the dialog being sent between the last saved context. Highly unlikely this will ever by a million ... */ - context.GetNextCSeq(1000000); + context.IncrementCSeq(1000000); std::auto_ptr<OpalTransport> transport(CreateTransport(context.GetRemoteURI(), context.GetLocalURI().GetHostName())); PSafePtr<SIPTransaction> byeTransaction = new SIPBye(*this, *transport, context); Modified: opal/branches/Sirius_B/src/sip/sippdu.cxx =================================================================== --- opal/branches/Sirius_B/src/sip/sippdu.cxx 2010-07-28 08:26:00 UTC (rev 24603) +++ opal/branches/Sirius_B/src/sip/sippdu.cxx 2010-07-29 01:00:37 UTC (rev 24604) @@ -1701,7 +1701,7 @@ dialog.GetRemoteURI(), dialog.GetLocalURI(), dialog.GetCallID(), - dialog.GetNextCSeq(dialog.IsEstablished() && m_method != Method_ACK ? 1 : 0), + dialog.GetNextCSeq(), via); SetRoute(dialog.GetRouteSet()); m_usePeerTransportAddress = dialog.UsePeerTransportAddress(); @@ -2231,9 +2231,10 @@ SIPDialogContext::SIPDialogContext() : m_callId(SIPTransaction::GenerateCallID()) - , m_lastSentCSeq(1) + , m_lastSentCSeq(0) , m_lastReceivedCSeq(0) , m_usePeerTransportAddress(false) + , m_forking(false) { } @@ -2404,6 +2405,15 @@ } +unsigned SIPDialogContext::GetNextCSeq() +{ + if (m_forking && m_lastSentCSeq > 0) + return m_lastSentCSeq; + + return ++m_lastSentCSeq; +} + + bool SIPDialogContext::IsDuplicateCSeq(unsigned requestCSeq) { /* See if have had a mesage before and this one is older than the last, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |