diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Transaction/src/InviteServerTa.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Transaction/src/InviteServerTa.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,338 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Name : InviteServerTa.cpp +// Part of : Transaction +// Version : SIP/5.0 +// + + + +#include "SipAssert.h" +#include "siperr.h" +#include "Lwtimer.h" +#include "sipmessage.h" +#include "UserAgentBase.h" +#include "TimerValues.h" + +#include "InviteServerTa.h" +#include "TransactionTimer.h" +#include "SIPMessageUtility.h" + + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::NewL +// ----------------------------------------------------------------------------- +// +CInviteServerTransaction* +CInviteServerTransaction::NewL(CUserAgentBase& aUserAgent, + CTransmitter& aTransmitter, + MTimerManager& aTimers, + CTransactionState& aInitialState, + TTimerValues& aTimerValues) + { + CInviteServerTransaction* self = + new (ELeave) CInviteServerTransaction(aUserAgent, + aTransmitter, + aTimers, + aInitialState, + aTimerValues); + CleanupStack::PushL(self); + self->ConstructServerTaL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::CInviteServerTransaction +// ----------------------------------------------------------------------------- +// +CInviteServerTransaction::CInviteServerTransaction( + CUserAgentBase& aUserAgent, + CTransmitter& aTransmitter, + MTimerManager& aTimers, + CTransactionState& aInitialState, + TTimerValues& aTimerValues) : + CServerTransaction(aUserAgent, + aTransmitter, + aTimers, + aInitialState, + aTimerValues) + { + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::~CInviteServerTransaction +// ----------------------------------------------------------------------------- +// +CInviteServerTransaction::~CInviteServerTransaction() + { + //Scope operator to silence lint warning + CInviteServerTransaction::CancelAllTimers(); + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::IsInviteTransaction +// ----------------------------------------------------------------------------- +// +TBool CInviteServerTransaction::IsInviteTransaction() const + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::ResponseSent +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::ResponseSent(TUint aRespCode, + CTransactionState& aSending2xx, + CTransactionState& aCompleted) + { + __TEST_INVARIANT; + + if (aRespCode >= 200) + { + if (aRespCode < 300) + { + ChangeState(aSending2xx); + } + else + { + ChangeState(aCompleted); + } + } + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::EnterConfirmedStateL +// ----------------------------------------------------------------------------- +// +void +CInviteServerTransaction::EnterConfirmedStateL(CTransactionState& aConfirmed) + { + __TEST_INVARIANT; + + StopTimerG(); + StopTimerH(); + StartTimerIL(); + ChangeState(aConfirmed); + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StartTimerGUnlessExistsL +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StartTimerGUnlessExistsL() + { + __TEST_INVARIANT; + + if (!iTimerG) + { + iTimerValues.DoubleUptoT2(iTimerGDuration); + iTimerG = CTimerRetransmit::NewL(iTimers, this, iTimerGDuration); + } + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StopTimerG +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StopTimerG() + { + __TEST_INVARIANT; + + delete iTimerG; + iTimerG = NULL; + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StartTimerHL +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StartTimerHL() + { + __TEST_INVARIANT; + __SIP_ASSERT_LEAVE(!iTimerH, KErrAlreadyExists); + + iTimerH = CTimerTerminateTa::NewL(iTimers, + this, + iTimerValues.Duration64xT1(), + KErrTimedOut); + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StopTimerH +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StopTimerH() + { + __TEST_INVARIANT; + + delete iTimerH; + iTimerH = NULL; + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StartTimerIL +// Duration is 0s for reliable and T4 for unreliable transports. +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StartTimerIL() + { + __TEST_INVARIANT; + __SIP_ASSERT_LEAVE(!iTimerI, KErrAlreadyExists); + + TUint32 duration = 0; + if (IsUnreliableTransportUsed()) + { + duration = iTimerValues.T4(); + } + + iTimerI = CTimerTerminateTa::NewL(iTimers, this, duration); + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::StopTimerI +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::StopTimerI() + { + __TEST_INVARIANT; + + delete iTimerI; + iTimerI = NULL; + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::DeleteTimer +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::DeleteTimer(const CTransactionTimer& aTimer) + { + __TEST_INVARIANT; + + if (&aTimer == iTimerG) + { + StopTimerG(); + } + + if (&aTimer == iTimerH) + { + StopTimerH(); + } + + if (&aTimer == iTimerI) + { + StopTimerI(); + } + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::CancelAllTimers +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::CancelAllTimers() + { + __TEST_INVARIANT; + + StopTimerG(); + StopTimerH(); + StopTimerI(); + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::TerminatedL +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::TerminatedL(TInt aReason) + { + __TEST_INVARIANT; + + if (!iTerminated) + { + //CInviteServerTransaction specific stuff + Leave2xxForUAS(); + + //Common stuff + CServerTransaction::TerminatedL(aReason); + } + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::Leave2xxForUAS +// InviteUAS owns 2xx. If iOutgoingMsg is 2xx, clear it so ~CServerTransaction +// won't delete it. 2xx may be in iSendQueue, but the queue never owns 2xx to +// INVITE. 2xx can't be in iSentResponses as only one final response is sent to +// ServerTransaction and the most recent response is in iOutgoingMsg. +// ----------------------------------------------------------------------------- +// +void CInviteServerTransaction::Leave2xxForUAS() + { + __TEST_INVARIANT; + + if (iOutgoingMsg) + { + __SIP_ASSERT_RETURN(!iOutgoingMsg->IsRequest(), + KErrSIPMalformedMessage); + if (CSIPMessageUtility::Is2xxResponse(*iOutgoingMsg)) + { + iOutgoingMsg = NULL; + } + } + + __TEST_INVARIANT; + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::Ptr +// ----------------------------------------------------------------------------- +// +CInviteServerTransaction& +CInviteServerTransaction::Ptr(CTransactionBase& aTransaction) + { + return static_cast(aTransaction); + } + +// ----------------------------------------------------------------------------- +// CInviteServerTransaction::__DbgTestInvariant +// ----------------------------------------------------------------------------- +// + +void CInviteServerTransaction::__DbgTestInvariant() const + { + if (iTimerGDuration > iTimerValues.T2()) + { + User::Invariant(); + } + }