realtimenetprots/sipfw/SIP/Codec/src/CSIPEventHeader.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          : CSIPEventHeader.cpp
       
    15 // Part of       : SIP Codec
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "sipeventheader.h"
       
    22 #include "CSIPEventHeaderParams.h"
       
    23 #include "CSIPTokenizer.h"
       
    24 #include "sipcodecerr.h"
       
    25 #include "SIPSyntaxCheck.h"
       
    26 #include "sipstrings.h"
       
    27 #include "sipstrconsts.h"
       
    28 #include "sipcodecutils.h"
       
    29 #include "_sipcodecdefs.h"
       
    30 
       
    31 _LIT8(KDot, ".");
       
    32 
       
    33 
       
    34 // ----------------------------------------------------------------------------
       
    35 // CSIPEventHeader::DecodeL
       
    36 // ----------------------------------------------------------------------------
       
    37 //
       
    38 EXPORT_C CSIPEventHeader* CSIPEventHeader::DecodeL (const TDesC8& aValue)
       
    39 	{
       
    40 	CSIPEventHeader* eventHeader = new(ELeave) CSIPEventHeader;
       
    41     CleanupStack::PushL(eventHeader);
       
    42     eventHeader->ConstructL();
       
    43 	eventHeader->ParseL(aValue);
       
    44 	CleanupStack::Pop(eventHeader);
       
    45 	return eventHeader;
       
    46 	}
       
    47 
       
    48 // ----------------------------------------------------------------------------
       
    49 // CSIPEventHeader::NewL
       
    50 // ----------------------------------------------------------------------------
       
    51 //
       
    52 EXPORT_C CSIPEventHeader* CSIPEventHeader::NewL(const TDesC8& aEventPackage)
       
    53 	{
       
    54 	CSIPEventHeader* self = CSIPEventHeader::NewLC(aEventPackage);
       
    55 	CleanupStack::Pop(self);
       
    56 	return self;
       
    57 	}
       
    58 
       
    59 // ----------------------------------------------------------------------------
       
    60 // CSIPEventHeader::NewLC
       
    61 // ----------------------------------------------------------------------------
       
    62 //
       
    63 EXPORT_C CSIPEventHeader* CSIPEventHeader::NewLC(const TDesC8& aEventPackage)
       
    64 	{
       
    65 	CSIPEventHeader* self=new(ELeave) CSIPEventHeader();
       
    66 	CleanupStack::PushL(self);
       
    67 	self->ConstructL(aEventPackage);
       
    68 	return self;
       
    69 	}
       
    70 
       
    71 // ----------------------------------------------------------------------------
       
    72 // CSIPEventHeader::CSIPEventHeader
       
    73 // ----------------------------------------------------------------------------
       
    74 //
       
    75 CSIPEventHeader::CSIPEventHeader()
       
    76 :   CSIPParameterHeaderBase( ';' )
       
    77 	{
       
    78 	}
       
    79 
       
    80 // ----------------------------------------------------------------------------
       
    81 // CSIPEventHeader::ConstructL
       
    82 // ----------------------------------------------------------------------------
       
    83 //
       
    84 void CSIPEventHeader::ConstructL()
       
    85 	{
       
    86 	iParams = new(ELeave)CSIPEventHeaderParams;
       
    87 	iEventTemplates = new(ELeave) CDesC8ArraySeg(1);
       
    88 	}
       
    89 
       
    90 // ----------------------------------------------------------------------------
       
    91 // CSIPEventHeader::ConstructL
       
    92 // ----------------------------------------------------------------------------
       
    93 //
       
    94 void CSIPEventHeader::ConstructL (const TDesC8& aEventPackage)
       
    95 	{
       
    96 	ConstructL ();
       
    97 	SetEventPackageL (aEventPackage);
       
    98 	}
       
    99 
       
   100 // ----------------------------------------------------------------------------
       
   101 // CSIPEventHeader::ConstructL
       
   102 // ----------------------------------------------------------------------------
       
   103 //
       
   104 void CSIPEventHeader::ConstructL (const CSIPEventHeader& aSIPEventHeader)
       
   105 	{
       
   106 	iParams = CSIPEventHeaderParams::NewL (*(aSIPEventHeader.iParams));
       
   107 	SetEventTemplatesL(*aSIPEventHeader.iEventTemplates);
       
   108 	SetEventPackageL(aSIPEventHeader.EventPackage());
       
   109 	}
       
   110 
       
   111 // ----------------------------------------------------------------------------
       
   112 // CSIPEventHeader::~CSIPEventHeader
       
   113 // ----------------------------------------------------------------------------
       
   114 //
       
   115 EXPORT_C CSIPEventHeader::~CSIPEventHeader()
       
   116 	{
       
   117 	delete iParams;
       
   118 	delete iEventPackage;
       
   119 	delete iEventTemplates;
       
   120 	}
       
   121 
       
   122 // ----------------------------------------------------------------------------
       
   123 // CSIPEventHeader::CloneL
       
   124 // From CSIPHeaderBase:
       
   125 // ----------------------------------------------------------------------------
       
   126 //
       
   127 EXPORT_C CSIPHeaderBase* CSIPEventHeader::CloneL () const
       
   128 	{
       
   129 	CSIPEventHeader* clone = new(ELeave)CSIPEventHeader;
       
   130 	CleanupStack::PushL(clone);
       
   131 	clone->ConstructL(*this);
       
   132 	CleanupStack::Pop(clone);
       
   133 	return clone;
       
   134 	}
       
   135 
       
   136 // ----------------------------------------------------------------------------
       
   137 // CSIPEventHeader::Name
       
   138 // From CSIPHeaderBase:
       
   139 // ----------------------------------------------------------------------------
       
   140 //
       
   141 EXPORT_C RStringF CSIPEventHeader::Name() const
       
   142     {
       
   143     return SIPStrings::StringF(SipStrConsts::EEventHeader);
       
   144     }
       
   145 
       
   146 // ----------------------------------------------------------------------------
       
   147 // CSIPEventHeader::HasCompactName
       
   148 // From CSIPHeaderBase:
       
   149 // ----------------------------------------------------------------------------
       
   150 //
       
   151 TBool CSIPEventHeader::HasCompactName () const
       
   152 	{
       
   153 	return ETrue;
       
   154 	}
       
   155 
       
   156 // ----------------------------------------------------------------------------
       
   157 // CSIPEventHeader::CompactName
       
   158 // From CSIPHeaderBase:
       
   159 // ----------------------------------------------------------------------------
       
   160 //
       
   161 RStringF CSIPEventHeader::CompactName () const
       
   162 	{
       
   163     return SIPStrings::StringF(SipStrConsts::EEventHeaderCompact);
       
   164 	}
       
   165 
       
   166 // ----------------------------------------------------------------------------
       
   167 // CSIPEventHeader::operator==
       
   168 // ----------------------------------------------------------------------------
       
   169 //
       
   170 EXPORT_C TBool 
       
   171 CSIPEventHeader::operator==(const CSIPEventHeader& aSIPEventHeader) const
       
   172 	{
       
   173 	if(iEventPackage->Compare(*(aSIPEventHeader.iEventPackage)) != 0) 
       
   174 		{
       
   175 		return EFalse;
       
   176 		}
       
   177 
       
   178 	if(iEventTemplates->MdcaCount() !=
       
   179 		aSIPEventHeader.iEventTemplates->MdcaCount()) 
       
   180 		{
       
   181 		return EFalse;
       
   182 		}
       
   183 	for (TInt i=0; i < iEventTemplates->MdcaCount(); i++)
       
   184 		{
       
   185 		if(iEventTemplates->MdcaPoint(i) !=
       
   186 			aSIPEventHeader.iEventTemplates->MdcaPoint(i)) 
       
   187 			{
       
   188 			return EFalse;
       
   189 			}
       
   190 		}
       
   191 	return (*iParams == *(aSIPEventHeader.iParams));
       
   192 	}
       
   193 
       
   194 // ----------------------------------------------------------------------------
       
   195 // CSIPEventHeader::SetEventPackageL
       
   196 // ----------------------------------------------------------------------------
       
   197 //
       
   198 EXPORT_C void CSIPEventHeader::SetEventPackageL (const TDesC8& aEventPackage)
       
   199 	{
       
   200 	HBufC8* tmp = aEventPackage.AllocLC();
       
   201 	tmp->Des().Trim();
       
   202 	if (!SIPSyntaxCheck::Token(*tmp) || (tmp->Find(KDot) != KErrNotFound))
       
   203 		{
       
   204 		User::Leave(KErrSipCodecEventHeader);
       
   205 		}
       
   206 	CleanupStack::Pop(tmp);
       
   207 	delete iEventPackage;
       
   208 	iEventPackage = tmp;
       
   209 	}
       
   210 
       
   211 // ----------------------------------------------------------------------------
       
   212 // CSIPEventHeader::EventPackage
       
   213 // ----------------------------------------------------------------------------
       
   214 //
       
   215 EXPORT_C const TDesC8& CSIPEventHeader::EventPackage() const
       
   216 	{
       
   217 	return *iEventPackage;
       
   218 	}
       
   219 
       
   220 // ----------------------------------------------------------------------------
       
   221 // CSIPEventHeader::SetEventTemplatesL
       
   222 // ----------------------------------------------------------------------------
       
   223 //
       
   224 EXPORT_C void CSIPEventHeader::SetEventTemplatesL(
       
   225     const MDesC8Array& aEventTemplates)
       
   226 	{
       
   227 	CDesC8ArraySeg* eventTemplates = new(ELeave) CDesC8ArraySeg(1);
       
   228 	CleanupStack::PushL(eventTemplates);
       
   229 	for (TInt i=0; i < aEventTemplates.MdcaCount(); i++)
       
   230 		{
       
   231 		CheckTemplateL(aEventTemplates.MdcaPoint(i));
       
   232 		eventTemplates->AppendL(aEventTemplates.MdcaPoint(i));
       
   233 		}
       
   234     CleanupStack::Pop(eventTemplates);
       
   235 	delete iEventTemplates;
       
   236 	iEventTemplates = eventTemplates;
       
   237 	}
       
   238 
       
   239 // ----------------------------------------------------------------------------
       
   240 // CSIPEventHeader::EventTemplates
       
   241 // ----------------------------------------------------------------------------
       
   242 //
       
   243 EXPORT_C const MDesC8Array& CSIPEventHeader::EventTemplates () const
       
   244 	{
       
   245 	return *iEventTemplates;
       
   246 	}
       
   247 
       
   248 // ----------------------------------------------------------------------------
       
   249 // CSIPEventHeader::InternalizeValueL
       
   250 // ----------------------------------------------------------------------------
       
   251 //
       
   252 EXPORT_C CSIPHeaderBase* CSIPEventHeader::InternalizeValueL(
       
   253     RReadStream& aReadStream)
       
   254 	{
       
   255 	CSIPEventHeader* self = new(ELeave)CSIPEventHeader;
       
   256 	CleanupStack::PushL(self);
       
   257 	self->ConstructL();
       
   258 	self->DoInternalizeValueL(aReadStream);
       
   259 	CleanupStack::Pop(self);
       
   260 	return self;
       
   261 	}
       
   262 
       
   263 // ----------------------------------------------------------------------------
       
   264 // CSIPEventHeader::CheckTemplateL
       
   265 // ----------------------------------------------------------------------------
       
   266 //
       
   267 void CSIPEventHeader::CheckTemplateL (const TDesC8& aParam) const
       
   268 	{
       
   269 	// event-template Param
       
   270 	if (!SIPSyntaxCheck::Token(aParam) || aParam.Find(KDot) != KErrNotFound)
       
   271 		{
       
   272 		User::Leave(KErrSipCodecEventHeader);
       
   273 		}
       
   274 	}
       
   275 
       
   276 // ----------------------------------------------------------------------------
       
   277 // CSIPEventHeader::DoInternalizeValueL
       
   278 // ----------------------------------------------------------------------------
       
   279 //
       
   280 void CSIPEventHeader::DoInternalizeValueL (RReadStream& aReadStream)
       
   281 	{
       
   282     iEventPackage = SIPCodecUtils::ReadDescFromStreamL(aReadStream);
       
   283 	TUint32 templateCount = aReadStream.ReadUint32L();
       
   284 
       
   285 	for (TUint32 i=0; i < templateCount; i++)
       
   286 		{
       
   287         HBufC8* value = SIPCodecUtils::ReadDescFromStreamL(aReadStream);
       
   288         CleanupStack::PushL(value);
       
   289         iEventTemplates->AppendL(*value);
       
   290         CleanupStack::PopAndDestroy(value);
       
   291 		}
       
   292 
       
   293 	delete iParams;
       
   294 	iParams = NULL;
       
   295 	iParams = CSIPEventHeaderParams::InternalizeL(aReadStream);
       
   296 	}	
       
   297 
       
   298 // ----------------------------------------------------------------------------
       
   299 // CSIPEventHeader::ExternalizeValueL
       
   300 // From CSIPHeaderBase:
       
   301 // ----------------------------------------------------------------------------
       
   302 //
       
   303 void CSIPEventHeader::ExternalizeValueL (RWriteStream& aWriteStream) const
       
   304 	{
       
   305 	aWriteStream.WriteUint32L (iEventPackage->Length());
       
   306 	if (iEventPackage->Length() > 0)
       
   307 		{
       
   308 		aWriteStream.WriteL (EventPackage());
       
   309 		}
       
   310 
       
   311 	aWriteStream.WriteUint32L (iEventTemplates->MdcaCount());
       
   312 	for (TInt i=0; i < iEventTemplates->MdcaCount(); i++)
       
   313 		{
       
   314 		aWriteStream.WriteUint32L (iEventTemplates->MdcaPoint(i).Length());
       
   315 		aWriteStream.WriteL (iEventTemplates->MdcaPoint(i));
       
   316 		}
       
   317 	iParams->ExternalizeL (aWriteStream);
       
   318 	}
       
   319 
       
   320 // ----------------------------------------------------------------------------
       
   321 // CSIPEventHeader::PreferredPlaceInMessage
       
   322 // From CSIPHeaderBase:
       
   323 // ----------------------------------------------------------------------------
       
   324 //
       
   325 CSIPHeaderBase::TPreferredPlace
       
   326 CSIPEventHeader::PreferredPlaceInMessage () const
       
   327 	{
       
   328 	return CSIPHeaderBase::EBottom;
       
   329 	}
       
   330 
       
   331 // ----------------------------------------------------------------------------
       
   332 // CSIPEventHeader::BaseDecodeL
       
   333 // ----------------------------------------------------------------------------
       
   334 //
       
   335 RPointerArray<CSIPHeaderBase> CSIPEventHeader::BaseDecodeL(
       
   336     const TDesC8& aValue)
       
   337 	{
       
   338 	CSIPEventHeader* eventHeader = new(ELeave) CSIPEventHeader;
       
   339     CleanupStack::PushL(eventHeader);
       
   340     eventHeader->ConstructL();
       
   341 	eventHeader->ParseL(aValue);
       
   342 	RPointerArray<CSIPHeaderBase> headerArray;
       
   343 	headerArray.AppendL(eventHeader);
       
   344 	CleanupStack::Pop(eventHeader);
       
   345 	return headerArray;
       
   346 	}
       
   347 
       
   348 // ----------------------------------------------------------------------------
       
   349 // CSIPEventHeader::ToTextMandatoryPartLC
       
   350 // From CSIPParameterHeaderBase:
       
   351 // ----------------------------------------------------------------------------
       
   352 //
       
   353 HBufC8* CSIPEventHeader::ToTextMandatoryPartLC () const
       
   354 	{
       
   355 	TUint encodedLength = 0;
       
   356 	RPointerArray<HBufC8> templatesAsText;
       
   357 	CleanupStack::PushL (TCleanupItem(ResetAndDestroy,&templatesAsText));
       
   358 
       
   359 	encodedLength += iEventPackage->Length(); 
       
   360 	for (TInt i=0; i < iEventTemplates->MdcaCount(); i++)
       
   361 		{
       
   362 		HBufC8* templateAsText = (iEventTemplates->MdcaPoint(i)).AllocLC();
       
   363 		encodedLength += templateAsText->Length() + 1;// param separator length
       
   364 		templatesAsText.AppendL(templateAsText);
       
   365 		CleanupStack::Pop(templateAsText);
       
   366 		}
       
   367 
       
   368 	HBufC8* encodedHeader = HBufC8::NewL (encodedLength);
       
   369 	TPtr8 encodedHeaderPtr = encodedHeader->Des();
       
   370 
       
   371 	encodedHeaderPtr.Append(*iEventPackage);
       
   372 	
       
   373 	for (TInt j=0; j < templatesAsText.Count(); j++)
       
   374 		{
       
   375 		encodedHeaderPtr.Append('.'); // dot
       
   376 		encodedHeaderPtr.Append (*templatesAsText[j]);
       
   377 		}
       
   378 	
       
   379 	CleanupStack::PopAndDestroy(); // templatesAsText
       
   380 	CleanupStack::PushL(encodedHeader);
       
   381 	return encodedHeader;
       
   382 	}
       
   383 	
       
   384 // ----------------------------------------------------------------------------
       
   385 // CSIPEventHeader::ParseMandatoryPartL
       
   386 // ----------------------------------------------------------------------------
       
   387 //
       
   388 void CSIPEventHeader::ParseMandatoryPartL (const TDesC8& aMandatoryPart)
       
   389 	{
       
   390 	__ASSERT_ALWAYS (aMandatoryPart.Length() > 0, 
       
   391 		User::Leave (KErrSipCodecEventHeader));
       
   392 	HBufC8* tmp = aMandatoryPart.AllocLC();
       
   393 	tmp->Des().Trim();
       
   394 
       
   395 	TLex8 lex(*tmp);
       
   396 	lex.SkipSpace();
       
   397 	CSIPTokenizer* tokenizer = CSIPTokenizer::NewLC(lex.Remainder(), '.');
       
   398 
       
   399 	TLex8 lex2(tokenizer->Tokens()[0]);
       
   400 	SetEventPackageL(lex2.Remainder());
       
   401 	
       
   402 	for (TInt j=1; j < tokenizer->Tokens().Count(); j++)
       
   403 		{
       
   404 		CheckTemplateL((tokenizer->Tokens()[j]));
       
   405 		iEventTemplates->AppendL((tokenizer->Tokens()[j]));
       
   406 		}
       
   407 
       
   408 	CleanupStack::PopAndDestroy(tokenizer);
       
   409 	CleanupStack::PopAndDestroy(tmp);
       
   410 	}	
       
   411 
       
   412 // ----------------------------------------------------------------------------
       
   413 // CSIPEventHeader::Params
       
   414 // From CSIPParameterHeaderBase:
       
   415 // ----------------------------------------------------------------------------
       
   416 //
       
   417 const CSIPParamContainerBase& CSIPEventHeader::Params () const
       
   418     {
       
   419     return *iParams; 
       
   420     }
       
   421 
       
   422 // ----------------------------------------------------------------------------
       
   423 // CSIPEventHeader::Params
       
   424 // From CSIPParameterHeaderBase:
       
   425 // ----------------------------------------------------------------------------
       
   426 //
       
   427 CSIPParamContainerBase& CSIPEventHeader::Params ()
       
   428     {
       
   429     return *iParams; 
       
   430     }
       
   431 
       
   432 // ----------------------------------------------------------------------------
       
   433 // CSIPEventHeader::ResetAndDestroy
       
   434 // ----------------------------------------------------------------------------
       
   435 //
       
   436 void CSIPEventHeader::ResetAndDestroy (TAny* anArray)
       
   437 	{
       
   438 	(reinterpret_cast<RPointerArray<HBufC8>*> (anArray))->ResetAndDestroy();
       
   439 	}