emailservices/emailframework/commonlib/src/CFSMailMessagePart.cpp
branchRCL_3
changeset 64 3533d4323edc
child 80 726fba06891a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailframework/commonlib/src/CFSMailMessagePart.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,1339 @@
+/*
+* Copyright (c) 2007-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:  common email part object
+*
+*/
+
+#include "emailtrace.h"
+#include <apgcli.h>
+#include <apmrec.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h> // CleanupResetAndDestroy
+
+//<cmail>
+#include "cfsmailmessagepart.h"
+#include "cfsmailplugin.h"
+//</cmail>
+
+#include "cfsmailrequestobserver.h"
+
+
+// ================= MEMBER FUNCTIONS ==========================================
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::NewLC
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::NewLC( TFSMailMsgId aMessageId,
+														TFSMailMsgId aMessagePartId )
+{
+    FUNC_LOG;
+  CFSMailMessagePart* adr = new (ELeave) CFSMailMessagePart();
+  CleanupStack::PushL(adr);
+  adr->ConstructL( aMessageId, aMessagePartId );
+  return adr;
+} 
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::NewL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::NewL(	TFSMailMsgId aMessageId,
+														TFSMailMsgId aMessagePartId )
+{
+    FUNC_LOG;
+  CFSMailMessagePart* adr =  CFSMailMessagePart::NewLC( aMessageId, aMessagePartId );
+  CleanupStack::Pop(adr);
+  return adr;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ConstructL
+// -----------------------------------------------------------------------------
+void CFSMailMessagePart::ConstructL( TFSMailMsgId aMessageId,
+                                     TFSMailMsgId aMessagePartId )
+{
+    FUNC_LOG;
+	iMessageId = aMessageId;
+	iMessagePartId = aMessagePartId;
+	iMessagePartsStatus = EFSDefault;
+
+	iContentTypeParams  = new (ELeave)CDesCArrayFlat( KArrayGranularity );
+	iContentDispositionParams = new (ELeave)CDesCArrayFlat( KArrayGranularity );
+
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::~CFSMailMessagePart
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart::~CFSMailMessagePart()
+{
+    FUNC_LOG;
+	if(iContentType)
+	{
+		delete iContentType;
+	}
+    iContentType = NULL;
+    
+	if(iContentDescription)
+	{
+		delete iContentDescription;
+	}
+    iContentDescription = NULL;
+    
+	if(iContentDisposition)
+	{
+		delete iContentDisposition;
+	}
+	iContentDisposition = NULL;
+    
+	if(iAttachmentName)
+	{
+		delete iAttachmentName;
+	}
+ 	iAttachmentName = NULL;
+
+	if(iContentClass)
+	{
+		delete iContentClass;
+	}
+ 	iContentClass = NULL;
+
+	if(iContentID)
+	{
+		delete iContentID;
+	}
+ 	iContentID = NULL;
+
+	if(iMeetingRequest)
+	{
+		delete iMeetingRequest;
+	}
+	iMeetingRequest = NULL;
+
+	if(iContentDispositionParams)
+		{
+	    iContentDispositionParams->Reset();
+	    delete iContentDispositionParams;
+		}
+	if(iContentTypeParams)
+		{
+	    iContentTypeParams->Reset();
+	    delete iContentTypeParams;		
+		}
+	
+	iMessageParts.ResetAndDestroy();
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::CFSMailMessagePart
+// -----------------------------------------------------------------------------
+CFSMailMessagePart::CFSMailMessagePart() : CFSMailMessageBase()
+{
+    FUNC_LOG;
+
+	iContentType = HBufC::New(1);
+	iContentType->Des().Copy(KNullDesC());
+
+	iContentDescription = HBufC::New(1);
+	iContentDescription->Des().Copy(KNullDesC());
+
+	iContentDisposition = HBufC::New(1);
+	iContentDisposition->Des().Copy(KNullDesC());
+
+	iContentClass = HBufC::New(1);
+	iContentClass->Des().Copy(KNullDesC());
+
+	iContentID = HBufC::New(1);
+	iContentID->Des().Copy(KNullDesC());
+
+	iAttachmentName = HBufC::New(1);
+	iAttachmentName->Des().Copy(KNullDesC());
+
+	iReadMessageParts = ETrue;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetContentType
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC& CFSMailMessagePart::GetContentType()
+{
+    FUNC_LOG;
+	return *iContentType;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentType
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentType(const TDesC& aContentType)
+{
+    FUNC_LOG;
+
+	HBufC* contentType = HBufC::New(aContentType.Length());
+	
+	// store new mailbox name
+	if(contentType)
+	{
+		delete iContentType;
+		iContentType = contentType;
+		iContentType->Des().Copy(aContentType);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetPartId
+// -----------------------------------------------------------------------------
+EXPORT_C TFSMailMsgId CFSMailMessagePart::GetPartId() const
+{
+    FUNC_LOG;
+	return iMessagePartId;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ChildPartsL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::ChildPartsL(RPointerArray<CFSMailMessagePart>& aParts)
+	{
+    FUNC_LOG;
+
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
+		{
+	    plugin->ChildPartsL(GetMailBoxId(),GetFolderId(),GetMessageId(),GetPartId(),aParts);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ChildPartL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::ChildPartL(TFSMailMsgId aPartId)
+	{
+    FUNC_LOG;
+	
+	CFSMailMessagePart* part = NULL;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
+		{
+		part = plugin->MessagePartL(GetMailBoxId(),
+									GetFolderId(),
+									GetMessageId(),
+									aPartId);
+		}
+	return part;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::IsMessageL
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CFSMailMessagePart::IsMessageL() const
+	{
+    FUNC_LOG;
+
+	TBuf<KMaxDataTypeLength> ptr;
+	if ( iContentType )
+    {
+		ptr.Copy(iContentType->Des());
+		TInt length = ptr.Locate(';');
+		if(length >= 0)
+			{
+			ptr.SetLength(length);
+			}
+		
+		if( !ptr.CompareF(KFSMailContentTypeMessage) )
+		{
+			return ETrue;
+		}
+    }
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::NewChildPartL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::NewChildPartL( const TFSMailMsgId aInsertBefore,
+																const TDesC& aContentType )
+	{
+    FUNC_LOG;
+
+	CFSMailMessagePart* part = NULL;
+	
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
+		{
+		part = plugin->NewChildPartL( 	GetMailBoxId(), GetFolderId(), GetMessageId(),
+								 		GetPartId(), aInsertBefore, aContentType );
+		}
+	return part;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::RemoveChildPartL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::RemoveChildPartL(TFSMailMsgId aPartId)
+{
+    FUNC_LOG;
+	// get plugin pointer
+	TFSMailMsgId id = GetPartId();
+	if(id.IsNullId())
+		{
+		id = GetMessageId();
+		}
+	CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(id);
+	
+	if(plugin)
+		{
+		plugin->RemoveChildPartL( GetMailBoxId(), GetFolderId(), GetMessageId(), GetPartId(), aPartId );
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetContentClass
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC& CFSMailMessagePart::GetContentClass()
+	{
+    FUNC_LOG;
+		return *iContentClass;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentClass
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentClass( const TDesC& aContentClass )
+	{
+    FUNC_LOG;
+
+	// 
+	HBufC* contentClass = HBufC::New(aContentClass.Length());
+	
+	// store new mailbox name
+	if(contentClass)
+	{
+		delete iContentClass;
+		iContentClass = contentClass;
+		iContentClass->Des().Copy(aContentClass);
+	}
+		iContentClass->ReAlloc(aContentClass.Length());
+		if(iContentClass)
+		{
+			iContentClass->Des().Copy(aContentClass);		
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentSize
+// -----------------------------------------------------------------------------
+EXPORT_C TUint CFSMailMessagePart::ContentSize() const
+	{
+    FUNC_LOG;
+		return iContentSize;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentSize
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentSize( TUint aContentSize )
+	{
+    FUNC_LOG;
+		iContentSize = aContentSize;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentID
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC& CFSMailMessagePart::ContentID()
+	{
+    FUNC_LOG;
+	return *iContentID;
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentIDL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentIDL(const TDesC& aContentID)
+	{
+    FUNC_LOG;
+	// init mailbox name
+	HBufC* id = HBufC::New(aContentID.Length());
+	
+	// store new mailbox name
+	if(id)
+	{
+		delete iContentID;
+		iContentID = id;
+		iContentID->Des().Copy(aContentID);
+	}
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::CopyMessageAsChildPartL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::CopyMessageAsChildPartL(
+													TFSMailMsgId aInsertBefore,
+													CFSMailMessage* aMessage)
+	{
+    FUNC_LOG;
+	
+	CFSMailMessagePart* part = NULL;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+	{
+		part = plugin->CopyMessageAsChildPartL(GetMailBoxId(),GetFolderId(),GetMessageId(),GetPartId(),
+											aInsertBefore, *aMessage);
+	}
+	return part;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::RemoveContentL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::RemoveContentL()
+	{
+    FUNC_LOG;
+	
+	CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId());
+	if(plugin == NULL)
+	    {
+	    plugin = iRequestHandler->GetPluginByUid(GetMessageId());
+	    }
+	
+	if(plugin != NULL)
+		{
+		RPointerArray<CFSMailMessagePart> parts;
+        CleanupResetAndDestroyPushL( parts );
+        plugin->ChildPartsL(GetMailBoxId(),GetFolderId(),GetMessageId(),GetPartId(),parts);
+        RArray<TFSMailMsgId> partIds;
+        CleanupClosePushL( partIds );
+        partIds.ReserveL( 1 + parts.Count() );
+		for(TInt i=0;i<parts.Count();i++)
+			{
+			partIds.AppendL( parts[i]->GetMessageId() );
+			}
+        partIds.AppendL( GetPartId() );
+		plugin->RemovePartContentL(GetMailBoxId(), GetFolderId(), GetMessageId(), partIds);
+        CleanupStack::PopAndDestroy( &partIds );
+        CleanupStack::PopAndDestroy( &parts );
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::RemoveDownLoadedAttachmentsL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::RemoveDownLoadedAttachmentsL()
+    {
+    FUNC_LOG;
+        
+    CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId());
+    if(plugin == NULL)
+        {
+        plugin = iRequestHandler->GetPluginByUid(GetMessageId());
+        }
+    
+    if(plugin != NULL)
+        {
+        // get attachment list
+        RPointerArray<CFSMailMessagePart> attachments;
+        CleanupResetAndDestroyPushL( attachments );
+        DoAttachmentListL(attachments);
+
+        // copy attachment part ids
+        RArray<TFSMailMsgId> ids;
+        CleanupClosePushL( ids ); 
+        for(TInt i=0;i<attachments.Count();i++)
+            {
+            ids.Append(attachments[i]->GetPartId());
+            }
+        
+        // remove attachment fetched contents 
+        if(ids.Count())
+            {
+            TRAP_IGNORE(plugin->RemovePartContentL(GetMailBoxId(), GetFolderId(), GetMessageId(), ids));
+            }
+        
+        // clean tables
+        CleanupStack::PopAndDestroy( &ids );
+        CleanupStack::PopAndDestroy( &attachments );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetContentFileL
+// -----------------------------------------------------------------------------
+EXPORT_C RFile CFSMailMessagePart::GetContentFileL()
+	{
+    FUNC_LOG;
+	
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		TInt rcode = plugin->GetMessagePartFileL( GetMailBoxId(), GetFolderId(),
+					                            GetMessageId(), GetPartId(),
+					                            iFile );
+		// if content is encrypted, use temp dir files
+		if(rcode == KErrNotSupported)
+		    {
+		    // temp directory C:\Private\<uid>
+		    TFileName fileName;
+		    iFile = iRequestHandler->GetTempFileL(GetPartId(),fileName);
+		    plugin->CopyMessagePartFileL(GetMailBoxId(), GetFolderId(),
+		                                 GetMessageId(), GetPartId(),
+		                                 fileName);
+		    }
+		}
+	
+	return iFile;
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentFromFileL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentFromFileL(const TDesC& aFilePath)
+	{
+    FUNC_LOG;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		plugin->SetPartContentFromFileL(GetMailBoxId(), GetFolderId(),
+			GetMessageId(), GetPartId(), aFilePath );
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::CopyContentFileL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::CopyContentFileL( const TDesC& aFilePath )
+	{
+    FUNC_LOG;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		plugin->CopyMessagePartFileL( GetMailBoxId(), GetFolderId(),
+			GetMessageId(), GetPartId(), aFilePath);		
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetContentToBufferL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::GetContentToBufferL(TDes16& aBuffer, TUint aStartOffset)
+	{
+    FUNC_LOG;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		plugin->GetContentToBufferL( GetMailBoxId(), GetFolderId(), GetMessageId(),
+									 GetPartId(), aBuffer, aStartOffset );
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContent
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContent( TDes16& aBuffer )
+	{
+    FUNC_LOG;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		TRAPD(err,plugin->SetContentL( aBuffer, GetMailBoxId(), GetFolderId(),
+				GetMessageId(), GetPartId() ));
+		if(err)
+			{
+			return;
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentDescription
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC& CFSMailMessagePart::ContentDescription()
+	{
+    FUNC_LOG;
+		return *iContentDescription;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentDescription
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentDescription( const TDesC& aContentDescription )
+	{
+    FUNC_LOG;
+	// init mailbox name
+	HBufC* description = HBufC::New(aContentDescription.Length());
+	
+	// store new mailbox name
+	if(description)
+	{
+		delete iContentDescription;
+		iContentDescription = description;
+		iContentDescription->Des().Copy(aContentDescription);
+	}
+	}
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentDisposition
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC& CFSMailMessagePart::ContentDisposition()
+	{
+    FUNC_LOG;
+		return *iContentDisposition;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetContentDisposition
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetContentDisposition( const TDesC& aContentDisposition )
+	{
+    FUNC_LOG;
+	// init mailbox name
+	HBufC* disposition = HBufC::New(aContentDisposition.Length());
+	
+	// store new mailbox name
+	if(disposition)
+		{
+		delete iContentDisposition;
+		iContentDisposition = disposition;
+		iContentDisposition->Des().Copy(aContentDisposition);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentTypeParameters
+// -----------------------------------------------------------------------------
+EXPORT_C CDesCArray& CFSMailMessagePart::ContentTypeParameters()
+	{
+    FUNC_LOG;
+		
+	if(!iContentType)
+		{
+		return *iContentTypeParams;
+		}
+	
+	// clear parameter table
+	iContentTypeParams->Reset();
+	TInt ret = KErrNone;
+	
+	// check content type parameters existence
+	TInt index = iContentType->Locate(';');
+	if(index >= 0)
+		{
+		TInt attLength(0);
+		TInt valueLength(0);
+		while(index >= 0)
+			{
+			TPtrC attribute;
+			TPtrC value;
+			HBufC* buf;
+			
+			// set pointer to first parameter
+			TPtrC parameter = iContentType->Mid(index+1);
+			attLength = parameter.Locate('=');
+			if(attLength >= 0)
+				{
+				attribute.Set(parameter.Left(attLength));
+		  		valueLength = parameter.Locate(';');
+			  	if(valueLength < 0)
+			  		{
+				  	value.Set( parameter.Right(parameter.Length()-attLength-1) );
+				  	index = -1;
+			  		}
+			  	else
+			  		{
+				  	value.Set(parameter.Mid(attLength+1,(valueLength-attLength-1)));
+					index += valueLength + 1;			  		
+			  		}
+				}
+			else
+				{
+		  		attLength = parameter.Locate(';');
+			  	if(attLength < 0)
+			  		{
+				  	attribute.Set(parameter);
+				  	index = -1;
+			  		}
+			  	else
+			  		{
+					attribute.Set(parameter.Left(attLength));
+				  	index += attLength + 1;
+			  		}
+			  	}
+			
+			if(attribute.Length())
+				{
+				buf = HBufC::New(attribute.Length());
+				buf->Des().Copy(attribute);
+				TRAPD(err,iContentTypeParams->AppendL(buf->Des()));
+				if(value.Length() && err == KErrNone)
+					{
+					buf = HBufC::New(value.Length());
+					buf->Des().Copy(value);
+					TRAP(err,iContentTypeParams->AppendL(buf->Des()));
+					ret = err;
+					}
+				else
+					{
+					TBufC<1> empty(KNullDesC);
+					HBufC* buf = HBufC::New(empty.Des().Length());
+					buf->Des().Copy(empty);
+					TRAP(err,iContentTypeParams->AppendL(buf->Des()));
+					ret = err;
+					}
+    			}
+    		}
+    	}
+	
+	if(ret != KErrNone)
+		{
+		// clear parameter table
+		iContentTypeParams->Reset();
+		}
+		
+	return *iContentTypeParams;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentDispositionParameters
+// -----------------------------------------------------------------------------
+EXPORT_C CDesCArray& CFSMailMessagePart::ContentDispositionParameters()
+	{
+    FUNC_LOG;
+	
+	if(!iContentDisposition)
+		{
+		return *iContentDispositionParams;
+		}
+	
+	// clear parameter array
+	iContentDispositionParams->Reset();
+	TInt ret = KErrNone;
+    
+	// check content disposition parameters existence
+	TInt index = iContentDisposition->Locate(';');
+	if( index >= 0 )
+		{
+		TInt attLength(0);
+		TInt valueLength(0);
+		while(index >= 0)
+			{
+			TPtrC attribute;
+			TPtrC value;
+			
+			// set pointer to first parameter
+			TPtrC parameter = iContentDisposition->Mid(index+1);
+			attLength = parameter.Locate('=');
+			if( attLength >= 0 )
+				{
+				attribute.Set(parameter.Left(attLength));
+		  		valueLength = parameter.Locate(';');
+			  	if( valueLength < 0 )
+			  		{
+				  	value.Set( parameter.Right(parameter.Length()-attLength-1) );
+				  	index = -1;
+			  		}
+			  	else
+			  		{
+				  	value.Set( parameter.Mid(attLength+1,(valueLength-attLength-1)) );
+					index += valueLength + 1;			  		
+			  		}
+				}
+			else
+				{
+		  		attLength = parameter.Locate(';');
+			  	if(attLength < 0)
+			  		{
+				  	attribute.Set(parameter);
+				  	index = -1;
+			  		}
+			  	else
+			  		{
+					attribute.Set(parameter.Left(attLength));
+				  	index += attLength + 1;
+			  		}
+			  	}
+		    
+			if(attribute.Length())
+				{
+				HBufC* attBuf = HBufC::New(attribute.Length());
+				attBuf->Des().Copy(attribute);
+				// let's trim the attribute before adding to array
+				TPtr attTrim( attBuf->Des() );
+				attTrim.Trim();
+				
+				if ( attTrim.Length() )
+				    {
+				    // add trimmed attribute to the array
+				    TRAPD(err,iContentDispositionParams->AppendL( attTrim ));
+				    
+				    if(value.Length() && err == KErrNone)
+    					{
+    					HBufC* valueBuf = HBufC::New(value.Length());
+    					valueBuf->Des().Copy(value);
+    					// let's trim also the value before adding to array
+    					TPtr valueTrim( valueBuf->Des() );
+    				    valueTrim.Trim();
+    				    
+    				    if ( valueTrim.Length() )
+        				    {
+        				    // add trimmed value to the array
+        				    TRAPD(err,iContentDispositionParams->AppendL( valueTrim ));
+							ret = err;
+        				    }
+        				else
+        				    {
+        				    delete valueBuf;
+        				    valueBuf = NULL;
+        				    
+        				    TBufC<1> empty(KNullDesC);
+        					HBufC* emptyBuf = HBufC::New(empty.Des().Length());
+        					emptyBuf->Des().Copy(empty);
+        					TRAPD(err,iContentDispositionParams->AppendL(emptyBuf->Des()));
+							ret = err;
+        				    }
+    					}
+    				else
+    			        {
+    			        TBufC<1> empty(KNullDesC);
+    					HBufC* emptyBuf = HBufC::New(empty.Des().Length());
+    					emptyBuf->Des().Copy(empty);
+    					TRAPD(err,iContentDispositionParams->AppendL(emptyBuf->Des()));
+    					ret = err;
+    			        }
+				    }
+				else
+				    {
+				    delete attBuf;
+				    attBuf = NULL;
+				    }
+				}
+    		} // while
+    	}
+
+	if(ret != KErrNone)
+		{
+		// clear parameter table
+		iContentDispositionParams->Reset();
+		}
+	
+	return *iContentDispositionParams;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::GetMRInfo
+// -----------------------------------------------------------------------------
+EXPORT_C MMRInfoObject& CFSMailMessagePart::GetMRInfo()
+{
+    FUNC_LOG;
+	return *iMeetingRequest;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::IsMRInfoSet
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CFSMailMessagePart::IsMRInfoSet()
+{
+    FUNC_LOG;
+	if(iMeetingRequest)
+		{
+		return ETrue;
+		}
+	else
+		{
+		return EFalse;
+		}
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetMRInfo
+// -----------------------------------------------------------------------------	
+EXPORT_C void CFSMailMessagePart::SetMRInfo(MMRInfoObject* aMeetingRequest)
+{
+    FUNC_LOG;
+	if(iMeetingRequest)
+	{
+		delete iMeetingRequest;
+	}
+	iMeetingRequest = aMeetingRequest;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SaveL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SaveL()
+	{
+    FUNC_LOG;
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		plugin->StoreMessagePartL( GetMailBoxId(), GetFolderId(), GetMessageId(), *this );		
+		}
+	}
+
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetAttachmentNameL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetAttachmentNameL(const TDesC& aFilePath)
+	{
+    FUNC_LOG;
+	    // Parse file name in case full path is given
+		TPtrC name;
+		for(TInt i=0;i<aFilePath.Length();)
+			{
+			name.Set(aFilePath.Mid(i,(aFilePath.Length()-i)));
+			TInt skip = name.Locate(KPathDelimiter);
+			if(skip < 0) break;
+			else i += skip + 1;
+			}
+			
+	    // Set Content-Type param "name" = filename
+	    TUint length =  KFSMailContentTypeParamName.iTypeLength + name.Length() + 5;
+	    if(iContentType)
+	    	{
+	    	length += iContentType->Des().Length();
+	    	}
+
+	    HBufC* buffer = HBufC::NewL(length);
+	    if(iContentType)
+	    	{
+		    buffer->Des().Append(*iContentType);
+	    	}
+	    buffer->Des().Append(_L("; "));
+	    buffer->Des().Append(KFSMailContentTypeParamName);
+	    buffer->Des().Append('"');
+	    buffer->Des().Append(name);
+	    buffer->Des().Append('"');
+
+		// remove old value
+	    if(iContentType)
+	    	{
+		    delete iContentType;    	
+	    	}
+		iContentType = buffer;
+			    
+	    // Set Content-Disposition as "attachment" and
+	    // Content-Disposition param "filename" = filename and
+		// remove old value
+	    if(iContentDisposition)
+	    	{
+		    delete iContentDisposition;    	
+			iContentDisposition = NULL;
+	    	}
+	    length = KFSMailContentDispAttachment.iTypeLength +
+	    KFSMailContentDispParamFilename.iTypeLength + name.Length() + 4;
+		iContentDisposition = HBufC::NewL(length);
+		iContentDisposition->Des().Append(KFSMailContentDispAttachment);
+	    iContentDisposition->Des().Append(_L("; "));
+		iContentDisposition->Des().Append(KFSMailContentDispParamFilename);
+	    iContentDisposition->Des().Append('"');
+		iContentDisposition->Des().Append(name);
+	    iContentDisposition->Des().Append('"');
+
+		// set content description
+		// remove old value
+		if(iContentDescription)
+			{
+			delete iContentDescription;
+			iContentDescription = NULL;
+			}
+		iContentDescription = HBufC::NewL(name.Length());
+		iContentDescription->Des().Append(name);
+		
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::AttachmentNameL
+// -----------------------------------------------------------------------------
+EXPORT_C TDesC& CFSMailMessagePart::AttachmentNameL()
+	{
+    FUNC_LOG;
+	    // Look first from Content-Type param "name"
+	    TInt ptr = iContentType->Find(KFSMailContentTypeParamName);
+	    if(ptr >= 0)
+	    	{
+			ptr = iContentType->Locate('=');
+			TInt length = iContentType->Length()-ptr-3;
+	    	TPtrC name = iContentType->Mid((ptr+2),length);
+	    	if(iAttachmentName)
+	    		{
+	    		delete iAttachmentName;
+	    		iAttachmentName = NULL;
+	    		}
+	    	iAttachmentName = HBufC::New(name.Length());
+	    	iAttachmentName->Des().Copy(name);
+	    	return *iAttachmentName;
+	    	}
+	    // then if Content-Disposition is "attachment" look from Content-Disposition param "filename" and
+		ptr = iContentDisposition->Find(KFSMailContentDispAttachment);
+		if(ptr >= 0)
+			{
+			ptr = iContentDisposition->Find(KFSMailContentDispParamFilename);
+			if(ptr > 0)
+				{
+				ptr = iContentDisposition->Locate('=');
+				TInt length = iContentDisposition->Length()-ptr-3;
+		    	TPtrC name = iContentDisposition->Mid(ptr+2,length);
+	    		if(iAttachmentName)
+	    		{
+	    			delete iAttachmentName;
+	    			iAttachmentName = NULL;
+	    		}
+		    	iAttachmentName = HBufC::New(name.Length());
+		    	iAttachmentName->Des().Copy(name);
+	    		return *iAttachmentName;
+				}
+			}
+	    // finally look if there is Content-Description.
+    	return *iContentDescription;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::FindBodyPartL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::FindBodyPartL(const TDesC& aContentType)
+{
+    FUNC_LOG;
+
+	TBuf<KMaxDataTypeLength> ptr;
+	if ( iContentType )
+    {
+		ptr.Copy(iContentType->Des());
+		TInt length = ptr.Locate(';');
+		if(length >= 0)
+			{
+			ptr.SetLength(length);
+			}
+		
+		if( !ptr.CompareF(aContentType) )
+		{
+			return this;
+		}
+    }
+
+	CFSMailMessagePart* messagePart = NULL;	
+
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
+		{
+		if(iReadMessageParts)
+			{
+			plugin->ChildPartsL(GetMailBoxId(),GetFolderId(),GetMessageId(),GetPartId(),iMessageParts);	
+			iReadMessageParts = EFalse;
+			}
+		if(iMessageParts.Count())
+		{
+			if( !ptr.CompareF(KFSMailContentTypeMultipartAlternative) )
+			{
+				// multipart / alternative
+				for(TInt i=0;i<iMessageParts.Count();i++)
+				{
+					ptr.Copy(iMessageParts[i]->GetContentType());
+					TInt length = ptr.Locate(';');
+					if(length >= 0)
+					{
+						ptr.SetLength(length);
+					}
+					if(!ptr.CompareF(aContentType) )
+					{
+						messagePart = iMessageParts[i];
+						// remove part from table
+						iMessageParts.Remove(i);
+						break;
+					}
+					else if(!ptr.CompareF(KFSMailContentTypeMultipartRelated) ||
+					   	 	!ptr.CompareF(KFSMailContentTypeMultipartMixed) ||
+							!ptr.CompareF(KFSMailContentTypeMultipartAlternative) ||
+							!ptr.CompareF(KFSMailContentTypeMultipartDigest) ||
+							!ptr.CompareF(KFSMailContentTypeMultipartParallel))
+					{
+						// multipart, check child parts
+						messagePart = iMessageParts[i];
+						// remove part from table
+						messagePart = messagePart->FindBodyPartL(aContentType);
+						if(messagePart && messagePart->GetPartId() == iMessageParts[0]->GetPartId())
+							{
+							iMessageParts.Remove(i);
+							}
+						break;
+					}					
+				}
+			}
+			else
+			{
+				// all other cases
+				messagePart = iMessageParts[0];
+				// remove part from table
+				messagePart = messagePart->FindBodyPartL(aContentType);
+				if(messagePart && messagePart->GetPartId() == iMessageParts[0]->GetPartId())
+					{
+					iMessageParts.Remove(0);
+					}
+			}
+		}
+	}
+    return messagePart;
+}
+
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ContentTypeMatches
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CFSMailMessagePart::ContentTypeMatches( const TDesC& aContentType )
+{
+    FUNC_LOG;
+
+	TBuf<KMaxDataTypeLength> ptr;
+	TBool result(EFalse);
+	if ( iContentType )
+    {
+		ptr.Copy(iContentType->Des());
+		TInt length = ptr.Locate(';');
+		if(length >= 0)
+			{
+			ptr.SetLength(length);
+			}
+		
+		if( !ptr.CompareF(aContentType) ) // case-insensitive comparision
+		{
+			result = ETrue;
+		}
+    }
+
+    return result;
+}
+
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::AppendAttachmentsL
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::AppendAttachmentsL(
+    RPointerArray<CFSMailMessagePart>& aParts)
+    {
+    FUNC_LOG;
+    CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetMessageId() );
+    if ( plugin )
+        {
+        RPointerArray<CFSMailMessagePart> messageParts;
+        CleanupResetAndDestroyPushL( messageParts );
+        plugin->ChildPartsL( GetMailBoxId(), GetFolderId(),
+                GetMessageId(), GetPartId(), messageParts );	
+
+        const TInt messagePartCount = messageParts.Count();
+        for ( TInt i = 0; i < messagePartCount; i++ )
+            {
+            const TDesC& contentType = messageParts[i]->GetContentType();
+            if (!contentType.CompareF(KFSMailContentTypeMultipartMixed) ||
+                !contentType.CompareF(KFSMailContentTypeMultipartAlternative) ||
+                !contentType.CompareF(KFSMailContentTypeMultipartDigest) ||
+                !contentType.CompareF(KFSMailContentTypeMultipartRelated) ||
+                !contentType.CompareF(KFSMailContentTypeMultipartParallel))
+                {
+                // get multipart message subparts
+                messageParts[i]->AppendAttachmentsL( aParts );
+                }
+            else
+                {
+                aParts.AppendL( messageParts[i] );
+                messageParts[i] = NULL;
+                }
+            }
+        CleanupStack::PopAndDestroy( &messageParts );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::FetchedContentSize
+// -----------------------------------------------------------------------------
+EXPORT_C TUint CFSMailMessagePart::FetchedContentSize() const
+	{
+    FUNC_LOG;
+	return iFetchedContentSize;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetFetchedContentSize
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetFetchedContentSize(TUint aContentSize)
+	{
+    FUNC_LOG;
+	iFetchedContentSize = aContentSize;	
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::FetchLoadState
+// -----------------------------------------------------------------------------
+EXPORT_C TFSPartFetchState CFSMailMessagePart::FetchLoadState() const
+	{
+    FUNC_LOG;
+
+	 if(iMessagePartsStatus != EFSDefault)
+		{
+		return iMessagePartsStatus;
+		}
+     else if(iContentSize == 0)
+     	{
+     	return EFSFull;     	
+     	}
+     else if(iFetchedContentSize == 0)
+     	{
+     	return EFSNone;
+     	}
+     else if (iFetchedContentSize < iContentSize)
+     	{
+     	return EFSPartial;
+     	}
+     else
+     	{
+     	return EFSFull;
+     	}
+	}
+	
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::FetchMessagePartL
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CFSMailMessagePart::FetchMessagePartL( 	const TFSMailMsgId /*aMessagePartId*/,
+        										  		MFSMailRequestObserver& aOperationObserver,
+        												const TUint aPreferredByteCount)
+    {
+    FUNC_LOG;
+    
+	TInt requestId(0);
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		
+	    RArray<TFSMailMsgId> messageList;
+    	messageList.Append(GetPartId());
+		
+	    // init async request
+	    TFSPendingRequest request = iRequestHandler->InitAsyncRequestL(	GetPartId().PluginId(),
+	    															  	aOperationObserver);
+
+	    requestId = request.iRequestId;
+    	MFSMailRequestObserver* observer = request.iObserver;
+
+		// fetch message parts
+	    TRAPD(err,plugin->FetchMessagePartsL(	GetMailBoxId(),
+	    										GetFolderId(),
+	    										GetMessageId(),
+	        									messageList,
+	        									*observer,
+	        									requestId,
+	        									aPreferredByteCount ));
+	    messageList.Reset();
+	    if(err != KErrNone)
+			{
+			iRequestHandler->CompleteRequest(requestId);
+			User::Leave(err);
+			}
+		}
+	return requestId;
+    }
+    
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::FetchMessagesPartsL
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CFSMailMessagePart::FetchMessagesPartsL( 
+									const RArray<TFSMailMsgId>& aMessagePartIds,
+        							MFSMailRequestObserver& aOperationObserver,
+        							const TUint aPreferredByteCount)
+    {
+    FUNC_LOG;
+
+	TInt requestId(0);
+    
+	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetPartId()))
+		{
+		
+	    // get async request id
+	    TFSPendingRequest request = 
+	    iRequestHandler->InitAsyncRequestL(	GetPartId().PluginId(),
+	    								 	aOperationObserver);
+	    								 	
+	    requestId = request.iRequestId;
+    	MFSMailRequestObserver* observer = request.iObserver;
+	    
+	    // fetch message parts
+	    TRAPD(err,plugin->FetchMessagePartsL( 	GetMailBoxId(),
+	    										GetFolderId(),
+	    										GetMessageId(),
+	        									aMessagePartIds,
+												*observer,
+	        									requestId,
+	        									aPreferredByteCount ));
+	            
+	    if(err != KErrNone)
+			{
+			iRequestHandler->CompleteRequest(requestId);
+			User::Leave(err);
+			}
+		}
+	else
+	    {
+        User::Leave(KErrArgument);
+	    }
+    return requestId;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetMessagePartsStatus
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetMessagePartsStatus(TFSPartFetchState aMessagePartStatus)
+	{
+    FUNC_LOG;
+	iMessagePartsStatus = aMessagePartStatus;
+	}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::AddNewAttachmentL
+// -----------------------------------------------------------------------------
+EXPORT_C CFSMailMessagePart* CFSMailMessagePart::AddNewAttachmentL(	const TDesC& aFilePath,
+																const TFSMailMsgId /*aInsertBefore*/,
+																const TDesC& aContentType )
+    {
+    FUNC_LOG;
+    CFSMailMessagePart* newPart = NULL;
+
+    CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetMessageId() );
+    if ( plugin )
+        {
+        newPart = plugin->NewChildPartFromFileL( GetMailBoxId(),
+            GetFolderId(),
+            GetMessageId(),
+            GetPartId(),
+            aContentType, //contentType,
+            aFilePath );
+
+        CleanupStack::PushL( newPart );
+        
+        // Set attachment name
+        newPart->SetAttachmentNameL( aFilePath );
+
+        // save message part
+        newPart->SaveL();
+        
+        CleanupStack::Pop( newPart );
+        }
+
+    return newPart;
+    }
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::ReadOnlyPartSize
+// -----------------------------------------------------------------------------
+EXPORT_C TUint CFSMailMessagePart::ReadOnlyPartSize() const
+{
+    FUNC_LOG;
+    return iReadOnlyPartSize;
+}
+
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::SetReadOnlyPartSize
+// -----------------------------------------------------------------------------
+EXPORT_C void CFSMailMessagePart::SetReadOnlyPartSize(const TUint aReadOnlyPartSize)
+{
+    FUNC_LOG;
+    iReadOnlyPartSize = aReadOnlyPartSize;
+}
+// -----------------------------------------------------------------------------
+// CFSMailMessagePart::DoAttachmentListL
+// -----------------------------------------------------------------------------
+void CFSMailMessagePart::DoAttachmentListL( RPointerArray<CFSMailMessagePart>& /*aParts*/ )
+{
+    FUNC_LOG;
+
+}
+