realtimenetprots/sipfw/SIP/Codec/src/CSIPHeaderLookupTable.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPHeaderLookupTable.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,500 @@
+// 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          : CSIPHeaderLookupTable.cpp
+// Part of       : SIP Codec
+// Version       : SIP/6.0 
+//
+
+
+
+#include "CSIPHeaderLookupTable.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "sipextensionheader.h"
+#include "sipfromheader.h"
+#include "siptoheader.h"
+#include "sipcallidheader.h"
+#include "sipcseqheader.h"
+#include "CSIPContentLengthHeader.h"
+#include "sipviaheader.h"
+#include "sipcontactheader.h"
+#include "sipcontenttypeheader.h"
+#include "sipexpiresheader.h"
+#include "sipmaxforwardsheader.h"
+#include "sipminexpiresheader.h"
+#include "siprecordrouteheader.h"
+#include "siprouteheader.h"
+#include "sipservicerouteheader.h"
+#include "siprequireheader.h"
+#include "sipcontentencodingheader.h"
+#include "sipproxyrequireheader.h"
+#include "sipsupportedheader.h"
+#include "sipunsupportedheader.h"
+#include "sipallowheader.h"
+#include "siprefertoheader.h"
+#include "sipsecurityclientheader.h"
+#include "sipsecurityserverheader.h"
+#include "sipsecurityverifyheader.h"
+#include "sipacceptheader.h"
+#include "sipacceptlanguageheader.h"
+#include "sipacceptencodingheader.h"
+#include "sipauthenticationinfoheader.h"
+#include "sipcontentdispositionheader.h"
+#include "sipsubscriptionstateheader.h"
+#include "sipeventheader.h"
+#include "sipalloweventsheader.h"
+#include "sipauthorizationheader.h"
+#include "sipproxyauthenticateheader.h"
+#include "sipproxyauthorizationheader.h"
+#include "sipwwwauthenticateheader.h"
+#include "sipreplytoheader.h"
+#include "siprackheader.h"
+#include "siprseqheader.h"
+#include "siptimestampheader.h"
+#include "sipretryafterheader.h"
+#include "sipacceptcontactheader.h"
+#include "sippaccessnetworkinfoheader.h"
+#include "sippassociateduriheader.h"
+
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderLookupTable* CSIPHeaderLookupTable::NewL ()
+	{
+	CSIPHeaderLookupTable* self = CSIPHeaderLookupTable::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	} 
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderLookupTable* CSIPHeaderLookupTable::NewLC()
+	{
+	CSIPHeaderLookupTable* self = new(ELeave)CSIPHeaderLookupTable;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::CSIPHeaderLookupTable
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderLookupTable::CSIPHeaderLookupTable()
+ : iUsageCount(1), iConvertToSIPURI(EFalse)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::ConstructL()
+    {
+    // CSIPViaHeader:
+    AddL (SIPStrings::StringF(SipStrConsts::EViaHeader),
+          SIPStrings::StringF(SipStrConsts::EViaHeaderCompact),
+          &CSIPViaHeader::BaseDecodeL);
+
+	// CSIPRouteHeader: 
+    AddL (SIPStrings::StringF(SipStrConsts::ERouteHeader),
+	      &CSIPRouteHeader::BaseDecodeL,
+          &CSIPRouteHeader::InternalizeValueL);
+
+	// CSIPRecordRouteHeader: 
+    AddL (SIPStrings::StringF(SipStrConsts::ERecordRouteHeader),
+	      &CSIPRecordRouteHeader::BaseDecodeL);
+
+	// CSIPServiceRouteHeader: 
+    AddL (SIPStrings::StringF(SipStrConsts::EServiceRouteHeader),
+	      &CSIPServiceRouteHeader::BaseDecodeL);
+
+	// CSIPFromHeader:
+    AddL (SIPStrings::StringF(SipStrConsts::EFromHeader),
+          SIPStrings::StringF(SipStrConsts::EFromHeaderCompact),
+          &CSIPFromHeader::BaseDecodeL,
+          &CSIPFromHeader::InternalizeValueL);
+
+	// CSIPToHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EToHeader),
+          SIPStrings::StringF(SipStrConsts::EToHeaderCompact),
+          &CSIPToHeader::BaseDecodeL,
+          &CSIPToHeader::InternalizeValueL);
+
+	// CSIPCallIDHeader: 
+    AddL (SIPStrings::StringF(SipStrConsts::ECallIDHeader),
+          SIPStrings::StringF(SipStrConsts::ECallIDHeaderCompact),
+          &CSIPCallIDHeader::BaseDecodeL);
+
+	// CSIPCSeqHeader: 
+	AddL (SIPStrings::StringF(SipStrConsts::ECSeqHeader),
+	      &CSIPCSeqHeader::BaseDecodeL,
+	      &CSIPCSeqHeader::InternalizeValueL);
+
+	// CSIPContactHeader:
+    AddL (SIPStrings::StringF(SipStrConsts::EContactHeader),
+          SIPStrings::StringF(SipStrConsts::EContactHeaderCompact),	
+          &CSIPContactHeader::BaseDecodeL,
+          &CSIPContactHeader::InternalizeValueL);
+
+	// CSIPExpiresHeader: 
+    AddL (SIPStrings::StringF(SipStrConsts::EExpiresHeader),
+          &CSIPExpiresHeader::BaseDecodeL,
+          &CSIPExpiresHeader::InternalizeValueL);
+
+	// CSIPMinExpiresHeader: 
+	AddL (SIPStrings::StringF(SipStrConsts::EMinExpiresHeader),
+	      &CSIPMinExpiresHeader::BaseDecodeL);
+
+	// CSIPMaxForwardsHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EMaxForwardsHeader),
+	      &CSIPMaxForwardsHeader::BaseDecodeL);
+
+	// CSIPContentTypeHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EContentTypeHeader),
+          SIPStrings::StringF(SipStrConsts::EContentTypeHeaderCompact),
+          &CSIPContentTypeHeader::BaseDecodeL,
+          &CSIPContentTypeHeader::InternalizeValueL);
+          
+	// CSIPContentLengthHeader: 
+	AddL (SIPStrings::StringF(SipStrConsts::EContentLengthHeader),
+          SIPStrings::StringF(SipStrConsts::EContentLengthHeaderCompact),
+          &CSIPContentLengthHeader::BaseDecodeL);
+
+	// CSIPContentEncodingHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EContentEncodingHeader),
+	      SIPStrings::StringF(SipStrConsts::EContentEncodingHeaderCompact),
+          &CSIPContentEncodingHeader::BaseDecodeL,
+          &CSIPContentEncodingHeader::InternalizeValueL);
+
+    // CSIPAllowHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EAllowHeader),
+	      &CSIPAllowHeader::BaseDecodeL,
+          &CSIPAllowHeader::InternalizeValueL);
+
+	// CSIPSupportedHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ESupportedHeader),
+	      SIPStrings::StringF(SipStrConsts::ESupportedHeaderCompact),
+          &CSIPSupportedHeader::BaseDecodeL,
+          &CSIPSupportedHeader::InternalizeValueL);
+
+    // CSIPUnsupportedHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EUnsupportedHeader),
+	      &CSIPUnsupportedHeader::BaseDecodeL,
+          &CSIPUnsupportedHeader::InternalizeValueL);
+
+	// CSIPRequireHeader: 
+	AddL (SIPStrings::StringF(SipStrConsts::ERequireHeader),
+	      &CSIPRequireHeader::BaseDecodeL,
+          &CSIPRequireHeader::InternalizeValueL);
+
+	// CSIPProxyRequireHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EProxyRequireHeader),
+	      &CSIPProxyRequireHeader::BaseDecodeL,
+          &CSIPProxyRequireHeader::InternalizeValueL);
+	
+	// CSIPReferToHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EReferToHeader),
+	      SIPStrings::StringF(SipStrConsts::EReferToHeaderCompact),
+          &CSIPReferToHeader::BaseDecodeL,
+          &CSIPReferToHeader::InternalizeValueL);        
+
+    // CSIPSecurityClientHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ESecurityClientHeader),
+	      &CSIPSecurityClientHeader::BaseDecodeL,
+          &CSIPSecurityClientHeader::InternalizeValueL);
+
+    // CSIPSecurityServerHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ESecurityServerHeader),
+	      &CSIPSecurityServerHeader::BaseDecodeL);          
+
+    // CSIPSecurityVerifyHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ESecurityVerifyHeader),
+	      &CSIPSecurityVerifyHeader::BaseDecodeL);
+
+	// CSIPAuthenticationInfoHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EAuthenticationInfoHeader),
+          &CSIPAuthenticationInfoHeader::BaseDecodeL);
+          
+	// CSIPAcceptHeader:
+    AddL (SIPStrings::StringF(SipStrConsts::EAcceptHeader),
+          &CSIPAcceptHeader::BaseDecodeL,
+          &CSIPAcceptHeader::InternalizeValueL);
+
+	// CSIPAcceptEncodingHeader:
+    AddL (SIPStrings::StringF(SipStrConsts::EAcceptEncodingHeader),
+          &CSIPAcceptEncodingHeader::BaseDecodeL,
+          &CSIPAcceptEncodingHeader::InternalizeValueL);
+
+	// CSIPAcceptLanguageHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EAcceptLanguageHeader),
+	      &CSIPAcceptLanguageHeader::BaseDecodeL,
+          &CSIPAcceptLanguageHeader::InternalizeValueL);          
+
+	// CSIPContentDispositionHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EContentDispositionHeader),
+          &CSIPContentDispositionHeader::BaseDecodeL,
+          &CSIPContentDispositionHeader::InternalizeValueL);
+
+	// CSIPSubscriptionStateHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ESubscriptionStateHeader),
+          &CSIPSubscriptionStateHeader::BaseDecodeL,
+          &CSIPSubscriptionStateHeader::InternalizeValueL);
+
+	// CSIPAllowEventsHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EAllowEventsHeader),
+	      SIPStrings::StringF(SipStrConsts::EAllowEventsHeaderCompact),
+          &CSIPAllowEventsHeader::BaseDecodeL,
+          &CSIPAllowEventsHeader::InternalizeValueL);
+
+	// CSIPEventHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EEventHeader),
+	      SIPStrings::StringF(SipStrConsts::EEventHeaderCompact),
+          &CSIPEventHeader::BaseDecodeL,
+          &CSIPEventHeader::InternalizeValueL);
+          
+    // CSIPAuthorizationHeader:      
+	AddL (SIPStrings::StringF(SipStrConsts::EAuthorizationHeader),
+          &CSIPAuthorizationHeader::BaseDecodeL,
+          &CSIPAuthorizationHeader::InternalizeValueL);
+          
+    // CSIPProxyAuthenticateHeader:      
+	AddL (SIPStrings::StringF(SipStrConsts::EProxyAuthenticateHeader),
+          &CSIPProxyAuthenticateHeader::BaseDecodeL,
+          &CSIPProxyAuthenticateHeader::InternalizeValueL);
+          
+    // CSIPProxyAuthorizationHeader:      
+	AddL (SIPStrings::StringF(SipStrConsts::EProxyAuthorizationHeader),
+          &CSIPProxyAuthorizationHeader::BaseDecodeL,
+          &CSIPProxyAuthorizationHeader::InternalizeValueL);
+          
+    // CSIPWWWAuthenticateHeader:      
+	AddL (SIPStrings::StringF(SipStrConsts::EWWWAuthenticateHeader),
+          &CSIPWWWAuthenticateHeader::BaseDecodeL,
+          &CSIPWWWAuthenticateHeader::InternalizeValueL);
+    
+	// CSIPReplyToHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EReplyToHeader),
+          &CSIPReplyToHeader::BaseDecodeL,
+          &CSIPReplyToHeader::InternalizeValueL);        
+
+    // CSIPRAckHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ERAckHeader),
+          &CSIPRAckHeader::BaseDecodeL,
+          &CSIPRAckHeader::InternalizeValueL);        
+
+    // CSIPRSeqHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ERSeqHeader),
+          &CSIPRSeqHeader::BaseDecodeL,
+          &CSIPRSeqHeader::InternalizeValueL);        
+    
+    // CSIPTimestampHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ETimestampHeader),
+          &CSIPTimestampHeader::BaseDecodeL,
+          &CSIPTimestampHeader::InternalizeValueL);        
+
+    // CSIPRetryAfterHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::ERetryAfterHeader),
+          &CSIPRetryAfterHeader::BaseDecodeL,
+          &CSIPRetryAfterHeader::InternalizeValueL); 
+    
+	// CSIPAcceptContactHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EAcceptContactHeader),
+          SIPStrings::StringF(SipStrConsts::EAcceptContactHeaderCompact),
+          &CSIPAcceptContactHeader::BaseDecodeL,
+          &CSIPAcceptContactHeader::InternalizeValueL);
+
+    // CSIPPAccessNetworkInfoHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EPAccessNetworkInfoHeader),
+          &CSIPPAccessNetworkInfoHeader::BaseDecodeL); 
+
+    // CSIPPAssociatedURIHeader:
+	AddL (SIPStrings::StringF(SipStrConsts::EPAssociatedURIHeader),
+          &CSIPPAssociatedURIHeader::BaseDecodeL,
+          &CSIPPAssociatedURIHeader::InternalizeValueL); 
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::~CSIPHeaderLookupTable
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderLookupTable::~CSIPHeaderLookupTable ()
+	{
+	iLookupTable.Close();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::IsSupported
+// -----------------------------------------------------------------------------
+//
+TBool CSIPHeaderLookupTable::IsSupported (RStringF aName) const
+	{
+	return (FindIndex(aName) >= 0);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::InternalizeL
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderBase* CSIPHeaderLookupTable::InternalizeL (RStringF aName,
+									                 RReadStream& aReadStream)
+	{
+	__ASSERT_ALWAYS(aName.DesC().Length() > 0, User::Leave(KErrArgument));
+
+	TInt index = FindIndex(aName);
+	if (index >= 0) // a supported header found
+		{
+		return iLookupTable[index].InternalizeL(aReadStream);
+		}
+
+	// a supported header not found, internalize extension header instead
+	CSIPExtensionHeader* extensionHeader =
+		CSIPExtensionHeader::InternalizeValueL(aReadStream);
+	CleanupStack::PushL (extensionHeader);
+	extensionHeader->SetNameL(aName.DesC());
+	CleanupStack::Pop(extensionHeader);
+	return extensionHeader;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::InternalizeSupported
+// -----------------------------------------------------------------------------
+//
+TBool CSIPHeaderLookupTable::InternalizeSupported (RStringF aName) const
+    {
+    TBool isSupported=EFalse;
+    TInt index = FindIndex (aName);
+    if (index >= 0)
+        {
+        isSupported = iLookupTable[index].InternalizeSupported();
+        }
+    return isSupported;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::CreateHeaderL
+// -----------------------------------------------------------------------------
+//
+RPointerArray<CSIPHeaderBase> 
+CSIPHeaderLookupTable::CreateHeaderL (RStringF aName,
+									  const TDesC8& aValue)
+	{
+	__ASSERT_ALWAYS(aName.DesC().Length() > 0, User::Leave(KErrArgument));
+
+	TInt index = FindIndex(aName);
+	if (index >= 0) // a supported header found
+		{
+		return iLookupTable[index].DecodeL(aValue);
+		}
+	
+	// a supported header not found, create extension header instead
+	RPointerArray<CSIPHeaderBase> headerArray;
+	CSIPHeaderBase* header = CSIPExtensionHeader::NewLC(aName.DesC(),aValue);
+	headerArray.AppendL(header);
+	CleanupStack::Pop(header);
+	return headerArray;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::IncrementUsageCount
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::IncrementUsageCount()
+	{
+	iUsageCount++;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::DecrementUsageCount
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::DecrementUsageCount()
+	{
+	iUsageCount--;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::UsageCount
+// -----------------------------------------------------------------------------
+//
+TUint CSIPHeaderLookupTable::UsageCount()
+	{
+	return iUsageCount;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::AddL
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::AddL(RStringF aFullName,
+                                 RPointerArray<CSIPHeaderBase>(*aDecode)(const TDesC8&),
+                                 CSIPHeaderBase*(*aInternalize)(RReadStream&))
+    {
+	TSIPHeaderLookupEntry entry(aFullName,aDecode,aInternalize);
+	User::LeaveIfError (iLookupTable.Append(entry));
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::AddL
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::AddL(RStringF aFullName,
+                                 RStringF aCompactName,
+                                 RPointerArray<CSIPHeaderBase>(*aDecode)(const TDesC8&),
+                                 CSIPHeaderBase*(*aInternalize)(RReadStream&))
+    {
+	TSIPHeaderLookupEntry entry (aFullName,aCompactName,aDecode,aInternalize);
+	User::LeaveIfError (iLookupTable.Append(entry));
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::FindIndex
+// -----------------------------------------------------------------------------
+//
+TInt CSIPHeaderLookupTable::FindIndex(RStringF aName) const
+	{
+	for (TInt index=0; index < iLookupTable.Count(); index++)
+		{
+		TSIPHeaderLookupEntry lookupEntry = iLookupTable[index];
+
+		if (aName == lookupEntry.Name() || 
+		    aName == lookupEntry.CompactName())
+			{
+			return index;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::ConvertToSIPURI
+// -----------------------------------------------------------------------------
+//
+TBool CSIPHeaderLookupTable::ConvertToSIPURI()
+    {
+    return iConvertToSIPURI;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPHeaderLookupTable::SetConvertToSIPURI
+// -----------------------------------------------------------------------------
+//
+void CSIPHeaderLookupTable::SetConvertToSIPURI(TBool aNewValue)
+    {
+    iConvertToSIPURI = aNewValue;
+    }