--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CResHandler.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,202 @@
+// Copyright (c) 2002-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 : CResHandler.cpp
+// Part of : ConnectionMgr
+// Version : SIP/4.0
+//
+
+
+
+
+#include "CResHandler.h"
+#include "SipLogs.h"
+#include "Lwtimer.h"
+#include "CTransportUdp.h"
+#include "multipleaddrressender.h"
+#include "sipresponse.h"
+#include "sipmessage.h"
+
+const TInt CResponseHandler::iOffset = _FOFF(CResponseHandler, iLink);
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::NewL
+// -----------------------------------------------------------------------------
+//
+CResponseHandler* CResponseHandler::NewL(CTransportUdp& aOwner,
+ MTimerManager& aTimer,
+ CSIPServerResolver& aServerResolver,
+ TTransactionId aId,
+ TUint aICMPErrorWaitTime)
+ {
+ CResponseHandler* self = NewLC(aOwner, aTimer, aServerResolver,
+ aId, aICMPErrorWaitTime);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::NewLC
+// -----------------------------------------------------------------------------
+//
+CResponseHandler* CResponseHandler::NewLC(CTransportUdp& aOwner,
+ MTimerManager& aTimer,
+ CSIPServerResolver& aServerResolver,
+ TTransactionId aId,
+ TUint aICMPErrorWaitTime)
+ {
+ CResponseHandler* self =
+ new (ELeave) CResponseHandler(aOwner, aTimer, aServerResolver,
+ aId, aICMPErrorWaitTime);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::Handle
+// -----------------------------------------------------------------------------
+//
+TBool CResponseHandler::Handle(TTransactionId aId) const
+ {
+ return (aId == iId);
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::SendL
+// -----------------------------------------------------------------------------
+//
+void CResponseHandler::SendL(const TSIPTransportParams& aParams,
+ CSIPResponse& aResponse,
+ const TInetAddr& aAddr,
+ TRequestStatus& aStat)
+ {
+ CMultipleAddrResSender* multiSender =
+ new (ELeave) CMultipleAddrResSender(aParams,
+ *this,
+ *iTimer,
+ *iServerResolver,
+ iICMPErrorWaitTime
+ );
+ iList.AddLast(*multiSender);
+ multiSender->SendL(aResponse, aAddr, aStat);
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::CancelAll
+// -----------------------------------------------------------------------------
+//
+TBool CResponseHandler::CancelAll(
+ TTransactionId aId,
+ TBool aCancelAlso2xxResponses)
+ {
+ if ( aId == iId )
+ {
+ CMultipleAddrResSender* listItem;
+ iListIter.SetToFirst();
+ while ( ( listItem = iListIter++ ) != 0 )
+ {
+ if ( aCancelAlso2xxResponses || !listItem->Has2xxResponse() )
+ {
+ iList.Remove( *listItem );
+ delete listItem;
+ }
+ }
+ if ( iList.IsEmpty() )
+ {
+ iTransport->RemoveResHandler( this );
+ }
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::SendToNetL
+// -----------------------------------------------------------------------------
+//
+void CResponseHandler::SendToNetL(const TSIPTransportParams& aParams,
+ CSIPResponse& aResponse,
+ const TInetAddr& aAddr,
+ TRequestStatus& aStat)
+ {
+ iTransport->SendToNetL(aParams, aAddr, aResponse, aStat);
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::CancelRequest
+// -----------------------------------------------------------------------------
+//
+TBool CResponseHandler::CancelRequest(TRequestStatus& aStat)
+ {
+ return iTransport->CancelSend(aStat);
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::ICMPErrorL
+// -----------------------------------------------------------------------------
+//
+void CResponseHandler::ICMPErrorL(CSipConnectionMgr::TICMPError aICMPError,
+ const TInetAddr& aSourceAddr)
+ {
+ CMultipleAddrResSender* listItem;
+ iListIter.SetToFirst();
+ while ((listItem = iListIter++) !=0)
+ {
+ listItem->ICMPErrorL(aICMPError, aSourceAddr);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::Remove
+// -----------------------------------------------------------------------------
+//
+void CResponseHandler::Remove(CMultipleAddrResSender* aSender)
+ {
+ if( !iList.IsEmpty() )
+ {
+ iList.Remove(*aSender);
+ delete aSender;
+ __SIP_LOG( "CMultipleAddrResSender removed" )
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::CResponseHandler
+// -----------------------------------------------------------------------------
+//
+CResponseHandler::CResponseHandler(CTransportUdp& aOwner,
+ MTimerManager& aTimer,
+ CSIPServerResolver& aServerResolver,
+ TTransactionId aId,
+ TUint aICMPErrorWaitTime) :
+ iTransport(&aOwner), iTimer(&aTimer), iServerResolver(&aServerResolver),
+ iList(CMultipleAddrResSender::iMultisenderOffset), iListIter(iList),
+ iICMPErrorWaitTime(aICMPErrorWaitTime)
+ {
+ iId = aId;
+ }
+
+// -----------------------------------------------------------------------------
+// CResponseHandler::~CResponseHandler
+// -----------------------------------------------------------------------------
+//
+CResponseHandler::~CResponseHandler()
+ {
+ CMultipleAddrResSender* listItem = 0;
+ iListIter.SetToFirst();
+ while ((listItem = iListIter++) != 0)
+ {
+ iList.Remove(*listItem);
+ delete listItem;
+ }
+ }