realtimenetprots/sipfw/SIP/TransactionUser/src/TransactionHeaders.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/TransactionUser/src/TransactionHeaders.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,229 @@
+// Copyright (c) 2005-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          : TransactionHeaders.cpp
+// Part of       : TransactionUser
+// Version       : SIP/4.0
+//
+
+
+
+#include "uricontainer.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "sipcallidheader.h"
+#include "siprecordrouteheader.h"
+#include "sipcontactheader.h"
+
+#include "CTransactionHeaders.h"
+
+#ifdef CPPUNIT_TEST
+#include "TestCleanupStack.h"
+#endif
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::NewL
+// -----------------------------------------------------------------------------
+//
+CTransactionHeaders*
+CTransactionHeaders::NewL(const CURIContainer* aRequestURI,
+                          const CSIPToHeader* aTo,
+						  const CSIPFromHeader* aFrom,
+						  const CSIPCallIDHeader* aCallID,
+						  TUint aCSeq,
+						  RPointerArray<CSIPRecordRouteHeader>& aRecordRoute,
+						  RPointerArray<CSIPContactHeader>& aContact)
+	{
+	CTransactionHeaders* self = new (ELeave) CTransactionHeaders(aCSeq);
+	CleanupStack::PushL(self);
+	self->ConstructL(aRequestURI, aTo, aFrom, aCallID, aRecordRoute, aContact);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::CTransactionHeaders
+// -----------------------------------------------------------------------------
+//
+CTransactionHeaders::CTransactionHeaders(TUint aCSeq) : iCSeq(aCSeq)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CTransactionHeaders::ConstructL(const CURIContainer* aRequestURI,
+                         const CSIPToHeader* aTo,
+					     const CSIPFromHeader* aFrom,
+					     const CSIPCallIDHeader* aCallID,
+					     RPointerArray<CSIPRecordRouteHeader>& aRecordRoute,
+					     RPointerArray<CSIPContactHeader>& aContact)
+	{
+    if (aRequestURI)
+        {
+        iRequestURI = CURIContainer::NewL(*aRequestURI);
+        }
+
+	if (aTo)
+		{
+		iTo = CSIPToHeader::NewL(*aTo);
+		}
+
+	if (aFrom)
+		{
+		iFrom = CSIPFromHeader::NewL(*aFrom);
+		}
+
+	if (aCallID)
+		{		
+		iCallID = static_cast<CSIPCallIDHeader*>(aCallID->CloneL());
+		}
+
+	if (aRecordRoute.Count() > 0)
+		{
+		iRecordRoute = new (ELeave) RPointerArray<CSIPRouteHeaderBase>(        
+#ifdef CPPUNIT_TEST
+            //For unit tests the granularity of arrays is set to 1 to cause
+            //them to allocate memory every time an item is appended to array    
+            1
+#endif      
+            );
+
+		for (TInt i = 0; i < aRecordRoute.Count(); i++)
+			{
+			CSIPRecordRouteHeader* rr =
+                static_cast<CSIPRecordRouteHeader*>(aRecordRoute[i]->CloneL());
+            CleanupStack::PushL(rr);
+			iRecordRoute->AppendL(rr);
+			CleanupStack::Pop(rr);
+			}
+		}
+
+	if (aContact.Count() > 0)
+		{
+		iContact = new (ELeave) RPointerArray<CSIPContactHeader>(
+#ifdef CPPUNIT_TEST
+            1
+#endif      
+            );
+
+		for (TInt i = 0; i < aContact.Count(); i++)
+			{
+			CSIPContactHeader* contact =
+				static_cast<CSIPContactHeader*>(aContact[i]->CloneL());
+			CleanupStack::PushL(contact);
+			iContact->AppendL(contact);
+			CleanupStack::Pop(contact);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::~CTransactionHeaders
+// -----------------------------------------------------------------------------
+//
+CTransactionHeaders::~CTransactionHeaders()
+	{
+    delete iRequestURI;
+	delete iTo;
+	delete iFrom;
+	delete iCallID;
+
+	if (iRecordRoute)
+		{
+		iRecordRoute->ResetAndDestroy();
+		}
+	delete iRecordRoute;
+
+	if (iContact)
+		{
+		iContact->ResetAndDestroy();
+		}
+	delete iContact;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::RequestURI
+// -----------------------------------------------------------------------------
+//
+CURIContainer* CTransactionHeaders::RequestURI()
+    {
+    CURIContainer* requestURI = iRequestURI;
+    iRequestURI = NULL;
+    return requestURI;
+    }
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::ToHeader
+// -----------------------------------------------------------------------------
+//
+CSIPToHeader* CTransactionHeaders::ToHeader()
+	{
+	CSIPToHeader* to = iTo;	
+	iTo = NULL;
+	return to;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::FromHeader
+// -----------------------------------------------------------------------------
+//
+CSIPFromHeader* CTransactionHeaders::FromHeader()
+	{
+	CSIPFromHeader* from = iFrom;
+	iFrom = NULL;
+	return from;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::CallIDHeader
+// -----------------------------------------------------------------------------
+//
+CSIPCallIDHeader* CTransactionHeaders::CallIDHeader()
+	{
+	CSIPCallIDHeader* callID = iCallID;
+	iCallID = NULL;
+	return callID;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::CSeqNumber
+// -----------------------------------------------------------------------------
+//
+TUint CTransactionHeaders::CSeqNumber() const
+	{
+	return iCSeq;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::RecordRoute
+// -----------------------------------------------------------------------------
+//
+RPointerArray<CSIPRouteHeaderBase>* CTransactionHeaders::RecordRoute()
+	{
+	RPointerArray<CSIPRouteHeaderBase>* recordRoute = iRecordRoute;
+	iRecordRoute = NULL;
+	return recordRoute;
+	}
+
+// -----------------------------------------------------------------------------
+// CTransactionHeaders::Contact
+// -----------------------------------------------------------------------------
+//
+RPointerArray<CSIPContactHeader>* CTransactionHeaders::Contact()
+	{
+	RPointerArray<CSIPContactHeader>* contact = iContact;
+	iContact = NULL;
+	return contact;
+	}