emailservices/emailcommon/src/CFSMailMessage.cpp
changeset 65 478bc57ad291
parent 30 759dc5235cdb
equal deleted inserted replaced
59:16ed8d08d0b1 65:478bc57ad291
     1 /*
     1 /*
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). 
     2 * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). 
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    40 // -----------------------------------------------------------------------------
    40 // -----------------------------------------------------------------------------
    41 EXPORT_C CFSMailMessage * CFSMailMessage::NewLC(TFSMailMsgId aMessageId)
    41 EXPORT_C CFSMailMessage * CFSMailMessage::NewLC(TFSMailMsgId aMessageId)
    42 {
    42 {
    43     NM_FUNCTION;
    43     NM_FUNCTION;
    44     
    44     
    45   	CFSMailMessage* message = new (ELeave) CFSMailMessage();
    45     CFSMailMessage* message = new (ELeave) CFSMailMessage();
    46   	CleanupStack:: PushL(message);
    46     CleanupStack:: PushL(message);
    47   	message->ConstructL( aMessageId );
    47     message->ConstructL( aMessageId );
    48   	return message;
    48     return message;
    49 } 
    49 } 
    50 
    50 
    51 // -----------------------------------------------------------------------------
    51 // -----------------------------------------------------------------------------
    52 // CFSMailMessage::NewL
    52 // CFSMailMessage::NewL
    53 // -----------------------------------------------------------------------------
    53 // -----------------------------------------------------------------------------
    54 EXPORT_C CFSMailMessage * CFSMailMessage::NewL(TFSMailMsgId aMessageId)
    54 EXPORT_C CFSMailMessage * CFSMailMessage::NewL(TFSMailMsgId aMessageId)
    55 {
    55 {
    56     NM_FUNCTION;
    56     NM_FUNCTION;
    57     
    57     
    58   	CFSMailMessage* message =  CFSMailMessage::NewLC(aMessageId);
    58     CFSMailMessage* message =  CFSMailMessage::NewLC(aMessageId);
    59   	CleanupStack:: Pop(message);
    59     CleanupStack:: Pop(message);
    60   	return message;
    60     return message;
    61 }
    61 }
    62 
    62 
    63 // <qmail>
    63 // <qmail>
    64 // -----------------------------------------------------------------------------
    64 // -----------------------------------------------------------------------------
    65 // CFSMailMessage::NewL
    65 // CFSMailMessage::NewL
   142 // -----------------------------------------------------------------------------
   142 // -----------------------------------------------------------------------------
   143 EXPORT_C TInt CFSMailMessage::SaveMessageL( MFSMailRequestObserver& aOperationObserver )
   143 EXPORT_C TInt CFSMailMessage::SaveMessageL( MFSMailRequestObserver& aOperationObserver )
   144 {
   144 {
   145     NM_FUNCTION;
   145     NM_FUNCTION;
   146 
   146 
   147     CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId());
   147     
   148     TFSPendingRequest request = iRequestHandler->InitAsyncRequestL(
   148 
   149             GetMessageId().PluginId(), aOperationObserver);
   149 
   150     MFSMailRequestObserver* observer = request.iObserver;
   150     TFSPendingRequest request;
   151     if (plugin)
   151     request.iRequestId = 0;
   152         {
   152     if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
       
   153         {
       
   154         request = iRequestHandler->InitAsyncRequestL(GetMessageId().PluginId(), 
       
   155                                                         aOperationObserver);
       
   156         MFSMailRequestObserver* observer = request.iObserver;
   153         iMessageBufferForAsyncOp.Reset();
   157         iMessageBufferForAsyncOp.Reset();
   154         iMessageBufferForAsyncOp.AppendL(this);
   158         iMessageBufferForAsyncOp.AppendL(this);
   155         // It saves only message header - notice that iMessageBufferForAsyncOp ownership is not transferred
   159         // It saves only message header - notice that iMessageBufferForAsyncOp ownership is not transferred
   156         // to plugin - array contains 'self' pointer so it should not be destroy by plugin
   160         // to plugin - array contains 'self' pointer so it should not be destroy by plugin
   157         plugin->StoreMessagesL(GetMailBoxId(), iMessageBufferForAsyncOp,
   161         TRAPD(err, plugin->StoreMessagesL(GetMailBoxId(), iMessageBufferForAsyncOp,
   158                 *observer, request.iRequestId);
   162                 *observer, request.iRequestId));
   159         }
   163         if(err != KErrNone)
   160 
   164             {
       
   165             iRequestHandler->CompleteRequest(request.iRequestId);
       
   166             User::Leave(err);
       
   167             }
       
   168         }
       
   169     else
       
   170         {
       
   171         User::Leave(KErrNotFound);
       
   172         }
   161     return request.iRequestId;
   173     return request.iRequestId;
   162 }
   174 }
   163 //</qmail>
   175 //</qmail>
   164 
   176 
   165 //<qmail>
   177 //<qmail>
   170 {
   182 {
   171     NM_FUNCTION;
   183     NM_FUNCTION;
   172 
   184 
   173     RPointerArray<CFSMailMessagePart> messageParts;
   185     RPointerArray<CFSMailMessagePart> messageParts;
   174     CleanupResetAndDestroyPushL(messageParts);
   186     CleanupResetAndDestroyPushL(messageParts);
   175 
   187     
   176     CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId());
       
   177     TFSPendingRequest request = iRequestHandler->InitAsyncRequestL(
       
   178             GetMessageId().PluginId(), aOperationObserver);
       
   179     MFSMailRequestObserver* observer = request.iObserver;
       
   180 
       
   181     //Message part storer can be used to store attachements as well
       
   182     //AttachmentListL(messageParts);
       
   183 
       
   184     CFSMailMessagePart *plainTextPart = PlainTextBodyPartL(EDataSourceLocal);
   188     CFSMailMessagePart *plainTextPart = PlainTextBodyPartL(EDataSourceLocal);
   185     if (plainTextPart)
   189     if (plainTextPart)
   186         {
   190         {
   187         messageParts.AppendL(plainTextPart);
   191         messageParts.AppendL(plainTextPart);
   188         }
   192         }
   189     CFSMailMessagePart *htmlPart = HtmlBodyPartL(EDataSourceLocal);
   193     CFSMailMessagePart *htmlPart = HtmlBodyPartL(EDataSourceLocal);
   190     if (htmlPart)
   194     if (htmlPart)
   191         {
   195         {
   192         messageParts.AppendL(htmlPart);
   196         messageParts.AppendL(htmlPart);
   193         }
   197         }
   194 
   198         
   195     if (plugin)
   199     TFSPendingRequest request;
   196         {
   200     request.iRequestId = 0;
       
   201     if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
       
   202         {
       
   203         request = iRequestHandler->InitAsyncRequestL(
       
   204                          GetMessageId().PluginId(), aOperationObserver);
       
   205         MFSMailRequestObserver* observer = request.iObserver;
   197         // Ownership of parts array is transferred to plugin - it will take care about reseting them
   206         // Ownership of parts array is transferred to plugin - it will take care about reseting them
   198         plugin->StoreMessagePartsL(messageParts, *observer,
   207         TRAPD(err, plugin->StoreMessagePartsL(messageParts, *observer,
   199                 request.iRequestId);
   208                 request.iRequestId));
       
   209         if(err != KErrNone)
       
   210             {
       
   211             iRequestHandler->CompleteRequest(request.iRequestId);
       
   212             User::Leave(err);
       
   213             }
   200         // message parts array removed from CleanupStack (not destroyed)
   214         // message parts array removed from CleanupStack (not destroyed)
   201         CleanupStack::Pop(1, &messageParts);
   215         CleanupStack::Pop(1, &messageParts);
   202         }
   216         }
   203     else
   217     else
   204         {
   218         {
   205         // message parts array removed from CleanupStack and destroyed
   219         // message parts array removed from CleanupStack and destroyed
   206         CleanupStack::PopAndDestroy(1, &messageParts);
   220         CleanupStack::PopAndDestroy(1, &messageParts);
       
   221         User::Leave(KErrNotFound);
   207         }
   222         }
   208 
   223 
   209     return request.iRequestId;
   224     return request.iRequestId;
   210 }
   225 }
   211 //<//qmail>
   226 //<//qmail>
   215 // -----------------------------------------------------------------------------
   230 // -----------------------------------------------------------------------------
   216 EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL( RFile& aFile,
   231 EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL( RFile& aFile,
   217                                                                 const TDesC8& aMimeType )
   232                                                                 const TDesC8& aMimeType )
   218     {
   233     {
   219     NM_FUNCTION;
   234     NM_FUNCTION;
   220     
   235     CFSMailMessagePart* newPart(NULL);
   221     CFSMailMessagePart* newPart = NULL;
       
   222     if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
   236     if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
   223         {
   237         {
   224         TBuf<KMaxDataTypeLength> contentType;
   238         TBuf<KMaxDataTypeLength> contentType;
   225         if(aMimeType.Length() > 0)
   239         if(aMimeType.Length() > 0)
   226             {
   240             {
   235             User::LeaveIfError(apaSession.Connect());
   249             User::LeaveIfError(apaSession.Connect());
   236             User::LeaveIfError(apaSession.RecognizeData(aFile, dataType));
   250             User::LeaveIfError(apaSession.RecognizeData(aFile, dataType));
   237             apaSession.Close();
   251             apaSession.Close();
   238             contentType.Copy(dataType.iDataType.Des());
   252             contentType.Copy(dataType.iDataType.Des());
   239             }
   253             }
   240         
       
   241         // get file name
   254         // get file name
   242         TFileName fileName;
   255         TFileName fileName;
   243         aFile.FullName( fileName );
   256         aFile.FullName( fileName );
   244 
       
   245         // get new part from plugin
   257         // get new part from plugin
   246         newPart = plugin->NewChildPartFromFileL(    GetMailBoxId(),
   258         newPart = plugin->NewChildPartFromFileL(    GetMailBoxId(),
   247                                                     GetFolderId(),
   259                                                     GetFolderId(),
   248                                                     GetMessageId(),
   260                                                     GetMessageId(),
   249                                                     GetPartId(),
   261                                                     GetPartId(),
   250                                                     contentType,
   262                                                     contentType,
   251                                                     aFile );
   263                                                     aFile );
   252         // set attachment name
   264         if (newPart)
   253         newPart->SetAttachmentNameL(fileName);
   265             {
   254 
   266             CleanupStack::PushL(newPart);
   255         // store new message part
   267             // set attachment name
   256         newPart->SaveL();
   268             newPart->SetAttachmentNameL(fileName);
   257         
   269             // store new message part
   258         // set flag
   270             newPart->SaveL();
   259         SetFlag(EFSMsgFlag_Attachments);
   271             // set flag
       
   272             SetFlag(EFSMsgFlag_Attachments);
       
   273             CleanupStack::Pop(newPart);
       
   274             }
   260         }
   275         }
   261     return newPart;
   276     return newPart;
   262     }
   277     }
   263 
   278 
   264 // -----------------------------------------------------------------------------
   279 // -----------------------------------------------------------------------------
   267 EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL(	const TDesC& aFilePath,
   282 EXPORT_C CFSMailMessagePart* CFSMailMessage::AddNewAttachmentL(	const TDesC& aFilePath,
   268 																const TFSMailMsgId /*aInsertBefore*/ )
   283 																const TFSMailMsgId /*aInsertBefore*/ )
   269     {
   284     {
   270     NM_FUNCTION;
   285     NM_FUNCTION;
   271 
   286 
   272 	CFSMailMessagePart* newPart = NULL;
   287     CFSMailMessagePart* newPart(NULL);
   273 	
   288   
   274 	if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
   289     if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetMessageId()))
   275 		{
   290         {
   276 	    // use recognizer to find out ContentType 
   291         // use recognizer to find out ContentType 
   277 	    RApaLsSession apaSession;
   292         RApaLsSession apaSession;
   278 		TDataRecognitionResult dataType;
   293         TDataRecognitionResult dataType;
   279 		TBufC8<KMaxDataTypeLength> buf;
   294         TBufC8<KMaxDataTypeLength> buf;
   280 	    User::LeaveIfError(apaSession.Connect());
   295         User::LeaveIfError(apaSession.Connect());
   281 	    User::LeaveIfError(apaSession.RecognizeData(aFilePath, buf, dataType));
   296         User::LeaveIfError(apaSession.RecognizeData(aFilePath, buf, dataType));
   282 	    apaSession.Close();
   297         apaSession.Close();
   283 
   298 
   284 	    // Create new message part with correct Content-Type
   299         // Create new message part with correct Content-Type
   285 		TBuf<KMaxDataTypeLength> contentType;
   300         TBuf<KMaxDataTypeLength> contentType;
   286 		contentType.Copy(dataType.iDataType.Des());
   301         contentType.Copy(dataType.iDataType.Des());
   287 	    newPart = plugin->NewChildPartFromFileL( 	GetMailBoxId(),
   302         newPart = plugin->NewChildPartFromFileL(  GetMailBoxId(),
   288 	    											GetFolderId(),
   303                             GetFolderId(),
   289 	    											GetMessageId(),
   304                             GetMessageId(),
   290 	    											GetPartId(),
   305                             GetPartId(),
   291 	    											contentType,
   306                             contentType,
   292 	    											aFilePath );
   307                             aFilePath );
   293 
   308         if (newPart)
   294 		
   309             {
   295 	    // Set attachment name
   310             CleanupStack::PushL(newPart);
   296 	    newPart->SetAttachmentNameL(aFilePath);
   311             // set attachment name
   297 
   312             newPart->SetAttachmentNameL(aFilePath);
   298 		// store message part
   313             // store new message part
   299 		newPart->SaveL();
   314             newPart->SaveL();
   300 
   315             // set flag
   301 		// set flag
   316             SetFlag(EFSMsgFlag_Attachments);
   302         SetFlag(EFSMsgFlag_Attachments);
   317             CleanupStack::Pop(newPart);
   303 		}
   318             }
   304 		
   319         }
   305     return newPart;
   320     return newPart;
   306 }
   321 }
   307 
   322 
   308 // <qmail>
   323 // <qmail>
   309 // -----------------------------------------------------------------------------
   324 // -----------------------------------------------------------------------------
   365 // CFSMailMessage::AttachmentListL
   380 // CFSMailMessage::AttachmentListL
   366 // -----------------------------------------------------------------------------
   381 // -----------------------------------------------------------------------------
   367 EXPORT_C void CFSMailMessage::AttachmentListL(
   382 EXPORT_C void CFSMailMessage::AttachmentListL(
   368     RPointerArray<CFSMailMessagePart>& aParts )
   383     RPointerArray<CFSMailMessagePart>& aParts )
   369     {
   384     {
   370     NM_FUNCTION;
       
   371     
       
   372     // First list all message parts
   385     // First list all message parts
   373     AppendAttachmentsL( aParts ); 
   386     AppendAttachmentsL( aParts );
   374 
   387     
       
   388     NM_FUNCTION;
       
   389     
   375     // special case, if single part content type is not given,
   390     // special case, if single part content type is not given,
   376     // default type is text/plain
   391     // default type is text/plain
   377     if ( aParts.Count() == 1 && aParts[0]->GetContentType().Length() == 0)
   392     if ( aParts.Count() == 1 && aParts[0]->GetContentType().Length() == 0)
   378         {
   393         {
   379         aParts.ResetAndDestroy();
   394         aParts.ResetAndDestroy();
   433     NM_FUNCTION;
   448     NM_FUNCTION;
   434     
   449     
   435     CFSMailMessagePart* part = FindBodyPartL(KFSMailContentTypeTextPlain, aDataSource);
   450     CFSMailMessagePart* part = FindBodyPartL(KFSMailContentTypeTextPlain, aDataSource);
   436     
   451     
   437     // special case, single part content type is not given
   452     // special case, single part content type is not given
   438     if(part == NULL && iMessageParts.Count() == 1 && iMessageParts[0]->GetContentType().Length() == 0)
   453     if (!part && iMessageParts.Count() == 1 && iMessageParts[0]->GetContentType().Length() == 0)
   439     	{
   454       {
   440     	part = iMessageParts[0];
   455       part = iMessageParts[0];
   441     	iMessageParts.Remove(0);
   456       iMessageParts.Remove(0);
   442     	}
   457       }
   443     iMessageParts.ResetAndDestroy();
   458     iMessageParts.ResetAndDestroy();
   444 	iReadMessageParts = ETrue;
   459     iReadMessageParts = ETrue;
   445     return part;
   460     return part;
   446 }
   461 }
   447 // </qmail>
   462 // </qmail>
   448 
   463 
   449 // <qmail>
   464 // <qmail>
   460 	iReadMessageParts = ETrue;
   475 	iReadMessageParts = ETrue;
   461     return part;
   476     return part;
   462 }
   477 }
   463 // </qmail>
   478 // </qmail>
   464 
   479 
   465 // <qmail>
       
   466 // -----------------------------------------------------------------------------
       
   467 // CFSMailMessage::IsMessageL
       
   468 // -----------------------------------------------------------------------------
       
   469 EXPORT_C TBool CFSMailMessage::IsMessageL() const
       
   470 	{
       
   471     NM_FUNCTION;
       
   472     
       
   473     return CFSMailMessagePart::IsMessageL();
       
   474 	}
       
   475 // </qmail>
       
   476 
       
   477 // -----------------------------------------------------------------------------
   480 // -----------------------------------------------------------------------------
   478 // CFSMailMessage::ContentTypeParameters()
   481 // CFSMailMessage::ContentTypeParameters()
   479 // -----------------------------------------------------------------------------
   482 // -----------------------------------------------------------------------------
   480 CDesCArray& CFSMailMessage::ContentTypeParameters()
   483 CDesCArray& CFSMailMessage::ContentTypeParameters()
   481 {
   484 {