realtimenetprots/sipfw/SIP/Codec/src/CSIPContactHeader.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2004-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          : CSIPContactHeader.cpp
       
    15 // Part of       : SIP Codec
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "sipcontactheader.h"
       
    23 #include "sipaddress.h"
       
    24 #include "sipuri.h"
       
    25 #include "CSIPContactHeaderParams.h"
       
    26 #include "CSIPTokenizer.h"
       
    27 #include "sipcodecerr.h"
       
    28 #include "sipstrings.h"
       
    29 #include "sipstrconsts.h"
       
    30 #include "uricontainer.h"
       
    31 #include "_sipcodecdefs.h"
       
    32 
       
    33 _LIT8 (KStar, "*");
       
    34 
       
    35 // ----------------------------------------------------------------------------
       
    36 // CSIPContactHeader::DecodeL
       
    37 // ----------------------------------------------------------------------------
       
    38 //
       
    39 EXPORT_C RPointerArray<CSIPContactHeader> 
       
    40 CSIPContactHeader::DecodeL (const TDesC8& aValue)
       
    41 	{
       
    42 	RPointerArray<CSIPHeaderBase> baseheaders = BaseDecodeL(aValue);
       
    43 	CSIPHeaderBase::PushLC(&baseheaders);
       
    44 	RPointerArray<CSIPContactHeader> contactHeaders;
       
    45 	CleanupClosePushL(contactHeaders);
       
    46 	TInt count = baseheaders.Count();
       
    47 	for (TInt i=0; i<count; i++)
       
    48 		{
       
    49 		CSIPContactHeader* contact = 
       
    50 			static_cast<CSIPContactHeader*>(baseheaders[i]);
       
    51 		User::LeaveIfError(contactHeaders.Append(contact));
       
    52 		}
       
    53 	CleanupStack::Pop(2); // contactHeaders, baseheaders
       
    54 	baseheaders.Close();
       
    55 	return contactHeaders;
       
    56 	}
       
    57 
       
    58 // ----------------------------------------------------------------------------
       
    59 // CSIPContactHeader::NewL
       
    60 // ----------------------------------------------------------------------------
       
    61 //
       
    62 EXPORT_C CSIPContactHeader* CSIPContactHeader::NewL(CSIPAddress* aSIPAddress)
       
    63 	{
       
    64 	CSIPContactHeader* self = CSIPContactHeader::NewLC(aSIPAddress);
       
    65 	CleanupStack::Pop(self);
       
    66 	return self;
       
    67 	}
       
    68 
       
    69 // ----------------------------------------------------------------------------
       
    70 // CSIPContactHeader::NewLC
       
    71 // ----------------------------------------------------------------------------
       
    72 //
       
    73 EXPORT_C CSIPContactHeader* CSIPContactHeader::NewLC(CSIPAddress* aSIPAddress)
       
    74 	{
       
    75 	CSIPContactHeader* self = new(ELeave)CSIPContactHeader;
       
    76 	CleanupStack::PushL(self);
       
    77 	self->ConstructL(aSIPAddress);
       
    78 	return self;
       
    79 	}
       
    80 
       
    81 // ----------------------------------------------------------------------------
       
    82 // CSIPContactHeader::CSIPContactHeader
       
    83 // ----------------------------------------------------------------------------
       
    84 //
       
    85 CSIPContactHeader::CSIPContactHeader(TBool aIsStar)
       
    86  : CSIPParameterHeaderBase(';'),
       
    87    iIsStar (aIsStar)
       
    88 	{
       
    89 	}
       
    90 
       
    91 // ----------------------------------------------------------------------------
       
    92 // CSIPContactHeader::ConstructL
       
    93 // ----------------------------------------------------------------------------
       
    94 //
       
    95 void CSIPContactHeader::ConstructL ()
       
    96 	{
       
    97 	iParams = new(ELeave)CSIPContactHeaderParams;
       
    98 	}
       
    99 
       
   100 // ----------------------------------------------------------------------------
       
   101 // CSIPContactHeader::ConstructL
       
   102 // ----------------------------------------------------------------------------
       
   103 //
       
   104 void CSIPContactHeader::ConstructL (CSIPAddress* aSIPAddress)
       
   105 	{
       
   106 	ConstructL ();
       
   107 	SetSIPAddressL (aSIPAddress);
       
   108 	}
       
   109 
       
   110 // ----------------------------------------------------------------------------
       
   111 // CSIPContactHeader::ConstructL
       
   112 // ----------------------------------------------------------------------------
       
   113 //
       
   114 void CSIPContactHeader::ConstructL (const CSIPContactHeader& aContactHeader)
       
   115 	{
       
   116 	if (aContactHeader.Star())
       
   117 		{
       
   118 		iIsStar = ETrue;
       
   119 		ConstructL ();
       
   120 		}
       
   121 	else
       
   122 		{
       
   123 		iParams = CSIPContactHeaderParams::NewL (*(aContactHeader.iParams));
       
   124 		iSIPAddress = CSIPAddress::NewL (*(aContactHeader.iSIPAddress));
       
   125 		}	
       
   126 	}
       
   127 
       
   128 // ----------------------------------------------------------------------------
       
   129 // CSIPContactHeader::~CSIPContactHeader
       
   130 // ----------------------------------------------------------------------------
       
   131 //
       
   132 EXPORT_C CSIPContactHeader::~CSIPContactHeader()
       
   133 	{
       
   134 	delete iParams;
       
   135 	delete iSIPAddress;
       
   136 	}
       
   137 
       
   138 // ----------------------------------------------------------------------------
       
   139 // CSIPContactHeader::CloneL
       
   140 // From CSIPHeaderBase:
       
   141 // ----------------------------------------------------------------------------
       
   142 //
       
   143 EXPORT_C CSIPHeaderBase* CSIPContactHeader::CloneL () const
       
   144 	{
       
   145 	CSIPContactHeader* clone = new(ELeave)CSIPContactHeader;
       
   146 	CleanupStack::PushL(clone);
       
   147 	clone->ConstructL(*this);
       
   148 	CleanupStack::Pop(clone);
       
   149 	return clone;
       
   150 	}
       
   151 
       
   152 // ----------------------------------------------------------------------------
       
   153 // CSIPContactHeader::operator==
       
   154 // ----------------------------------------------------------------------------
       
   155 //
       
   156 EXPORT_C TBool 
       
   157 CSIPContactHeader::operator==(const CSIPContactHeader& aSIPContactHeader) const
       
   158 	{
       
   159 	if (aSIPContactHeader.Star() != iIsStar) 
       
   160         {
       
   161         return EFalse;
       
   162         }
       
   163 	if (iIsStar) 
       
   164         {
       
   165         return ETrue;
       
   166         }
       
   167 	if (!(*iSIPAddress == *(aSIPContactHeader.SIPAddress())))
       
   168         {
       
   169         return EFalse;
       
   170         }
       
   171 	return (*iParams == *(aSIPContactHeader.iParams));
       
   172 	}
       
   173 
       
   174 // ----------------------------------------------------------------------------
       
   175 // CSIPContactHeader::ExpiresParameter
       
   176 // ----------------------------------------------------------------------------
       
   177 //
       
   178 EXPORT_C TInt CSIPContactHeader::ExpiresParameter () const
       
   179 	{
       
   180 	if (iIsStar)
       
   181 		{
       
   182 		return 0;
       
   183 		}
       
   184 	RStringF expires = SIPStrings::StringF(SipStrConsts::EExpires);
       
   185 	return iParams->IntParamValue(expires);
       
   186 	}
       
   187 
       
   188 // ----------------------------------------------------------------------------
       
   189 // CSIPContactHeader::SetExpiresParameterL
       
   190 // ----------------------------------------------------------------------------
       
   191 //
       
   192 EXPORT_C void CSIPContactHeader::SetExpiresParameterL (TInt aExpiresParam)
       
   193 	{
       
   194 	__ASSERT_ALWAYS (!iIsStar, User::Leave(KErrSipCodecContactSetToStar));					
       
   195 	RStringF expires = SIPStrings::StringF(SipStrConsts::EExpires);
       
   196 	iParams->SetParamL(expires,aExpiresParam);
       
   197 	}
       
   198 
       
   199 // ----------------------------------------------------------------------------
       
   200 // CSIPContactHeader::QParameter
       
   201 // ----------------------------------------------------------------------------
       
   202 //
       
   203 EXPORT_C TReal CSIPContactHeader::QParameter () const
       
   204 	{
       
   205 	if (iIsStar) 
       
   206 		{
       
   207 		return 0;
       
   208 		}
       
   209 	return iParams->RealParamValue(SIPStrings::StringF(SipStrConsts::EQ));
       
   210 	}
       
   211 
       
   212 // ----------------------------------------------------------------------------
       
   213 // CSIPContactHeader::SetQParameterL
       
   214 // ----------------------------------------------------------------------------
       
   215 //
       
   216 EXPORT_C void CSIPContactHeader::SetQParameterL (TReal aQValue)
       
   217 	{
       
   218 	__ASSERT_ALWAYS (!iIsStar, 
       
   219 				User::Leave(KErrSipCodecContactSetToStar));
       
   220 	iParams->SetParamL(SIPStrings::StringF(SipStrConsts::EQ),aQValue);
       
   221 	}
       
   222 
       
   223 // ----------------------------------------------------------------------------
       
   224 // CSIPContactHeader::Star
       
   225 // ----------------------------------------------------------------------------
       
   226 //
       
   227 EXPORT_C TBool CSIPContactHeader::Star () const
       
   228 	{
       
   229 	return iIsStar;
       
   230 	}
       
   231 
       
   232 // ----------------------------------------------------------------------------
       
   233 // CSIPContactHeader::SIPAddress
       
   234 // ----------------------------------------------------------------------------
       
   235 //
       
   236 EXPORT_C const CSIPAddress* CSIPContactHeader::SIPAddress() const
       
   237 	{
       
   238 	return iSIPAddress;
       
   239 	}
       
   240 
       
   241 // ----------------------------------------------------------------------------
       
   242 // CSIPContactHeader::SIPAddress
       
   243 // ----------------------------------------------------------------------------
       
   244 //
       
   245 EXPORT_C CSIPAddress* CSIPContactHeader::SIPAddress()
       
   246 	{
       
   247 	return iSIPAddress;
       
   248 	}
       
   249 
       
   250 // ----------------------------------------------------------------------------
       
   251 // CSIPContactHeader::SetSIPAddressL
       
   252 // ----------------------------------------------------------------------------
       
   253 //
       
   254 EXPORT_C void CSIPContactHeader::SetSIPAddressL (CSIPAddress* aSIPAddress)
       
   255 	{
       
   256 	__ASSERT_ALWAYS (!iIsStar, 
       
   257 				User::Leave(KErrSipCodecContactSetToStar));
       
   258 	__ASSERT_ALWAYS (aSIPAddress != 0, 
       
   259 				User::Leave(KErrSipCodecContactAddress));
       
   260 
       
   261 	delete iSIPAddress;
       
   262 	iSIPAddress = aSIPAddress;
       
   263 
       
   264     if(iSIPAddress->URI().IsSIPURI())
       
   265         {
       
   266     	CSIPURI& sipURI = *(iSIPAddress->URI().SIPURI());
       
   267     	sipURI.DeleteParam(SIPStrings::StringF(SipStrConsts::EMethod));
       
   268         }
       
   269 	}
       
   270 
       
   271 // ----------------------------------------------------------------------------
       
   272 // CSIPContactHeader::MoreThanOneAllowed
       
   273 // From CSIPHeaderBase:
       
   274 // ----------------------------------------------------------------------------
       
   275 //
       
   276 TBool CSIPContactHeader::MoreThanOneAllowed () const
       
   277 	{
       
   278 	return ETrue;
       
   279 	}
       
   280 
       
   281 // ----------------------------------------------------------------------------
       
   282 // CSIPContactHeader::Name
       
   283 // From CSIPHeaderBase:
       
   284 // ----------------------------------------------------------------------------
       
   285 //
       
   286 EXPORT_C RStringF CSIPContactHeader::Name() const
       
   287 	{
       
   288 	return SIPStrings::StringF(SipStrConsts::EContactHeader);
       
   289 	}
       
   290 
       
   291 // ----------------------------------------------------------------------------
       
   292 // CSIPContactHeader::HasCompactName
       
   293 // From CSIPHeaderBase:
       
   294 // ----------------------------------------------------------------------------
       
   295 //
       
   296 TBool CSIPContactHeader::HasCompactName () const
       
   297 	{
       
   298 	return ETrue;
       
   299 	}
       
   300 
       
   301 // ----------------------------------------------------------------------------
       
   302 // CSIPContactHeader::CompactName
       
   303 // From CSIPHeaderBase:
       
   304 // ----------------------------------------------------------------------------
       
   305 //
       
   306 RStringF CSIPContactHeader::CompactName () const
       
   307 	{
       
   308 	return SIPStrings::StringF(SipStrConsts::EContactHeaderCompact);
       
   309 	}
       
   310 
       
   311 // ----------------------------------------------------------------------------
       
   312 // CSIPContactHeader::InternalizeValueL
       
   313 // ----------------------------------------------------------------------------
       
   314 //
       
   315 EXPORT_C CSIPHeaderBase* CSIPContactHeader::InternalizeValueL(
       
   316     RReadStream& aReadStream)
       
   317 	{
       
   318 	CSIPContactHeader* self = new(ELeave)CSIPContactHeader(EFalse);
       
   319 	CleanupStack::PushL(self);
       
   320 	self->DoInternalizeValueL(aReadStream);
       
   321 	CleanupStack::Pop(self);
       
   322 	return self;
       
   323 	}
       
   324 
       
   325 // ----------------------------------------------------------------------------
       
   326 // CSIPContactHeader::ExternalizeValueL
       
   327 // From CSIPHeaderBase:
       
   328 // ----------------------------------------------------------------------------
       
   329 //
       
   330 void CSIPContactHeader::ExternalizeValueL (RWriteStream& aWriteStream) const
       
   331 	{
       
   332 	if (iIsStar)
       
   333 		{
       
   334 		aWriteStream.WriteUint8L(1);
       
   335 		}
       
   336 	else
       
   337 		{
       
   338 		aWriteStream.WriteUint8L(0);
       
   339 		iSIPAddress->ExternalizeL(aWriteStream);
       
   340 		iParams->ExternalizeL (aWriteStream);
       
   341 		}
       
   342 	}
       
   343 
       
   344 // ----------------------------------------------------------------------------
       
   345 // CSIPContactHeader::DoInternalizeValueL
       
   346 // ----------------------------------------------------------------------------
       
   347 //
       
   348 void CSIPContactHeader::DoInternalizeValueL (RReadStream& aReadStream)
       
   349 	{
       
   350 	if (aReadStream.ReadUint8L() == 1) // is STAR
       
   351 		{
       
   352 		iIsStar = ETrue;
       
   353 		iParams = new(ELeave)CSIPContactHeaderParams;
       
   354 		}
       
   355 	else
       
   356 		{
       
   357 		iIsStar = EFalse;
       
   358 	    CSIPAddress* tmpAddr = CSIPAddress::InternalizeL (aReadStream);
       
   359 	    CleanupStack::PushL(tmpAddr);
       
   360 	    SetSIPAddressL(tmpAddr);
       
   361 	    CleanupStack::Pop(tmpAddr);
       
   362 		iParams = CSIPContactHeaderParams::InternalizeL (aReadStream);
       
   363 		}
       
   364 	}
       
   365 
       
   366 // ----------------------------------------------------------------------------
       
   367 // CSIPContactHeader::PreferredPlaceInMessage
       
   368 // From CSIPHeaderBase:
       
   369 // ----------------------------------------------------------------------------
       
   370 //
       
   371 CSIPHeaderBase::TPreferredPlace
       
   372 CSIPContactHeader::PreferredPlaceInMessage () const
       
   373 	{
       
   374 	return CSIPHeaderBase::EMiddleTop;
       
   375 	}
       
   376 
       
   377 // ----------------------------------------------------------------------------
       
   378 // CSIPContactHeader::BaseDecodeL
       
   379 // ----------------------------------------------------------------------------
       
   380 //
       
   381 RPointerArray<CSIPHeaderBase> 
       
   382 CSIPContactHeader::BaseDecodeL (const TDesC8& aValue)
       
   383 	{
       
   384 	__ASSERT_ALWAYS (aValue.Length() > 0,
       
   385 		User::Leave(KErrSipCodecContactHeader));
       
   386 
       
   387 	RPointerArray<CSIPHeaderBase> headers;
       
   388     CSIPHeaderBase::PushLC(&headers);
       
   389 	CSIPTokenizer* tokenizer = CSIPTokenizer::NewLC(aValue, ',', ETrue);
       
   390 	TBool star=EFalse;
       
   391 	for (TInt i=0; i < tokenizer->Tokens().Count(); i++)
       
   392 		{
       
   393 		CSIPContactHeader* contactHeader = new(ELeave)CSIPContactHeader;
       
   394 		CleanupStack::PushL(contactHeader);
       
   395 		contactHeader->ConstructL();
       
   396 		contactHeader->ParseL (tokenizer->Tokens()[i], ETrue, ETrue);
       
   397 		if (!star) star = contactHeader->iIsStar;
       
   398 		if (star && i > 0) 
       
   399 			{
       
   400 			User::Leave(KErrSipCodecContactSetToStar); 
       
   401 			}
       
   402 		headers.AppendL(contactHeader);
       
   403 		CleanupStack::Pop(contactHeader);
       
   404 		}
       
   405 	CleanupStack::PopAndDestroy(tokenizer);
       
   406 	CleanupStack::Pop(); // headers 
       
   407 	return headers;
       
   408 	}
       
   409 
       
   410 // ----------------------------------------------------------------------------
       
   411 // CSIPContactHeader::ParamInsertionAllowed
       
   412 // From CSIPParameterHeaderBase:
       
   413 // ----------------------------------------------------------------------------
       
   414 //
       
   415 TBool CSIPContactHeader::ParamInsertionAllowed () const
       
   416     {
       
   417     return !(iIsStar);
       
   418     }  
       
   419 
       
   420 // ----------------------------------------------------------------------------
       
   421 // CSIPContactHeader::ToTextMandatoryPartLC
       
   422 // From CSIPParameterHeaderBase:
       
   423 // ----------------------------------------------------------------------------
       
   424 //
       
   425 HBufC8* CSIPContactHeader::ToTextMandatoryPartLC () const
       
   426     {
       
   427 	if (iIsStar)
       
   428         {
       
   429         return KStar().AllocLC();
       
   430         }
       
   431     return iSIPAddress->ToTextLC(ETrue);
       
   432     }
       
   433 
       
   434 // ----------------------------------------------------------------------------
       
   435 // CSIPContactHeader::ParseMandatoryPartL
       
   436 // From CSIPParameterHeaderBase:
       
   437 // ----------------------------------------------------------------------------
       
   438 //
       
   439 void CSIPContactHeader::ParseMandatoryPartL (const TDesC8& aMandatoryPart)
       
   440     {
       
   441 	TLex8 lex(aMandatoryPart);
       
   442 	lex.SkipSpace();
       
   443 	if (lex.Peek() == '*')
       
   444 		{
       
   445         lex.Inc();
       
   446         lex.SkipSpace();
       
   447         if (lex.Remainder().Length() > 0)
       
   448             {
       
   449             User::Leave(KErrSipCodecContactHeader);
       
   450             }
       
   451 		iIsStar = ETrue;
       
   452 		}
       
   453     else
       
   454         {
       
   455 	    CSIPAddress* sipAddress = CSIPAddress::DecodeL(lex.Remainder());
       
   456 	    CleanupStack::PushL(sipAddress);
       
   457 	    SetSIPAddressL(sipAddress);
       
   458 	    CleanupStack::Pop(sipAddress);
       
   459         }
       
   460     }
       
   461     
       
   462 // ----------------------------------------------------------------------------
       
   463 // CSIPContactHeader::Params
       
   464 // From CSIPParameterHeaderBase:
       
   465 // ----------------------------------------------------------------------------
       
   466 //
       
   467 const CSIPParamContainerBase& CSIPContactHeader::Params () const
       
   468     {
       
   469     return *iParams; 
       
   470     }
       
   471 
       
   472 // ----------------------------------------------------------------------------
       
   473 // CSIPContactHeader::Params
       
   474 // From CSIPParameterHeaderBase:
       
   475 // ----------------------------------------------------------------------------
       
   476 //
       
   477 CSIPParamContainerBase& CSIPContactHeader::Params ()
       
   478     {
       
   479     return *iParams; 
       
   480     }
       
   481 
       
   482 // ----------------------------------------------------------------------------
       
   483 // CSIPContactHeader::RemoveExpiresParam
       
   484 // ----------------------------------------------------------------------------
       
   485 //
       
   486 EXPORT_C void CSIPContactHeader::RemoveExpiresParam()
       
   487 	{
       
   488 	RStringF expires = SIPStrings::StringF(SipStrConsts::EExpires);
       
   489 	iParams->DeleteParam(expires);
       
   490 	}