contentmgmt/contentaccessfwfordrm/source/cafutils/cafmimeheader.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/contentaccessfwfordrm/source/cafutils/cafmimeheader.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+#ifndef REMOVE_CAF1
+
+#include <caf/caftypes.h>
+#include <s32strm.h>
+#include "cafmimeheader.h"
+#include "mimefieldanddata.h"
+
+using namespace ContentAccess;
+
+EXPORT_C CCafMimeHeader* CCafMimeHeader::NewL(const TDesC8 &aContentType)
+	{
+	CCafMimeHeader *self = new (ELeave) CCafMimeHeader();
+	CleanupStack::PushL(self);
+	self->ConstructL(aContentType);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CCafMimeHeader::CCafMimeHeader() 
+	{
+	}
+
+void CCafMimeHeader::ConstructL(const TDesC8 &aContentType) 
+	{
+	SetStandardMimeDataL(EContentType, aContentType);
+	}
+
+EXPORT_C CCafMimeHeader::~CCafMimeHeader()
+	{
+	TInt i=0;
+	iNonStandardMimeHeaders.ResetAndDestroy();
+	iNonStandardMimeHeaders.Close();
+	
+	for(i = 0; i < EMimeMax; i++)
+		{
+		delete iStandardMimeHeader[i];
+		}
+	}
+
+EXPORT_C void CCafMimeHeader::SetStandardMimeDataL(const TMimeFields &aIndex, const TDesC8& aData)
+	{
+	HBufC8 *data = aData.AllocLC();
+
+	// make sure mime types are lower case
+	if(aIndex == EContentType)
+		{
+		data->Des().LowerCase();
+		}
+	
+	// replace whatever value was there before
+	delete iStandardMimeHeader[aIndex];
+	iStandardMimeHeader[aIndex] = data;
+		
+	CleanupStack::Pop(data); 
+	}
+
+EXPORT_C TPtrC8 CCafMimeHeader::StandardMimeData(const TMimeFields &aIndex) const
+	{
+	// If the field value has not been set, return a null string
+	if(iStandardMimeHeader[aIndex] == NULL)
+		{
+		return KNullDesC8();
+		}
+	return TPtrC8(iStandardMimeHeader[aIndex]->Des());
+	}
+
+
+EXPORT_C TInt CCafMimeHeader::NonStandardMimeCount() const
+	{
+	return iNonStandardMimeHeaders.Count();
+	}
+
+EXPORT_C void CCafMimeHeader::AddNonStandardMimeL(const TDesC8& aFieldName, const TDesC8& aData)
+	{
+	CMimeFieldAndData *mimeData = CMimeFieldAndData::NewL(aFieldName, aData);
+	CleanupStack::PushL(mimeData);
+	iNonStandardMimeHeaders.Append(mimeData);
+	CleanupStack::Pop(mimeData);
+	}
+
+EXPORT_C TPtrC8 CCafMimeHeader::NonStandardMimeField(TInt aIndex) const
+	{
+	return iNonStandardMimeHeaders[aIndex]->FieldName();
+	}
+
+EXPORT_C TPtrC8 CCafMimeHeader::NonStandardMimeData(TInt aIndex) const
+	{
+	return iNonStandardMimeHeaders[aIndex]->Data();
+	}
+
+EXPORT_C void CCafMimeHeader::ExternalizeL(RWriteStream& aStream) const
+	{
+	TInt i=0;
+	
+	// Write the contents of this class out to a stream
+
+	// Write the number of standard mime headers
+	aStream.WriteInt32L(EMimeMax);
+	
+	// Write out the standard mime data, each one preceeded by it's length
+	for(i = 0; i < EMimeMax; i++)
+		{
+		TInt length=0;
+		
+		// Length is zero if the mime field has not been set, 
+		if(iStandardMimeHeader[i] == NULL)
+			{
+			length = 0;
+			}
+		else 
+			{
+			length = iStandardMimeHeader[i]->Length();
+			}
+
+		// write the field length
+		aStream.WriteInt16L(length);
+		if(length > 0)
+			{
+			// write the field value if length > 0
+			aStream.WriteL(*iStandardMimeHeader[i]);
+			}
+		}
+
+	aStream.WriteInt32L(iNonStandardMimeHeaders.Count());
+
+	// Write out non standard mime headers and data, each Des preceeded by it's length
+	for(i = 0; i < iNonStandardMimeHeaders.Count(); i++)
+		{
+		aStream.WriteInt16L(iNonStandardMimeHeaders[i]->FieldName().Length());
+		if(iNonStandardMimeHeaders[i]->FieldName().Length() > 0)
+			{
+			aStream.WriteL(iNonStandardMimeHeaders[i]->FieldName());
+			}
+		aStream.WriteInt16L(iNonStandardMimeHeaders[i]->Data().Length());
+		if(iNonStandardMimeHeaders[i]->Data().Length() > 0)
+			{
+			aStream.WriteL(iNonStandardMimeHeaders[i]->Data());
+			}
+		}
+	}
+
+EXPORT_C void CCafMimeHeader::InternalizeL(RReadStream& aStream)
+	{
+	TInt i=0;
+	TInt fieldCount=0;
+	TInt16 length=0;
+	HBufC8 *field=NULL;
+	HBufC8 *data=NULL;
+	
+
+	// clear any existing headers	
+	iNonStandardMimeHeaders.ResetAndDestroy();
+	for(i = 0; i < EMimeMax; i++)
+		{
+		// delete the existing data for the mime field
+		delete iStandardMimeHeader[i];
+		iStandardMimeHeader[i] = NULL;
+		}
+
+
+	fieldCount= aStream.ReadInt32L();
+	if(fieldCount != EMimeMax)
+		{
+		// something is seriously wrong, should always be EMimeMax standard headers
+		User::Leave(KErrGeneral);
+		}
+	
+	for(i = 0; i < EMimeMax; i++)
+		{
+		// read the length from the stream
+		length = aStream.ReadInt16L();
+		if(length > 0)
+			{
+			// read in non zero fields, others will remain NULL
+			data = HBufC8::NewLC(length);
+			TPtr8 dataPtr = data->Des();
+			aStream.ReadL(dataPtr,length);
+			SetStandardMimeDataL(static_cast <TMimeFields>(i), dataPtr);
+			CleanupStack::PopAndDestroy(data);
+			}
+		}
+
+	fieldCount= aStream.ReadInt32L();
+
+	for(i = 0; i < fieldCount; i++)
+		{
+		// Read mime field name
+		length = aStream.ReadInt16L();
+		if(length < 0)
+			{
+			User::Leave(KErrCorrupt);
+			}
+
+		field = HBufC8::NewLC(length);
+		TPtr8 fieldPtr = field->Des();
+		if(length > 0)
+			{
+			aStream.ReadL(fieldPtr,length);
+			}
+		
+		// Read data
+		length = aStream.ReadInt16L();
+		if(length < 0)
+			{
+			User::Leave(KErrCorrupt);
+			}
+
+		data = HBufC8::NewLC(length);
+		TPtr8 dataPtr = data->Des();
+		if(length > 0)
+			{
+			aStream.ReadL(dataPtr,length);
+			}
+
+		// Add a new mime field and data to our array
+		AddNonStandardMimeL(fieldPtr, dataPtr);
+
+		// free memory allocated
+		CleanupStack::PopAndDestroy(data);
+		CleanupStack::PopAndDestroy(field); 
+		}
+	}
+
+
+#endif // #ifndef REMOVE_CAF1