realtimenetprots/sipfw/SIP/Codec/src/CSIPURIParams.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : CSIPURIParams.cpp
       
    15 // Part of       : SIP Codec
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "CSIPURIParams.h"
       
    23 #include "CSIPTokenizer.h"
       
    24 #include "sipcodecerr.h"
       
    25 #include "TSIPChar.h"
       
    26 #include "SIPSyntaxCheck.h"
       
    27 #include "sipstrings.h"
       
    28 #include "sipstrconsts.h"
       
    29 
       
    30 // -----------------------------------------------------------------------------
       
    31 // CSIPURIParams::DecodeL
       
    32 // -----------------------------------------------------------------------------
       
    33 //
       
    34 CSIPURIParams* CSIPURIParams::DecodeL(
       
    35     const TDesC8& aValue,
       
    36     TBool aSIPSURI)
       
    37 	{
       
    38 	__ASSERT_ALWAYS (aValue.Length() > 0, User::Leave(KErrSipCodecURIParams));
       
    39 
       
    40 	CSIPURIParams* params = new(ELeave)CSIPURIParams(aSIPSURI);
       
    41 	CleanupStack::PushL (params);
       
    42 	params->ParseL(aValue);
       
    43 	CleanupStack::Pop(params);
       
    44 	return params;
       
    45 	}
       
    46 
       
    47 // -----------------------------------------------------------------------------
       
    48 // CSIPURIParams::NewL
       
    49 // -----------------------------------------------------------------------------
       
    50 //
       
    51 CSIPURIParams* CSIPURIParams::NewL(
       
    52     const CSIPURIParams& aParams,
       
    53     TBool aSIPSURI)
       
    54 	{
       
    55 	CSIPURIParams* self = CSIPURIParams::NewLC(aParams,aSIPSURI);
       
    56 	CleanupStack::Pop(self);
       
    57 	return self;
       
    58 	}
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CSIPURIParams::NewLC
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 CSIPURIParams* CSIPURIParams::NewLC(
       
    65     const CSIPURIParams& aParams,
       
    66     TBool aSIPSURI)
       
    67 	{
       
    68 	CSIPURIParams* self = new(ELeave)CSIPURIParams(aSIPSURI);
       
    69 	CleanupStack::PushL(self);
       
    70 	self->ConstructL (aParams);
       
    71 	return self;
       
    72 	}	
       
    73 
       
    74 // -----------------------------------------------------------------------------
       
    75 // CSIPURIParams::CSIPURIParams
       
    76 // -----------------------------------------------------------------------------
       
    77 //
       
    78 CSIPURIParams::CSIPURIParams(TBool aSIPSURI)
       
    79  : CSIPParamContainerBase(';'),
       
    80    iSIPSURI(aSIPSURI)
       
    81 	{
       
    82 	}
       
    83 
       
    84 // -----------------------------------------------------------------------------
       
    85 // CSIPURIParams::~CSIPURIParams
       
    86 // -----------------------------------------------------------------------------
       
    87 //
       
    88 CSIPURIParams::~CSIPURIParams()
       
    89 	{
       
    90 	}
       
    91 
       
    92 // -----------------------------------------------------------------------------
       
    93 // CSIPURIParams::operator==
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 TBool CSIPURIParams::operator==(const CSIPURIParams& aParams) const
       
    97 	{
       
    98 	// If a SIPURI has a "user", "ttl", "method" or "maddr" parameter 
       
    99 	// the other one has to have it too and their values must match. 
       
   100 	// Any other parameters must match only if they are present in both.
       
   101 	for (TInt i=0; i < iParams.Count(); i++)
       
   102 		{
       
   103 		TInt index = aParams.FindParamIndex(iParams[i]->Name());
       
   104 		if (index >= 0)
       
   105 			{
       
   106 			if (iParams[i]->HasValue() &&
       
   107 			    !(*(aParams.iParams[index]) == *(iParams[i])))
       
   108 				{
       
   109 				return EFalse;
       
   110 				}
       
   111 			}
       
   112 		else
       
   113 			{
       
   114 			RStringF name = iParams[i]->Name();
       
   115 			if (name == SIPStrings::StringF(SipStrConsts::EUser) ||
       
   116 			    name == SIPStrings::StringF(SipStrConsts::ETtl) ||
       
   117 			    name == SIPStrings::StringF(SipStrConsts::EMethod) ||
       
   118 			    name == SIPStrings::StringF(SipStrConsts::EMaddr))
       
   119 				{
       
   120 				return EFalse;
       
   121 				}
       
   122 			}
       
   123 		}
       
   124 	for (TInt j=0; j < aParams.iParams.Count(); j++)
       
   125 		{
       
   126 		TInt index = FindParamIndex(aParams.iParams[j]->Name());
       
   127 		if (index >= 0)
       
   128 			{
       
   129 			if (aParams.iParams[j]->HasValue() &&
       
   130 			    !(*(iParams[index]) == *(aParams.iParams[j])))
       
   131 				{
       
   132 				return EFalse;
       
   133 				}
       
   134 			}
       
   135 		else
       
   136 			{
       
   137 			RStringF name = aParams.iParams[j]->Name();
       
   138 			if (name == SIPStrings::StringF(SipStrConsts::EUser) ||
       
   139 			    name == SIPStrings::StringF(SipStrConsts::ETtl) ||
       
   140 			    name == SIPStrings::StringF(SipStrConsts::EMethod) ||
       
   141 			    name == SIPStrings::StringF(SipStrConsts::EMaddr))
       
   142 				{
       
   143 				return EFalse;
       
   144 				}
       
   145 			}
       
   146 		}
       
   147 	return ETrue;
       
   148 	}
       
   149 	
       
   150 // ----------------------------------------------------------------------------
       
   151 // CSIPURIParams::CheckAndUpdateParamL
       
   152 // ----------------------------------------------------------------------------
       
   153 //	
       
   154 void CSIPURIParams::CheckAndUpdateParamL(RStringF aName,
       
   155                                          TBool aHasValue,
       
   156                                          TPtrC8& aValue) const
       
   157     {
       
   158 	// transport
       
   159 	if (aName == SIPStrings::StringF(SipStrConsts::ETransport))
       
   160 		{
       
   161 		if (!SIPSyntaxCheck::Token(aValue))
       
   162 			{
       
   163 			User::Leave(KErrSipCodecURIParams);
       
   164 			}
       
   165 	    if (iSIPSURI && 
       
   166 	        aValue.CompareF(SIPStrings::StringF(SipStrConsts::EUdp).DesC())==0)
       
   167 	        {
       
   168 	        User::Leave(KErrSipCodecURIParams);
       
   169 	        }
       
   170 		return;
       
   171 		}
       
   172 	// user
       
   173 	if (aName == SIPStrings::StringF(SipStrConsts::EUser))
       
   174 		{
       
   175 		if (!SIPSyntaxCheck::Token(aValue))
       
   176 			{
       
   177 			User::Leave(KErrSipCodecURIParams);
       
   178 			}
       
   179 		return;
       
   180 		}
       
   181 	// method
       
   182 	if (aName == SIPStrings::StringF(SipStrConsts::EMethod))
       
   183 		{
       
   184 		if (!SIPSyntaxCheck::Token(aValue))
       
   185 			{
       
   186 			User::Leave(KErrSipCodecURIParams);
       
   187 			}
       
   188 		return;
       
   189 		}
       
   190 	// ttl
       
   191 	if (aName == SIPStrings::StringF(SipStrConsts::ETtl))
       
   192 		{
       
   193 		if (!SIPSyntaxCheck::TtlValue(aValue))
       
   194 			{
       
   195 			User::Leave(KErrSipCodecURIParams);
       
   196 			}
       
   197 		return;
       
   198 		}
       
   199 	// maddr
       
   200 	if (aName == SIPStrings::StringF(SipStrConsts::EMaddr))
       
   201 		{
       
   202 		if (!SIPSyntaxCheck::Host(aValue))
       
   203 			{
       
   204 			User::Leave(KErrSipCodecURIParams);
       
   205 			}
       
   206 		return;
       
   207 		}
       
   208 	// Relaxed cheking for lr-parameter. If it has a value, it is ignored.
       
   209 	// other URI-parameter
       
   210 	if (!CheckOtherParam(aName,aHasValue,aValue)) 
       
   211         {
       
   212         User::Leave(KErrSipCodecURIParams);
       
   213         }
       
   214 	}
       
   215 
       
   216 // -----------------------------------------------------------------------------
       
   217 // CSIPURIParams::CheckOtherParam
       
   218 // -----------------------------------------------------------------------------
       
   219 //
       
   220 TBool CSIPURIParams::CheckOtherParam (RStringF aName,
       
   221                                       TBool aHasValue,
       
   222 	                                  const TDesC8& aValue) const
       
   223 	{
       
   224 	if (!CheckSIPURIParamToken(aName.DesC())) 
       
   225 		{
       
   226 		return EFalse;
       
   227 		}
       
   228 	if (aHasValue)
       
   229 		{
       
   230 		return CheckSIPURIParamToken(aValue);
       
   231 		}
       
   232 	return ETrue;
       
   233 	}
       
   234 
       
   235 // -----------------------------------------------------------------------------
       
   236 // CSIPURIParams::CheckSIPURIParamToken
       
   237 // -----------------------------------------------------------------------------
       
   238 //
       
   239 TBool CSIPURIParams::CheckSIPURIParamToken (const TDesC8& aParamToken) const
       
   240 	{
       
   241 	if (aParamToken.Length() == 0) 
       
   242         {
       
   243         return EFalse;
       
   244         }
       
   245 
       
   246 	TLex8 lex(aParamToken);
       
   247 	TSIPChar sipChr = lex.Get();
       
   248 	while (sipChr)
       
   249 		{
       
   250 		// unreserved / escaped / param-unreserved
       
   251 		if (!(sipChr.IsUnreserved() || sipChr == '%' ||
       
   252 			  sipChr == '[' || sipChr == ']' || sipChr == '/' || 
       
   253 			  sipChr == ':' || sipChr == '&' || sipChr == '+' || 
       
   254 			  sipChr == '$'))
       
   255 			{			
       
   256 			return EFalse;
       
   257 			}
       
   258 		if (sipChr == '%') // escaped: "%" HEXDIG HEXDIG
       
   259 			{
       
   260 			if (!lex.Get().IsHexDigit()) 
       
   261                 {
       
   262                 return EFalse;
       
   263                 }
       
   264             if (!lex.Get().IsHexDigit()) 
       
   265                 {
       
   266                 return EFalse;
       
   267                 }
       
   268 			}
       
   269 		sipChr = lex.Get();
       
   270 		}
       
   271 	return ETrue;
       
   272 	}