diff -r e7aa27f58ae1 -r 578830873419 emailservices/emailcommon/src/CFSMailMessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailcommon/src/CFSMailMessage.cpp Fri Apr 16 14:51:52 2010 +0300 @@ -0,0 +1,485 @@ +/* +* Copyright (c) 2007-2008 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 object +* +*/ + +#include +#include "emailtrace.h" +#include +#include +#include // CleanupResetAndDestroy + +// +#include "CFSMailMessage.h" +#include "CFSMailPlugin.h" +// +#include "CFSMailRequestHandler.h" +#include "CFSMailRequestObserver.h" + +// +#include "nmmessage.h" +// + +// ================= MEMBER FUNCTIONS ========================================== + +// ----------------------------------------------------------------------------- +// CFSMailMessage::NewLC +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage * CFSMailMessage::NewLC( TFSMailMsgId aMessageId ) +{ + FUNC_LOG; + CFSMailMessage* message = new (ELeave) CFSMailMessage(); + CleanupStack:: PushL(message); + message->ConstructL( aMessageId ); + return message; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::NewL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage * CFSMailMessage::NewL( TFSMailMsgId aMessageId ) +{ + FUNC_LOG; + CFSMailMessage* message = CFSMailMessage::NewLC(aMessageId); + CleanupStack:: Pop(message); + return message; +} + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::NewL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage* CFSMailMessage::NewL( const NmMessage &aMessage ) +{ + FUNC_LOG; + CFSMailMessage* self = new (ELeave) CFSMailMessage(); + CleanupStack::PushL(self); + self->ConstructL(aMessage); + CleanupStack::Pop(self); + return self; +} +// + +// ----------------------------------------------------------------------------- +// CFSMailMessage::ConstructL +// ----------------------------------------------------------------------------- +void CFSMailMessage::ConstructL( TFSMailMsgId aMessageId ) +{ + FUNC_LOG; + // Base class initialization + CFSMailMessagePart::ConstructL( aMessageId, TFSMailMsgId() ); +} + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::ConstructL +// ----------------------------------------------------------------------------- +void CFSMailMessage::ConstructL( const NmMessage &aMessage ) +{ + FUNC_LOG; + // Base class initialization + + CFSMailMessagePart::ConstructL( aMessage, aMessage.envelope() ); +} +// + +// ----------------------------------------------------------------------------- +// CFSMailMessage::CFSMailMessage +// ----------------------------------------------------------------------------- +CFSMailMessage::CFSMailMessage() +{ + FUNC_LOG; + // set request handler pointer + iRequestHandler = static_cast(Dll::Tls()); +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::~CFSMailMessage +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage::~CFSMailMessage() +{ + FUNC_LOG; + iMessageBufferForAsyncOp.Reset(); +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::SaveMessageL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailMessage::SaveMessageL() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId())) + { + plugin->StoreMessageL(GetMailBoxId(),*this); + } +} + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::SaveMessageL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailMessage::SaveMessageL( MFSMailRequestObserver& aOperationObserver ) +{ + FUNC_LOG; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()); + TFSPendingRequest request = iRequestHandler->InitAsyncRequestL( + GetMessageId().PluginId(), aOperationObserver); + MFSMailRequestObserver* observer = request.iObserver; + if (plugin) + { + iMessageBufferForAsyncOp.Reset(); + iMessageBufferForAsyncOp.AppendL(this); + // It saves only message header - notice that iMessageBufferForAsyncOp ownership is not transferred + // to plugin - array contains 'self' pointer so it should not be destroy by plugin + plugin->StoreMessagesL(GetMailBoxId(), iMessageBufferForAsyncOp, + *observer, request.iRequestId); + } + + return request.iRequestId; +} +// + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::SaveMessagePartsL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailMessage::SaveMessagePartsL( MFSMailRequestObserver& aOperationObserver ) +{ + FUNC_LOG; + + RPointerArray messageParts; + CleanupResetAndDestroyPushL(messageParts); + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()); + TFSPendingRequest request = iRequestHandler->InitAsyncRequestL( + GetMessageId().PluginId(), aOperationObserver); + MFSMailRequestObserver* observer = request.iObserver; + + //Message part storer can be used to store attachements as well + //AttachmentListL(messageParts); + + CFSMailMessagePart *plainTextPart = PlainTextBodyPartL(EDataSourceLocal); + if (plainTextPart) + { + messageParts.AppendL(plainTextPart); + } + CFSMailMessagePart *htmlPart = HtmlBodyPartL(EDataSourceLocal); + if (htmlPart) + { + messageParts.AppendL(htmlPart); + } + + if (plugin) + { + // Ownership of parts array is transferred to plugin - it will take care about reseting them + plugin->StoreMessagePartsL(messageParts, *observer, + request.iRequestId); + // message parts array removed from CleanupStack (not destroyed) + CleanupStack::Pop(1, &messageParts); + } + else + { + // message parts array removed from CleanupStack and destroyed + CleanupStack::PopAndDestroy(1, &messageParts); + } + + return request.iRequestId; +} +// + +// ----------------------------------------------------------------------------- +// CFSMailMessage::AddNewAttachmentL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL( RFile& aFile, + const TDesC8& aMimeType ) +{ + FUNC_LOG; + + CFSMailMessagePart* newPart = NULL; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId())) + { + TBuf contentType; + if(aMimeType.Length() > 0) + { + // use user given content type + contentType.Copy(aMimeType); + } + else + { + // try to find out content type using recognizers + RApaLsSession apaSession; + TDataRecognitionResult dataType; + User::LeaveIfError(apaSession.Connect()); + User::LeaveIfError(apaSession.RecognizeData(aFile, dataType)); + apaSession.Close(); + contentType.Copy(dataType.iDataType.Des()); + } + + // get file name + TFileName fileName; + aFile.FullName( fileName ); + + // get new part from plugin + newPart = plugin->NewChildPartFromFileL( GetMailBoxId(), + GetFolderId(), + GetMessageId(), + GetPartId(), + contentType, + aFile ); + // set attachment name + newPart->SetAttachmentNameL(fileName); + + // store new message part + newPart->SaveL(); + + // set flag + SetFlag(EFSMsgFlag_Attachments); + } + return newPart; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::AddNewAttachmentL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL( const TDesC& aFilePath, + const TFSMailMsgId /*aInsertBefore*/ ) +{ + FUNC_LOG; + + CFSMailMessagePart* newPart = NULL; + + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId())) + { + // use recognizer to find out ContentType + RApaLsSession apaSession; + TDataRecognitionResult dataType; + TBufC8 buf; + User::LeaveIfError(apaSession.Connect()); + User::LeaveIfError(apaSession.RecognizeData(aFilePath, buf, dataType)); + apaSession.Close(); + + // Create new message part with correct Content-Type + TBuf contentType; + contentType.Copy(dataType.iDataType.Des()); + newPart = plugin->NewChildPartFromFileL( GetMailBoxId(), + GetFolderId(), + GetMessageId(), + GetPartId(), + contentType, + aFilePath ); + + + // Set attachment name + newPart->SetAttachmentNameL(aFilePath); + + // store message part + newPart->SaveL(); + + // set flag + SetFlag(EFSMsgFlag_Attachments); + } + return newPart; +} + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::AddNewAttachmentL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailMessage::AddNewAttachmentL( const TDesC& aFilePath, + MFSMailRequestObserver& aOperationObserver) +{ + FUNC_LOG; + TFSPendingRequest request; + + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId())) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetMessageId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + // use recognizer to find out ContentType + RApaLsSession apaSession; + TDataRecognitionResult dataType; + TBufC8 buf; + User::LeaveIfError(apaSession.Connect()); + User::LeaveIfError(apaSession.RecognizeData(aFilePath, buf, dataType)); + apaSession.Close(); + + // Create new message part with correct Content-Type + TBuf contentType; + contentType.Copy(dataType.iDataType.Des()); + + TRAPD( err, plugin->NewChildPartFromFileL( + GetMailBoxId(), + GetFolderId(), + GetMessageId(), + GetPartId(), + contentType, + aFilePath, + *observer, + request.iRequestId) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; +} +// + +// ----------------------------------------------------------------------------- +// CFSMailMessage::AttachmentListL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailMessage::AttachmentListL( + RPointerArray& aParts ) +{ + FUNC_LOG; + // First list all message parts + AppendAttachmentsL( aParts ); + + // special case, if single part content type is not given, + // default type is text/plain + if ( aParts.Count() == 1 && aParts[0]->GetContentType().Length() == 0) + { + aParts.ResetAndDestroy(); + } + else + { + // find plain text body part from the list + CFSMailMessagePart* txtPart = FindBodyPartL(KFSMailContentTypeTextPlain); + CleanupStack::PushL( txtPart ); + if ( txtPart ) + { + // remove plain text body part from attachment list + for ( TInt ii = aParts.Count() - 1; ii >= 0; --ii ) + { + if ( aParts[ii]->GetPartId() == txtPart->GetPartId() ) + { + delete aParts[ii]; + aParts.Remove(ii); + break; + } + } + } + CleanupStack::PopAndDestroy( txtPart ); + + // find html body part from the list + CFSMailMessagePart* htmlPart = FindBodyPartL(KFSMailContentTypeTextHtml); + CleanupStack::PushL( htmlPart ); + if ( htmlPart ) + { + // remove html body part from attachment list + for ( TInt ii = aParts.Count() - 1; ii >= 0; --ii ) + { + if ( aParts[ii]->GetPartId() == htmlPart->GetPartId() ) + { + delete aParts[ii]; + aParts.Remove(ii); + break; + } + } + } + CleanupStack::PopAndDestroy( htmlPart ); + } + + iMessageParts.ResetAndDestroy(); + iReadMessageParts = ETrue; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::PlainTextBodyPartL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessagePart* CFSMailMessage::PlainTextBodyPartL( + TFSMailMessagePartDataSource aDataSource) +{ + FUNC_LOG; + CFSMailMessagePart* part = FindBodyPartL(KFSMailContentTypeTextPlain, aDataSource); + + // special case, single part content type is not given + // + if(!part && iMessageParts.Count() == 1 && iMessageParts[0]->GetContentType().Length() == 0) + // + { + part = iMessageParts[0]; + iMessageParts.Remove(0); + } + iMessageParts.ResetAndDestroy(); + iReadMessageParts = ETrue; + return part; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::HtmlBodyPartL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessagePart* CFSMailMessage::HtmlBodyPartL( + TFSMailMessagePartDataSource aDataSource) +{ + FUNC_LOG; + CFSMailMessagePart* part = FindBodyPartL(KFSMailContentTypeTextHtml, aDataSource); + iMessageParts.ResetAndDestroy(); + iReadMessageParts = ETrue; + return part; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::IsMessageL +// ----------------------------------------------------------------------------- +EXPORT_C TBool CFSMailMessage::IsMessageL() const +{ + FUNC_LOG; + return CFSMailMessagePart::IsMessageL(); + } + +// ----------------------------------------------------------------------------- +// CFSMailMessage::ContentTypeParameters() +// ----------------------------------------------------------------------------- +CDesCArray& CFSMailMessage::ContentTypeParameters() +{ + FUNC_LOG; + CDesCArray* faked = NULL; + return *faked; +} + +// ----------------------------------------------------------------------------- +// CFSMailMessage::DoAttachmentListL +// ----------------------------------------------------------------------------- +void CFSMailMessage::DoAttachmentListL( RPointerArray& aParts ) +{ + FUNC_LOG; + AttachmentListL(aParts); +} + +// +// ----------------------------------------------------------------------------- +// CFSMailMessage::GetNmMessage +// It does not fill the list of child parts +// ----------------------------------------------------------------------------- +EXPORT_C NmMessage* CFSMailMessage::GetNmMessage() +{ + NmMessage* message = new NmMessage(iNmPrivateMessagePart); + message->setEnvelope(iNmPrivateMessageEnvelope); + return message; +} +//