realtimenetprots/sipfw/SIP/Codec/src/CSIPURIParams.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPURIParams.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,272 @@
+// 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          : CSIPURIParams.cpp
+// Part of       : SIP Codec
+// Version       : SIP/4.0 
+//
+
+
+
+
+#include "CSIPURIParams.h"
+#include "CSIPTokenizer.h"
+#include "sipcodecerr.h"
+#include "TSIPChar.h"
+#include "SIPSyntaxCheck.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::DecodeL
+// -----------------------------------------------------------------------------
+//
+CSIPURIParams* CSIPURIParams::DecodeL(
+    const TDesC8& aValue,
+    TBool aSIPSURI)
+	{
+	__ASSERT_ALWAYS (aValue.Length() > 0, User::Leave(KErrSipCodecURIParams));
+
+	CSIPURIParams* params = new(ELeave)CSIPURIParams(aSIPSURI);
+	CleanupStack::PushL (params);
+	params->ParseL(aValue);
+	CleanupStack::Pop(params);
+	return params;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPURIParams* CSIPURIParams::NewL(
+    const CSIPURIParams& aParams,
+    TBool aSIPSURI)
+	{
+	CSIPURIParams* self = CSIPURIParams::NewLC(aParams,aSIPSURI);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPURIParams* CSIPURIParams::NewLC(
+    const CSIPURIParams& aParams,
+    TBool aSIPSURI)
+	{
+	CSIPURIParams* self = new(ELeave)CSIPURIParams(aSIPSURI);
+	CleanupStack::PushL(self);
+	self->ConstructL (aParams);
+	return self;
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::CSIPURIParams
+// -----------------------------------------------------------------------------
+//
+CSIPURIParams::CSIPURIParams(TBool aSIPSURI)
+ : CSIPParamContainerBase(';'),
+   iSIPSURI(aSIPSURI)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::~CSIPURIParams
+// -----------------------------------------------------------------------------
+//
+CSIPURIParams::~CSIPURIParams()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::operator==
+// -----------------------------------------------------------------------------
+//
+TBool CSIPURIParams::operator==(const CSIPURIParams& aParams) const
+	{
+	// If a SIPURI has a "user", "ttl", "method" or "maddr" parameter 
+	// the other one has to have it too and their values must match. 
+	// Any other parameters must match only if they are present in both.
+	for (TInt i=0; i < iParams.Count(); i++)
+		{
+		TInt index = aParams.FindParamIndex(iParams[i]->Name());
+		if (index >= 0)
+			{
+			if (iParams[i]->HasValue() &&
+			    !(*(aParams.iParams[index]) == *(iParams[i])))
+				{
+				return EFalse;
+				}
+			}
+		else
+			{
+			RStringF name = iParams[i]->Name();
+			if (name == SIPStrings::StringF(SipStrConsts::EUser) ||
+			    name == SIPStrings::StringF(SipStrConsts::ETtl) ||
+			    name == SIPStrings::StringF(SipStrConsts::EMethod) ||
+			    name == SIPStrings::StringF(SipStrConsts::EMaddr))
+				{
+				return EFalse;
+				}
+			}
+		}
+	for (TInt j=0; j < aParams.iParams.Count(); j++)
+		{
+		TInt index = FindParamIndex(aParams.iParams[j]->Name());
+		if (index >= 0)
+			{
+			if (aParams.iParams[j]->HasValue() &&
+			    !(*(iParams[index]) == *(aParams.iParams[j])))
+				{
+				return EFalse;
+				}
+			}
+		else
+			{
+			RStringF name = aParams.iParams[j]->Name();
+			if (name == SIPStrings::StringF(SipStrConsts::EUser) ||
+			    name == SIPStrings::StringF(SipStrConsts::ETtl) ||
+			    name == SIPStrings::StringF(SipStrConsts::EMethod) ||
+			    name == SIPStrings::StringF(SipStrConsts::EMaddr))
+				{
+				return EFalse;
+				}
+			}
+		}
+	return ETrue;
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPURIParams::CheckAndUpdateParamL
+// ----------------------------------------------------------------------------
+//	
+void CSIPURIParams::CheckAndUpdateParamL(RStringF aName,
+                                         TBool aHasValue,
+                                         TPtrC8& aValue) const
+    {
+	// transport
+	if (aName == SIPStrings::StringF(SipStrConsts::ETransport))
+		{
+		if (!SIPSyntaxCheck::Token(aValue))
+			{
+			User::Leave(KErrSipCodecURIParams);
+			}
+	    if (iSIPSURI && 
+	        aValue.CompareF(SIPStrings::StringF(SipStrConsts::EUdp).DesC())==0)
+	        {
+	        User::Leave(KErrSipCodecURIParams);
+	        }
+		return;
+		}
+	// user
+	if (aName == SIPStrings::StringF(SipStrConsts::EUser))
+		{
+		if (!SIPSyntaxCheck::Token(aValue))
+			{
+			User::Leave(KErrSipCodecURIParams);
+			}
+		return;
+		}
+	// method
+	if (aName == SIPStrings::StringF(SipStrConsts::EMethod))
+		{
+		if (!SIPSyntaxCheck::Token(aValue))
+			{
+			User::Leave(KErrSipCodecURIParams);
+			}
+		return;
+		}
+	// ttl
+	if (aName == SIPStrings::StringF(SipStrConsts::ETtl))
+		{
+		if (!SIPSyntaxCheck::TtlValue(aValue))
+			{
+			User::Leave(KErrSipCodecURIParams);
+			}
+		return;
+		}
+	// maddr
+	if (aName == SIPStrings::StringF(SipStrConsts::EMaddr))
+		{
+		if (!SIPSyntaxCheck::Host(aValue))
+			{
+			User::Leave(KErrSipCodecURIParams);
+			}
+		return;
+		}
+	// Relaxed cheking for lr-parameter. If it has a value, it is ignored.
+	// other URI-parameter
+	if (!CheckOtherParam(aName,aHasValue,aValue)) 
+        {
+        User::Leave(KErrSipCodecURIParams);
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::CheckOtherParam
+// -----------------------------------------------------------------------------
+//
+TBool CSIPURIParams::CheckOtherParam (RStringF aName,
+                                      TBool aHasValue,
+	                                  const TDesC8& aValue) const
+	{
+	if (!CheckSIPURIParamToken(aName.DesC())) 
+		{
+		return EFalse;
+		}
+	if (aHasValue)
+		{
+		return CheckSIPURIParamToken(aValue);
+		}
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPURIParams::CheckSIPURIParamToken
+// -----------------------------------------------------------------------------
+//
+TBool CSIPURIParams::CheckSIPURIParamToken (const TDesC8& aParamToken) const
+	{
+	if (aParamToken.Length() == 0) 
+        {
+        return EFalse;
+        }
+
+	TLex8 lex(aParamToken);
+	TSIPChar sipChr = lex.Get();
+	while (sipChr)
+		{
+		// unreserved / escaped / param-unreserved
+		if (!(sipChr.IsUnreserved() || sipChr == '%' ||
+			  sipChr == '[' || sipChr == ']' || sipChr == '/' || 
+			  sipChr == ':' || sipChr == '&' || sipChr == '+' || 
+			  sipChr == '$'))
+			{			
+			return EFalse;
+			}
+		if (sipChr == '%') // escaped: "%" HEXDIG HEXDIG
+			{
+			if (!lex.Get().IsHexDigit()) 
+                {
+                return EFalse;
+                }
+            if (!lex.Get().IsHexDigit()) 
+                {
+                return EFalse;
+                }
+			}
+		sipChr = lex.Get();
+		}
+	return ETrue;
+	}