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 { |