diff -r 000000000000 -r 8466d47a6819 emailservices/emailstore/message_store/client/src/MsgStoreMessagePart.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailstore/message_store/client/src/MsgStoreMessagePart.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,333 @@ +/* +* Copyright (c) 2006 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: Message store multipart message client support implementation. +* +*/ + + + +// +#include "MsgStoreMessagePart.h" +#include "MsgStorePropertyKeys.h" +// +#include "MsgStoreSessionContext.h" +#include "RMessageStoreSession.h" +#include "MessageStoreClientServer.h" +#include "MsgStoreMessage.h" + +//_LIT( KTextPlain, "text/plain" ); +//_LIT( KTextHTML, "text/html" ); +_LIT(KFSMailContentTypeMultipartAlternative, "multipart/alternative"); + + +// ======================== +// CLASS: TPartsArray +// ======================== +class TPartsArray : public MPropertiesArray + { + public: + + // ============== + // PUBLIC METHODS + // ============== + + TPartsArray( CMsgStoreSessionContext& aContext, TMsgStoreId aMailBoxId, RPointerArray& aParts ); + + // inherited from MPropertiesArray + virtual void AddElementL( TMsgStoreId aId, TMsgStoreId aParentId, const TDesC8& aProperties ); + virtual void Reset(); + + private: + + // ================== + // PRIVATE ATTRIBUTES + // ================== + + CMsgStoreSessionContext& iContext; + TMsgStoreId iMailBoxId; + RPointerArray& iParts; + + }; // end class TPartsArray + + +// ========================================================================== +// FUNCTION: Constructor +// ========================================================================== +TPartsArray::TPartsArray( CMsgStoreSessionContext& aContext, TMsgStoreId aMailBoxId, RPointerArray& aParts ) : + iContext( aContext ), iMailBoxId( aMailBoxId ), iParts( aParts ) + { + } // end constructor + +// ========================================================================== +// FUNCTION: AddElementL +// ========================================================================== +void TPartsArray::AddElementL( TMsgStoreId aId, TMsgStoreId aParentId, const TDesC8& aProperties ) + { + CMsgStoreMessagePart *newPart = CMsgStoreMessagePart::NewL( iContext, aId, aParentId, iMailBoxId, aProperties ); + CleanupStack::PushL( newPart ); + + iParts.AppendL( newPart ); + + CleanupStack::Pop( newPart ); + } // end AddElementL + +// ========================================================================== +// FUNCTION: Reset +// ========================================================================== +void TPartsArray::Reset() + { + iParts.ResetAndDestroy(); + } // end Reset + + +/** Adds a child part to this part + + /param aProperties the headers of the newly added part + /note This method leaves with KErrNotSupported if it is NOT multi-part, i.e. this part + already has content. + */ +EXPORT_C CMsgStoreMessagePart* CMsgStoreMessagePart::AddChildPartL( const CMsgStorePropertyContainer& aProperties, + const TDesC& aContentFilename ) + { + RBuf8 serializedProperties; + CleanupClosePushL( serializedProperties ); + aProperties.SerializeL( serializedProperties ); + + TInt partId = iContext.iSession.CreateContainerL( Id(), + KMsgStoreInvalidId, //do not check grand parent id + iMailBoxId, + EMsgStorePartBits, + serializedProperties, + ETrue, + aContentFilename ); + + CMsgStoreMessagePart* part = CMsgStoreMessagePart::NewL( iContext, partId, Id(), iMailBoxId, serializedProperties ); + + CleanupStack::PopAndDestroy( &serializedProperties ); + + return part; + } + + +/** Adds a child part to this part and set the content to the same content stored in the input file handle + + /param aProperties the headers of the newly added part + /param aFile file handle that contains the content. + /note This method leaves with KErrNotSupported if it is NOT multi-part, i.e. this part + already has content. + */ +EXPORT_C CMsgStoreMessagePart* CMsgStoreMessagePart::AddChildPartL( const CMsgStorePropertyContainer& aProperties, + RFile& aFile ) + { + RBuf8 serializedProperties; + serializedProperties.CleanupClosePushL(); + aProperties.SerializeL( serializedProperties ); + + TInt partId = iContext.iSession.CreateContainerL( Id(), + KMsgStoreInvalidId, //do not check grand parent id + iMailBoxId, + EMsgStorePartBits, + serializedProperties, + ETrue, + aFile ); + + CMsgStoreMessagePart* part = CMsgStoreMessagePart::NewL( iContext, partId, Id(), iMailBoxId, serializedProperties ); + + CleanupStack::PopAndDestroy( &serializedProperties ); + + return part; + } + + +/** Adds an existing part to the child + + /param aPart already created child part + /note This method leaves with KErrNotSupported if it is NOT multi-part, i.e. this part + already has content. + */ + +EXPORT_C CMsgStoreMessage* CMsgStoreMessagePart::AddChildMessageL( CMsgStorePropertyContainer& aProperties ) + { + aProperties.AddOrUpdatePropertyL( KMsgStorePropertyIsEmbeddedMsg, ETrue ); + + return static_cast( AddChildPartL( aProperties ) ); + } + + +/** Copies an attachment from one message to another message. + + This function copies an an attachment, including the properties and content, from one + message to another message. This function will leave with KErrNotFound if the specified + message is not found in the source folder or if the destination message is not found in + the destination folder. + + KMsgStoreInvalidId may be passed for the destination folder ID if there is no desire to + check the source folder. + + ECapabilityWriteUserData is required to use this function. + + \retval Returns the ID of the new message. + + \note Only works if the store is in an authenticated state, otherwise this function leaves + with KErrNotReady. +*/ +EXPORT_C TMsgStoreId CMsgStoreMessagePart::CopyChildPartL( TMsgStoreId aPartId, TMsgStoreId aNewParentId ) + { + iContext.VerifyTypeL( aPartId, EMsgStorePartBits ); + //new parent can be a message or a part + iContext.VerifyTypeL( aNewParentId, EMsgStoreMessageBits, EMsgStorePartBits ); + + return iContext.iSession.CopyContainerL( aPartId, + Id(), + KMsgStoreInvalidId, //don't care + aNewParentId, + KMsgStoreInvalidId, //don't care + iMailBoxId); + } // end CopyMessageL + + +/** Removes a child part from this part + + /note This method leaves with KErrNotSupported if it is NOT multi-part. + */ +EXPORT_C void CMsgStoreMessagePart::RemoveChildPartL( TMsgStoreId aPartId, TBool aRecursive ) + { + iContext.VerifyTypeL( aPartId, EMsgStorePartBits ); + + TMsgStoreId parentId = ( aRecursive ? KMsgStoreInvalidId : Id() ); + + iContext.iSession.DeleteContainerL( aPartId, parentId, KMsgStoreInvalidId, iMailBoxId ); + } + +/** gets a child part fo this part + /note This method leaves with KErrNotSupported if it is NOT multi-part. + */ +EXPORT_C CMsgStoreMessagePart* CMsgStoreMessagePart::ChildPartL( TMsgStoreId aPartId, TBool aRecursive ) + { + iContext.VerifyTypeL( aPartId, EMsgStorePartBits ); + + TMsgStoreId parentId = ( aRecursive ? KMsgStoreInvalidId : Id() ); + + RBuf8 propertiesBuf; + CleanupClosePushL( propertiesBuf ); + + iContext.iSession.ContainerPropertiesL( aPartId, parentId, KMsgStoreInvalidId, propertiesBuf ); + + if ( !aRecursive && parentId != Id() ) + { + //the part may have been moved, so it is no longer a child of this part + User::Leave( KErrNotFound ); + } + + CMsgStoreMessagePart* part = CMsgStoreMessagePart::NewL( iContext, aPartId, parentId, iMailBoxId, propertiesBuf ); + + CleanupStack::PopAndDestroy( &propertiesBuf ); + + return part; + } + +/** list all the child part to this part + /note This method leaves with KErrNotSupported if it is NOT multi-part. +*/ +EXPORT_C void CMsgStoreMessagePart::ChildPartsL( RPointerArray& aParts ) +{ + + TPartsArray partsArray( iContext, iMailBoxId, aParts ); + + iContext.iSession.ChildrenPropertiesL( iId, // aId + iParentId, // aParentId + EMsgStorePartBits, // aContainerType + EFalse, // aQuickProperties + EFalse, // aRecursive + partsArray ); + + // make sure body come before attachments + TInt count = aParts.Count(); + if ( count > 1 ) + { + for ( TInt i = 0 ; i < count; i++ ) + { + CMsgStoreMessagePart* part = aParts[i]; + TUint index = 0; + if ( part->FindProperty( KMsgStorePropertyContentType, index ) ) + { + const TDesC& contentType = part->PropertyValueDesL( index ); + if ( contentType == KFSMailContentTypeMultipartAlternative ) + { + if( i > 0 ) + { + //body is not the first child, move it to the first place + aParts.Remove(i); + aParts.Insert( part, 0 ); + } + break; + } + } + } + } +} + +EXPORT_C TBool CMsgStoreMessagePart::IsEmbeddedMessageL() + { + + TUint index; + TBool isEmbeddedMsg = EFalse; + + if ( FindProperty( KMsgStorePropertyIsEmbeddedMsg, index ) ) + { + isEmbeddedMsg = PropertyValueBoolL( index ); + } + + return isEmbeddedMsg; + + } + + +CMsgStoreMessagePart* CMsgStoreMessagePart::NewL( CMsgStoreSessionContext& aSessionContext, + TMsgStoreId aId, + TMsgStoreId aParentId, + TMsgStoreId aMailBoxId, + const TDesC8& aPropertiesBuf ) + { + CMsgStoreMessagePart* self = new( ELeave ) CMsgStoreMessagePart( aSessionContext, aId, aParentId, aMailBoxId ); + CleanupStack::PushL( self ); + self->ConstructL( aPropertiesBuf ); + + //check if the flag is embedded message exists + if ( self->IsEmbeddedMessageL() ) + { + CleanupStack::PopAndDestroy( self ); + //create an instance of embedded message + self = CMsgStoreMessage::NewL( aSessionContext, aId, aParentId, KMsgStoreInvalidId, aMailBoxId, aPropertiesBuf ); + } + else + { + CleanupStack::Pop( self ); + } + + return self; + } + +void CMsgStoreMessagePart::ConstructL( const TDesC8& aPropertiesBuf ) + { + DeserializeL( aPropertiesBuf ); + } + +CMsgStoreMessagePart::CMsgStoreMessagePart( CMsgStoreSessionContext& aSessionContext, TMsgStoreId aId, TMsgStoreId aParentId, TMsgStoreId aMailBoxId ) +: CMsgStorePropertyContainerWithContent( aSessionContext, aId, aParentId, aMailBoxId ) + { + } + + +