realtimenetprots/sipfw/SIP/Codec/src/CSIPContentTypeHeader.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPContentTypeHeader.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,342 @@
+// 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          : CSIPContentTypeHeader.cpp
+// Part of       : SIP Codec
+// Version       : SIP/4.0 
+//
+
+
+
+
+#include "sipcontenttypeheader.h"
+#include "CSIPContentTypeHeaderParams.h"
+#include "SIPSyntaxCheck.h"
+#include "sipcodecerr.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "sipcodecutils.h"
+#include "_sipcodecdefs.h"
+
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::DecodeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPContentTypeHeader* 
+CSIPContentTypeHeader::DecodeL (const TDesC8& aValue)
+	{
+	CSIPContentTypeHeader* header = new(ELeave)CSIPContentTypeHeader;
+	CleanupStack::PushL (header);
+    header->ConstructL();
+	header->ParseL (aValue);
+	CleanupStack::Pop(header);
+	return header;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPContentTypeHeader* CSIPContentTypeHeader::NewL(
+    const TDesC8& aMediaType,
+    const TDesC8& aMediaSubtype)
+	{
+	CSIPContentTypeHeader* self = 
+		CSIPContentTypeHeader::NewLC(aMediaType,aMediaSubtype);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPContentTypeHeader* CSIPContentTypeHeader::NewLC(
+    const TDesC8& aMediaType,
+    const TDesC8& aMediaSubtype)
+	{
+	CSIPContentTypeHeader* self = new(ELeave)CSIPContentTypeHeader;
+	CleanupStack::PushL(self);
+	self->ConstructL(aMediaType,aMediaSubtype);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::CSIPContentTypeHeader
+// -----------------------------------------------------------------------------
+//
+CSIPContentTypeHeader::CSIPContentTypeHeader()
+ : CSIPParameterHeaderBase(';')
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::ConstructL ()
+	{
+	iParams = new(ELeave)CSIPContentTypeHeaderParams;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::ConstructL (const TDesC8& aMediaType,
+										const TDesC8& aMediaSubtype)
+	{
+    ConstructL ();
+	SetMediaTypeL (aMediaType);
+	SetMediaSubtypeL (aMediaSubtype);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::ConstructL (const CSIPContentTypeHeader&
+										aContentTypeHeader)
+	{
+	SetMediaTypeL (aContentTypeHeader.MediaType());
+	SetMediaSubtypeL (aContentTypeHeader.MediaSubtype());
+	iParams = CSIPContentTypeHeaderParams::NewL(*(aContentTypeHeader.iParams));
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::~CSIPContentTypeHeader
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPContentTypeHeader::~CSIPContentTypeHeader()
+	{
+	delete iParams;
+	delete iMediaSubtype;
+	delete iMediaType;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::CloneL
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPHeaderBase* CSIPContentTypeHeader::CloneL () const
+	{
+	CSIPContentTypeHeader* clone = new(ELeave)CSIPContentTypeHeader;
+	CleanupStack::PushL(clone);
+	clone->ConstructL(*this);
+	CleanupStack::Pop(clone);
+	return clone;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::MediaType
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CSIPContentTypeHeader::MediaType () const
+	{
+	return *iMediaType;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::SetMediaTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPContentTypeHeader::SetMediaTypeL (const TDesC8& aMediaType)
+	{
+    SIPCodecUtils::CheckAndSetValueL(iMediaType,
+                                     aMediaType,
+                                     KErrSipCodecContentTypeHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::MediaSubtype
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CSIPContentTypeHeader::MediaSubtype () const
+	{
+	return *iMediaSubtype;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::SetMediaSubtypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void 
+CSIPContentTypeHeader::SetMediaSubtypeL (const TDesC8& aMediaSubtype)
+	{
+    SIPCodecUtils::CheckAndSetValueL(iMediaSubtype,
+                                     aMediaSubtype,
+                                     KErrSipCodecContentTypeHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::Name
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RStringF CSIPContentTypeHeader::Name() const
+	{
+	return SIPStrings::StringF(SipStrConsts::EContentTypeHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::HasCompactName
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+TBool CSIPContentTypeHeader::HasCompactName () const
+	{
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::CompactName
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+RStringF CSIPContentTypeHeader::CompactName () const
+	{
+	return SIPStrings::StringF(SipStrConsts::EContentTypeHeaderCompact);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::InternalizeValueL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPHeaderBase* CSIPContentTypeHeader::InternalizeValueL(
+    RReadStream& aReadStream)
+	{
+	CSIPContentTypeHeader* self = new(ELeave)CSIPContentTypeHeader;
+	CleanupStack::PushL(self);
+	self->DoInternalizeValueL(aReadStream);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ExternalizeValueL
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::ExternalizeValueL(RWriteStream& aWriteStream) const
+	{
+	aWriteStream.WriteUint32L (iMediaType->Length());
+	aWriteStream.WriteL (*iMediaType);
+	
+	aWriteStream.WriteUint32L (iMediaSubtype->Length());
+	aWriteStream.WriteL (*iMediaSubtype);
+	
+	iParams->ExternalizeL (aWriteStream);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::DoInternalizeValueL
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::DoInternalizeValueL(RReadStream& aReadStream)
+	{
+    iMediaType = SIPCodecUtils::ReadDescFromStreamL(aReadStream);
+    iMediaSubtype = SIPCodecUtils::ReadDescFromStreamL(aReadStream);
+	iParams = CSIPContentTypeHeaderParams::InternalizeL (aReadStream);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::PreferredPlaceInMessage
+// From CSIPHeaderBase:
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderBase::TPreferredPlace
+CSIPContentTypeHeader::PreferredPlaceInMessage () const
+	{
+	return CSIPHeaderBase::EBottom;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::BaseDecodeL
+// -----------------------------------------------------------------------------
+//
+RPointerArray<CSIPHeaderBase> 
+CSIPContentTypeHeader::BaseDecodeL (const TDesC8& aValue)
+	{
+	CSIPContentTypeHeader* header = DecodeL(aValue);
+	CleanupStack::PushL (header);
+	RPointerArray<CSIPHeaderBase> headers;
+	User::LeaveIfError(headers.Append(header));
+	CleanupStack::Pop(header);
+	return headers;
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ToTextMandatoryPartLC
+// From CSIPParameterHeaderBase:
+// -----------------------------------------------------------------------------
+//
+HBufC8* CSIPContentTypeHeader::ToTextMandatoryPartLC () const
+    {
+	TUint encodedLength = iMediaType->Length() + 1; // SLASH
+	encodedLength += iMediaSubtype->Length(); 
+
+	HBufC8* encodingResult = HBufC8::NewLC (encodedLength);
+	TPtr8 encodingResultPtr = encodingResult->Des();
+
+	encodingResultPtr.Append(*iMediaType);
+	encodingResultPtr.Append('/'); // SLASH
+	encodingResultPtr.Append(*iMediaSubtype);
+
+	return encodingResult;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::ParseMandatoryPartL
+// From CSIPParameterHeaderBase:
+// -----------------------------------------------------------------------------
+//
+void CSIPContentTypeHeader::ParseMandatoryPartL (const TDesC8& aMandatoryPart)
+    {
+	__ASSERT_ALWAYS (aMandatoryPart.Length() > 0,
+	                 User::Leave(KErrSipCodecContentTypeHeader));
+	
+	TLex8 lex(aMandatoryPart);
+	lex.SkipSpace();
+	TPtrC8 value(lex.Remainder());
+	
+	TInt slashPos = value.Locate('/');
+	if (slashPos <= 0 || slashPos >= value.Length()-1)
+		{
+		User::Leave (KErrSipCodecContentTypeHeader);
+		}
+    
+	SetMediaTypeL (value.Left(slashPos));
+    SetMediaSubtypeL (value.Mid(slashPos+1));
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::Params
+// From CSIPParameterHeaderBase:
+// -----------------------------------------------------------------------------
+//
+const CSIPParamContainerBase& CSIPContentTypeHeader::Params () const
+    {
+    return *iParams; 
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPContentTypeHeader::Params
+// From CSIPParameterHeaderBase:
+// -----------------------------------------------------------------------------
+//
+CSIPParamContainerBase& CSIPContentTypeHeader::Params ()
+    {
+    return *iParams; 
+    }