1 // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 //----------------------------------------------------------------------------------------
17 inline LOCAL_C void AppendCRLF( TDes8& rOutputLine, TInt& rPaddingCount )
18 //----------------------------------------------------------------------------------------
20 rOutputLine.Append( TPtrC8(KImcvCRLF) );
21 rPaddingCount += KImcvCRLF().Length();
25 //----------------------------------------------------------------------------------------
26 inline LOCAL_C TInt AddCRLF(TDes8& rOutputLine)
27 //----------------------------------------------------------------------------------------
29 rOutputLine = KImcvCRLF;
33 //----------------------------------------------------------------------------------------
34 inline LOCAL_C void AddCRLF( TDes8& rOutputLine, TInt& rPaddingCount )
35 //----------------------------------------------------------------------------------------
37 rOutputLine=TPtrC8(KImcvCRLF);
38 rPaddingCount = KImcvCRLF().Length();
41 //----------------------------------------------------------------------------------------
42 inline LOCAL_C void AddCRLFAtEndOfLine( TDes8& rOutputLine, TInt& rPaddingCount)
43 //----------------------------------------------------------------------------------------
45 TInt length = rOutputLine.Length();
46 if ( length < 2 || (rOutputLine[length-2] != KImcvCR || rOutputLine[length-1] != KImcvLF) )
48 rOutputLine.Append( KImcvCRLF );
53 //----------------------------------------------------------------------------------------
54 inline TBool IsLineCRLF( TDesC8& aOutputLine )
55 //----------------------------------------------------------------------------------------
57 TInt length = aOutputLine.Length();
58 if ( length < 2 || (aOutputLine[length-2] != KImcvCR || aOutputLine[length-1] != KImcvLF) )
64 //****************************************************************************************
65 // Class CImEmailTraverser Functions
66 //****************************************************************************************
69 //----------------------------------------------------------------------------------------
70 inline TInt CImEmailTraverser::CurrentEntry()
71 //----------------------------------------------------------------------------------------
73 return iCurrentEntryList[0];
76 //----------------------------------------------------------------------------------------
77 inline CMsvEntrySelection& CImEmailTraverser::CurrentList() const
78 //----------------------------------------------------------------------------------------
80 return *(*iSelectionList)[0];
83 //----------------------------------------------------------------------------------------
84 inline TBool CImEmailTraverser::DeleteCurrentList()
85 //----------------------------------------------------------------------------------------
90 delete &CurrentList();
91 iSelectionList->Delete(0);
92 iCurrentEntryList.Delete(0);
96 //----------------------------------------------------------------------------------------
97 inline void CImEmailTraverser::AddList(CMsvEntrySelection& children)
98 //----------------------------------------------------------------------------------------
100 iSelectionList->InsertL(0, &children);
101 iCurrentEntryList.InsertL(0, 0);
104 //----------------------------------------------------------------------------------------
105 inline TBool CImEmailTraverser::LevelExists() const
106 //----------------------------------------------------------------------------------------
108 return iSelectionList->Count();
111 //----------------------------------------------------------------------------------------
112 inline TBool CImEmailTraverser::IsBaseLevel() const
113 //----------------------------------------------------------------------------------------
115 return ThisEntry().Id()==iBaseId ? ETrue: EFalse;;
118 //----------------------------------------------------------------------------------------
119 inline void CImEmailTraverser::SetBaseEntry()
120 //----------------------------------------------------------------------------------------
122 iServerEntry.SetEntry(iBaseId);
125 //----------------------------------------------------------------------------------------
126 inline const TMsvEntry& CImEmailTraverser::ThisEntry() const
127 //----------------------------------------------------------------------------------------
129 return iServerEntry.Entry();
133 //****************************************************************************************
134 // Class CImSendMimeEmail Functions
135 //****************************************************************************************
137 //----------------------------------------------------------------------------------------
138 inline void CImSendMimeEmail::Boundary(TDes8& rOutputLine)
139 //----------------------------------------------------------------------------------------
141 rOutputLine.Append( (*iBoundaryArray)[0] );
144 //----------------------------------------------------------------------------------------
145 inline TPtrC8 CImSendMimeEmail::Boundary()
146 //----------------------------------------------------------------------------------------
148 return (*iBoundaryArray)[0];
151 //----------------------------------------------------------------------------------------
152 inline TInt CImSendMimeEmail::SendBoundaryLine(TDes8& rOutputLine, TInt& rPaddingCount)
153 //----------------------------------------------------------------------------------------
155 rOutputLine.Append(KImcvMimeBoundaryStartEnd);
156 Boundary( rOutputLine );
157 rPaddingCount += (*iBoundaryArray)[0].Length() + 2;
162 // Sets iState to EEndBoundary or EEndOfEmail
163 // returns true if entry found
164 //----------------------------------------------------------------------------------------
165 inline TBool CImSendMimeEmail::Down(TMsvEntry& rEntry)
166 //----------------------------------------------------------------------------------------
168 TInt ret = iEmailTraverser->DownLevelL() ? ETrue:EFalse;
171 rEntry = iEmailTraverser->ThisEntry();
175 //----------------------------------------------------------------------------------------
176 inline void CImSendMimeEmail::GetNextEntryL(TMsvEntry& rEntry)
177 //----------------------------------------------------------------------------------------
179 if ( (iState!=EEndBoundary && iState!=ELineAfterEndBoundary) && Down(rEntry) )
181 else if ( iEmailTraverser->NextEntryL(rEntry) )
183 else if (iEmailTraverser->UpLevelL() )
185 if (iServerEntry.Entry().iType==KUidMsvMessageEntry && !(iEmailTraverser->IsBaseLevel()))
187 // Embedded non-mime message
189 GetNextEntryL(rEntry);
195 iState=KImCvFinished;
199 //----------------------------------------------------------------------------------------
200 inline TPtrC8 CImSendMimeEmail::SetBoundaryL(TBool aMultipart)
201 //----------------------------------------------------------------------------------------
207 return (*iBoundaryArray)[0];
210 //----------------------------------------------------------------------------------------
211 inline TBool CImSendMimeEmail::CheckForEmbeddedEmailL(const TMsvEntry& aEntry) const
212 //----------------------------------------------------------------------------------------
214 return (aEntry.iType==KUidMsvMessageEntry);
217 //----------------------------------------------------------------------------------------
218 inline TBool CImSendMimeEmail::CheckForMultipartEmailL(TMsvEntry& rEntry, TImEmailFolderType& aFolder)
219 //----------------------------------------------------------------------------------------
221 TMsvEmailEntry emailEntry = (TMsvEmailEntry)rEntry;
223 aFolder = emailEntry.MessageFolderType();
224 if (aFolder==EFolderTypeMixed || aFolder==EFolderTypeDigest ||
225 aFolder==EFolderTypeAlternative || aFolder==EFolderTypeRelated )
228 if ( ! Down(emailEntry) )
231 if ( iEmailTraverser->CurrentList().Count()==1 &&
232 iEmailTraverser->ThisEntry().iType==KUidMsvFolderEntry )
234 aFolder = ((TMsvEmailEntry&)iEmailTraverser->ThisEntry()).MessageFolderType();
235 iEmailTraverser->UpLevelL();
239 iEmailTraverser->UpLevelL();
243 //****************************************************************************************
244 // Class CImSendRfc822Header Functions
245 //****************************************************************************************
247 //----------------------------------------------------------------------------------------
248 inline TInt CImSendRfc822Header::XMailerL(TDes8& rOutputLine)
249 //----------------------------------------------------------------------------------------
251 rOutputLine = KImcvXMailer;
252 rOutputLine.Append(*iProductName);
256 //----------------------------------------------------------------------------------------
257 inline TInt CImSendRfc822Header::MessageIdL( TDes8& rOutputLine )
258 //----------------------------------------------------------------------------------------
260 if ( !iHeader->ImMsgId().Length() )
263 PrepareBufferL( TPtrC8(KImcvMessageIdPrompt), iHeader->ImMsgId());
264 return SendOutput( rOutputLine );
267 //----------------------------------------------------------------------------------------
268 inline TInt CImSendRfc822Header::ToL(TDes8& rOutputLine)
269 //----------------------------------------------------------------------------------------
271 return DoRecipientsL(rOutputLine, TPtrC8(KImcvToPrompt), iHeader->ToRecipients());
274 //----------------------------------------------------------------------------------------
275 inline TInt CImSendRfc822Header::CcL(TDes8& rOutputLine)
276 //----------------------------------------------------------------------------------------
278 return DoRecipientsL(rOutputLine, TPtrC8(KImcvCcPrompt), iHeader->CcRecipients());
281 //----------------------------------------------------------------------------------------
282 inline TInt CImSendRfc822Header::BccL(TDes8& rOutputLine)
283 //----------------------------------------------------------------------------------------
285 return DoRecipientsL(rOutputLine, TPtrC8(KImcvBccPrompt), iHeader->BccRecipients());
288 //----------------------------------------------------------------------------------------
289 inline TInt CImSendRfc822Header::FromL( TDes8& rOutputLine )
290 //----------------------------------------------------------------------------------------
292 PrepareBufferL( TPtrC8(KImcvFromPrompt), iHeader->From());
293 return SendOutput( rOutputLine );
296 //----------------------------------------------------------------------------------------
297 inline TInt CImSendRfc822Header::ReplyToL( TDes8& rOutputLine )
298 //----------------------------------------------------------------------------------------
300 if ( !iHeader->ReplyTo().Length() )
303 PrepareBufferL( TPtrC8(KImcvReplyToPrompt), iHeader->ReplyTo() );
304 return SendOutput( rOutputLine );
307 //----------------------------------------------------------------------------------------
308 inline TInt CImSendRfc822Header::SubjectL( TDes8& rOutputLine )
309 //----------------------------------------------------------------------------------------
311 // If the subject field has already been encoded and stored in iOutputBuffer
312 // then there is no need to encode again.
315 PrepareBufferL( TPtrC8(KImcvSubjectPrompt), iHeader->Subject() );
317 return SendOutput( rOutputLine );
321 //----------------------------------------------------------------------------------------
322 inline TInt CImSendRfc822Header::ReturnReceiptsL(TDes8& rOutputLine)
323 //----------------------------------------------------------------------------------------
325 // SendReturnReceiptFieldsL() will always return one choice.
326 // In future it can be changed to add more fields
329 if ( iHeader->ReceiptAddress().Length() )
330 address.Set(iHeader->ReceiptAddress());
331 else if ( iHeader->ReplyTo().Length() )
332 address.Set(iHeader->ReplyTo());
334 return 1; // No valid a address
336 CDesC8Array* receiptsFields=new (ELeave)CDesC8ArrayFlat(KArrayAllocationNumber);
337 CleanupStack::PushL(receiptsFields);
338 CImcvUtils::SendReturnReceiptFieldsL(*receiptsFields);
339 TInt count=receiptsFields->Count();
340 for (TInt i=0;i<count;i++)
341 PrepareBufferL((*receiptsFields)[i], address);
343 CleanupStack::PopAndDestroy(); //receiptsFields
344 return SendOutput( rOutputLine );
347 //----------------------------------------------------------------------------------------
348 inline TBool CImSendRfc822Header::FieldIsEmailAddress() const
349 //----------------------------------------------------------------------------------------
351 return (iState != ESubject);
354 //----------------------------------------------------------------------------------------
355 inline const TImEmailTransformingInfo& CImSendRfc822Header::TransformingInfo() const
356 //----------------------------------------------------------------------------------------
358 return iTransformingInfo;
363 //****************************************************************************************
364 // Class CImSendMimeHeader Functions
365 //****************************************************************************************
368 //----------------------------------------------------------------------------------------
369 inline TInt CImSendMimeHeader::BlankLine(TDes8& rOutputLine) const
370 //----------------------------------------------------------------------------------------
372 rOutputLine = KNullDesC8;
376 //----------------------------------------------------------------------------------------
377 inline TInt CImSendMimeHeader::MimeVersion(TDes8& rOutputLine) const
378 //----------------------------------------------------------------------------------------
380 rOutputLine = KImcvMimePrompt;
381 rOutputLine.Append(KImcvSpMimeVersion);
385 //----------------------------------------------------------------------------------------
386 inline TBool CImSendMimeHeader::ContentType(TDes8& rOutputLine) const
387 //----------------------------------------------------------------------------------------
389 TBool isText = EFalse;
390 rOutputLine = KImcvContentType;
391 rOutputLine.Append(KImcvSpace);
393 if (((TMsvEmailEntry&)iEntry).VCard())
395 rOutputLine.Append(KImcvText);
396 rOutputLine.Append( KImcvForwardSlash );
397 rOutputLine.Append(KImcvDirectory);
398 rOutputLine.Append( KImcvSemiColon );
399 rOutputLine.Append( KImcvSpace );
400 rOutputLine.Append( KImcvProfile );
401 rOutputLine.Append( KImcvEquals );
402 rOutputLine.Append( KImcvVCard );
405 else if (((TMsvEmailEntry&)iEntry).VCalendar())
407 rOutputLine.Append(KImcvText);
408 rOutputLine.Append( KImcvForwardSlash );
409 rOutputLine.Append(KImcvVCalender);
412 else if (iEntry.iType == KUidMsvEmailHtmlEntry)
414 rOutputLine.Append(KImcvText);
415 rOutputLine.Append( KImcvForwardSlash );
416 rOutputLine.Append(KImcvHtml);
419 else if ( iMimeHeader->ContentType().Length() )
421 TPtrC8 contentType = iMimeHeader->ContentType();
422 rOutputLine.Append( contentType );
424 TPtrC8 contentSubType = iMimeHeader->ContentSubType();
425 if ( contentSubType.Length() )
427 rOutputLine.Append( KImcvForwardSlash );
428 rOutputLine.Append( iMimeHeader->ContentSubType() );
431 isText = contentType.CompareF(KImcvText) ? EFalse : ETrue;
434 // If the content-Type is text/calendar we need to add two
435 // parameters: "method" and "component"
436 // GS : do we need extra parameters for vCal??
439 if ( contentType.Length() && contentSubType.Length() )
440 if ( isText && !(contentSubType.CompareF(KImcvICalendar)) )
443 parameter.Set(iMimeHeader->GetContentTypeValue(KImcvICalendarMethod));
444 if ( parameter.Length() )
446 rOutputLine.Append( KImcvSemiColon );
447 rOutputLine.Append( KImcvSpace );
448 rOutputLine.Append( KImcvICalendarMethod );
449 rOutputLine.Append( KImcvEquals );
450 rOutputLine.Append( parameter );
453 // COMPONENT parameter
454 parameter.Set(iMimeHeader->GetContentTypeValue(KImcvICalendarComponent));
455 if ( parameter.Length() )
457 rOutputLine.Append( KImcvSemiColon );
458 rOutputLine.Append( KImcvSpace );
459 rOutputLine.Append( KImcvICalendarComponent );
460 rOutputLine.Append( KImcvEquals );
461 rOutputLine.Append( parameter );
466 else if (iEntry.iType == KUidMsvAttachmentEntry)
467 rOutputLine.Append( KImcvApplOctet );
468 else if (iEntry.iType==KUidMsvEmailTextEntry || (!iIsMultipart && !iEntry.Attachment()))
470 rOutputLine.Append(KImcvText);
471 rOutputLine.Append( KImcvForwardSlash );
472 rOutputLine.Append(KImcvPlain);
477 rOutputLine.SetLength(0);
483 rOutputLine.Append( KImcvSemiColon );
484 rOutputLine.Append( KImcvSpace );
485 rOutputLine.Append( KImcvCharset );
486 rOutputLine.Append( KImcvEquals );
487 rOutputLine.Append( GetCharsetString() );
489 else if ( iBoundaryString.Length() )
490 rOutputLine.Append(KImcvSemiColon); // boundary to follow
495 //----------------------------------------------------------------------------------------
496 inline TBool CImSendMimeHeader::TransferEncoding(TDes8& rOutputLine) const
497 //----------------------------------------------------------------------------------------
499 TPtrC8 encodingType = EncodingType();
501 if (iEntry.iType!=KUidMsvFolderEntry && encodingType.Length())
503 rOutputLine = KImcvContentTransferEncoding;
504 rOutputLine.Append(encodingType);
511 //----------------------------------------------------------------------------------------
512 inline TInt CImSendMimeHeader::ContentLanguage(TDes8& rOutputLine) const
513 //----------------------------------------------------------------------------------------
515 rOutputLine = KImcvContentLanguage;
516 rOutputLine.Append(KImcvDefaultLanguage);
520 //----------------------------------------------------------------------------------------
521 inline TBool CImSendMimeHeader::Description( TDes8& rOutputLine ) const
522 //----------------------------------------------------------------------------------------
524 TPtrC8 description = iMimeHeader->ContentDescription();
526 if ( !description.Length() )
529 rOutputLine = KImcvContentDescription;
530 rOutputLine.Append(KImcvSpace);
531 rOutputLine.Append( description );
536 //----------------------------------------------------------------------------------------
537 inline TInt CImSendMimeHeader::Boundary(TDes8& rOutputLine) const
538 //----------------------------------------------------------------------------------------
540 rOutputLine.Append(KImcvSpace);
541 rOutputLine.Append(KImcvSpace);
542 rOutputLine.Append(KImcvBoundary);
543 rOutputLine.Append(KImcvEquals);
544 rOutputLine.Append(KImcvQuote);
545 rOutputLine.Append(iBoundaryString);
546 rOutputLine.Append(KImcvQuote);
550 //----------------------------------------------------------------------------------------
551 inline TBool CImSendMimeHeader::Disposition( TDes8& rOutputLine, TInt& rAdvance)
552 //----------------------------------------------------------------------------------------
555 if (iEntry.iType == KUidMsvFolderEntry)
558 if(iLine==EFirstLine)
560 TPtrC8 disposition = iMimeHeader->ContentDisposition();
562 // Four cases : (2)disposition explicitly attachment,
563 // (3) Non Multipart message with attachment flag set.
564 // (4) Embedded email
566 if ( iEntry.iType==KUidMsvAttachmentEntry ||
567 disposition==KImcvAttachment ||
568 (!iIsMultipart && iEntry.iType!=KUidMsvMessageEntry && iEntry.Attachment()) )
570 rOutputLine = KImcvContentDisposition;
571 rOutputLine.Append(KImcvSpace);
572 rOutputLine.Append(KImcvAttachment);
573 rOutputLine.Append(KImcvSemiColon);
578 else if (iEntry.iType==KUidMsvEmailTextEntry )
580 rOutputLine = KImcvContentDisposition;
581 rOutputLine.Append(KImcvSpace);
582 rOutputLine.Append(KImcvInline);
585 else if (iEntry.iType==KUidMsvMessageEntry && iDealingWithAnEmbeddedEmail)
587 rOutputLine = KImcvContentDisposition;
588 rOutputLine.Append(KImcvSpace);
589 rOutputLine.Append(KImcvAttachment);
590 rOutputLine.Append(KImcvSemiColon);
596 else if (iFilename.Length())
598 rOutputLine.Append(KImcvTab);
599 rOutputLine.Append(KImcvMimeDispositionFilename);
600 AppendFilenameL( rOutputLine );
601 iDealingWithAnEmbeddedEmail = EFalse;
609 //----------------------------------------------------------------------------------------
610 inline const TPtrC8 CImSendMimeHeader::EncodingType() const
611 //----------------------------------------------------------------------------------------
613 switch (iEncodingType)
615 case EEncodingTypeBASE64:
616 return TPtrC8(KImcvBase64);
617 case EEncodingTypeQP:
618 return TPtrC8(KImcvQuotedPrintable);
619 case EEncodingTypeUU:
620 return TPtrC8(KImcvXUUString);
622 return TPtrC8(KImcv7Bit);
626 //----------------------------------------------------------------------------------------
627 inline TUint CImSendMimeHeader::CharsetUid() const
628 //----------------------------------------------------------------------------------------
634 //****************************************************************************************
635 // Class CImSendRichText Functions
636 //****************************************************************************************
638 //----------------------------------------------------------------------------------------
639 inline TBool CImSendRichText::IsBreakable( TChar ch ) const
640 //----------------------------------------------------------------------------------------
642 return (ch==' '|| ch=='\t' || ch==CEditableText::EParagraphDelimiter
643 || ch==CEditableText::ENonBreakingSpace );
646 //----------------------------------------------------------------------------------------
647 inline TInt CImSendRichText::Size() const
648 //----------------------------------------------------------------------------------------
653 //----------------------------------------------------------------------------------------
654 inline TBool CImSendRichText::IsEOL( TChar ch ) const
655 //----------------------------------------------------------------------------------------
657 return (ch==CEditableText::EParagraphDelimiter
658 || ch==CEditableText::ELineBreak
659 || ch==CEditableText::EPageBreak);
662 //----------------------------------------------------------------------------------------
663 inline TBool CImSendRichText::IsPlain( TChar aChar ) const
664 //----------------------------------------------------------------------------------------
666 return (((aChar >= '!') && (aChar <= KImcvSemiColon))
667 || ((aChar >= KImcvRightChevron) && (aChar <= KImcvTilde)));
670 //----------------------------------------------------------------------------------------
671 inline TUint8 CImSendRichText::ReplacementChar( TChar aControlChar ) const
672 //----------------------------------------------------------------------------------------
674 if (aControlChar==CEditableText::ETabCharacter)
677 if (aControlChar==CEditableText::ENonBreakingHyphen)
680 if (aControlChar==CEditableText::ENonBreakingSpace)
686 //----------------------------------------------------------------------------------------
687 inline int CImSendRichText::ConvertLineBreaks( TDes& aSource, TBool aLineBreak) const
688 //----------------------------------------------------------------------------------------
690 // Need to get rid of 16 bit richtext control characters before moving to 8bit buffer
691 // Therefore convert to the old para delimiter, convert to CRLF later in EncodeRichText.
692 // Its horrible, but what can you do.
695 TInt len=aSource.Length();
697 for (TInt i=0; i<len; i++)
699 repChar=ReplacementChar(aSource[i]);
702 else if ( IsEOL(aSource[i]) )
705 aSource.SetLength(i+2);
706 aSource[i+1]=KImcvLF;
715 //****************************************************************************************
716 // Class CImSendFile Functions
717 //****************************************************************************************
720 //----------------------------------------------------------------------------------------
721 inline TInt CImSendFile::Size() const
722 //----------------------------------------------------------------------------------------
724 return iAttachmentInfo.iSize;
727 //****************************************************************************************
728 // Class CImCalculateMsgSize Functions
729 //****************************************************************************************
731 //----------------------------------------------------------------------------------------
732 inline TInt CImCalculateMsgSize::MessageSize() const
733 //----------------------------------------------------------------------------------------
738 //----------------------------------------------------------------------------------------
739 inline void CImCalculateMsgSize::Progress(TInt& rCurrentSize, TInt& rTotalSize)
740 //----------------------------------------------------------------------------------------