email/pop3andsmtpmtm/servermtmutils/src/imcvrecv.cpp
author hgs
Thu, 04 Nov 2010 02:02:03 +0530
changeset 81 2043ea884c04
parent 80 8b14b30db193
permissions -rw-r--r--
201044_03
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
8b14b30db193 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
8b14b30db193 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
8b14b30db193 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
8b14b30db193 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
8b14b30db193 201044_02
hgs
parents:
diff changeset
     7
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    10
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    12
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    13
// Description:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    14
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    15
8b14b30db193 201044_02
hgs
parents:
diff changeset
    16
#include <e32base.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    17
#include "IMUTDLL.H"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    18
#include "IMCVTEXT.H"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    19
#include "IMCVRECV.H"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    20
#include "IMCVCODC.H"	// TImConvert
8b14b30db193 201044_02
hgs
parents:
diff changeset
    21
#include "IMCVUTIL.H"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    22
#include "CMsvPlainBodyTextEntry.H"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    23
#include <cmsvplainbodytext.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    24
8b14b30db193 201044_02
hgs
parents:
diff changeset
    25
#include <miuthdr.h>	// CImHeader
8b14b30db193 201044_02
hgs
parents:
diff changeset
    26
#include <miutatch.h>	// TImAttachmentFile
8b14b30db193 201044_02
hgs
parents:
diff changeset
    27
#include <msvids.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    28
#include <txtrich.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    29
#include <imcm.rsg>		// resource definition for IMCM
8b14b30db193 201044_02
hgs
parents:
diff changeset
    30
8b14b30db193 201044_02
hgs
parents:
diff changeset
    31
#include <pop3set.h>	// For including KUidMsgTypePOP3
8b14b30db193 201044_02
hgs
parents:
diff changeset
    32
#include <barsread.h>	// TResourceReader
8b14b30db193 201044_02
hgs
parents:
diff changeset
    33
8b14b30db193 201044_02
hgs
parents:
diff changeset
    34
#include <cmsvbodytext.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    35
8b14b30db193 201044_02
hgs
parents:
diff changeset
    36
#ifdef __WINS__
8b14b30db193 201044_02
hgs
parents:
diff changeset
    37
#include <e32wins.h>    // for maxfilename lengths
8b14b30db193 201044_02
hgs
parents:
diff changeset
    38
#include <msvapi.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    39
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
    40
8b14b30db193 201044_02
hgs
parents:
diff changeset
    41
#ifndef __WINS__
8b14b30db193 201044_02
hgs
parents:
diff changeset
    42
#include <msvapi.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    43
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
    44
#include <cmsvattachment.h> 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    45
#include <mmsvattachmentmanager.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    46
#include <mmsvattachmentmanagersync.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    47
8b14b30db193 201044_02
hgs
parents:
diff changeset
    48
#ifndef _MSG_NO_LOGGING
8b14b30db193 201044_02
hgs
parents:
diff changeset
    49
#define __IMUT_LOGGING
8b14b30db193 201044_02
hgs
parents:
diff changeset
    50
_LIT(KLogFilePath, "c:\\logs\\mailtext\\in.txt");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    51
_LIT8(KNewLogHeader, "\r\n------ New Receive Session ------\r\n");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    52
_LIT8(KFound, "found: ");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    53
_LIT8(KFoundIncomplete, "found but incomplete: ");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    54
_LIT8(KPartLine, "unknown or part line");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    55
_LIT8(KEndOFHeader, "End of header");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    56
_LIT8(KSkippingData, "Skipping data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    57
_LIT8(KCollectingData7, "Collecting 7/8-bit data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    58
_LIT8(KCollectingDataQP, "Collecting QP data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    59
_LIT8(KCollectingBase64, "Collecting BASE64 data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    60
_LIT8(KCollectingUU, "Collecting UU data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    61
_LIT8(KDecodingBase64, "Decoding BASE64 data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    62
_LIT8(KDecodedBase64, "Decoded BASE64 data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    63
_LIT8(KDecodingUU, "Decoding UU data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    64
_LIT8(KDecodedUU, "Decoded UU data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    65
_LIT8(KDecodingQP, "Decoding QP data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    66
_LIT8(KDecodedQP, "Decoded QP data");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    67
_LIT8(KUUEDataCorrupt, "UU Data is corrupt");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    68
_LIT8(KFoundUUEStartBoundary, "UUE start boundary");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    69
_LIT8(KFoundUUEEndBoundary, "UUE end boundary");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    70
_LIT8(KClosingAttachFile, "Closing attachment file");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    71
_LIT8(KDeletingAttachFile, "Deleting attachment file");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    72
_LIT8(KDeletedAttachFile, "Deleted attachment file");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    73
_LIT8(KFailedToWriteToFile, "Failed to write to attachment file");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    74
_LIT8(KSectionHeader, "Section header");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    75
_LIT8(KFoundMIMEBoundary, "MIME boundary");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    76
_LIT8(KWritingToBody, "writing body");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    77
_LIT8(KWroteToBody, "wrote body");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    78
_LIT8(KWritingToFile, "writing attachment");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    79
_LIT8(KWroteToFile, "wrote attachment");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    80
_LIT8(KReset, "Resetting CImRecvConvert");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    81
_LIT8(KReseted, "Resetting CImRecvConvert");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    82
_LIT8(KDelete, "Deleting CImRecvConvert");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    83
_LIT8(KDeleted, "Deleting CImRecvConvert");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    84
_LIT8(KLineHasLineBreak, "Linebreak");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    85
_LIT8(KLastToken, "That was the last token");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    86
_LIT8(KBlankLine, "Blank line");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    87
_LIT8(KRemoveBoundary, "Remove boundary");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    88
_LIT8(KRemovedBoundary, "Removed boundary");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    89
_LIT8(KResetForNewEntry, "Reset for a New Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    90
_LIT8(KResetedForNewEntry, "Reseted for a New Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    91
_LIT8(KResetForNonMimeEntry, "Reset for a New Non-Mime Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    92
_LIT8(KResetedForNonMimeEntry, "Reseted for a New Non-Mime Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    93
_LIT8(KCreatingEntry, "Creating Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    94
_LIT8(KCreatedEntry, "Created Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    95
_LIT8(KUpdatingEntry, "Updating Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    96
_LIT8(KUpdatedEntry, "Updated Entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    97
_LIT8(KMoveToParentEntry, "Moved to parent entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    98
_LIT8(KMovedToParentEntry, "End of Moved to parent entry");
8b14b30db193 201044_02
hgs
parents:
diff changeset
    99
_LIT8(KStoringHeader, "Storing CImHeader");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   100
_LIT8(KStoredHeader, "Stored CImHeader");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   101
_LIT8(KStoringBody, "Storing CRichText");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   102
_LIT8(KStoring8BitBody, "Storing CMsvBodyText");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   103
_LIT8(KStoredBody, "Stored CRichText");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   104
_LIT8(KStored8BitBody, "Stored CMsvBodyText");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   105
_LIT8(KStoringMIMEHeader, "Storing CImMimeHeader");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   106
_LIT8(KStoredMIMEHeader, "Stored CImMimeHeader");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   107
_LIT8(KIgnoringStreams, "Discarding streams");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   108
_LIT8(KStartMessageComplete, "Start Message Complete");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   109
_LIT8(KMessageComplete, "Message Complete");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   110
_LIT8(KHeaderComplete, "Message Header complete");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   111
_LIT8(KReturnReceiptTo, "return-receipt-To is set");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   112
_LIT8(KStartStoringEntryStream, "Starting Storing Entry Stream");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   113
_LIT8(KStoringEntryStream, "Storing Entry Stream");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   114
_LIT8(KDoneStoringEntryStream, "Done Storing Entry Stream");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   115
#endif // _MSG_NO_LOGGING
8b14b30db193 201044_02
hgs
parents:
diff changeset
   116
8b14b30db193 201044_02
hgs
parents:
diff changeset
   117
// uncomment the line below if logging is to be enabled
8b14b30db193 201044_02
hgs
parents:
diff changeset
   118
8b14b30db193 201044_02
hgs
parents:
diff changeset
   119
#if defined(__IMUT_LOGGING)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   120
#define RECVLOG(text) (iImcvLog?iImcvLog->AppendComment(text):void(0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   121
#define RECVLOG_OUT(text) (iImcvLog?iImcvLog->AppendOut(text):void(0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   122
#define LOGGING(string1, string2) (Logging(string1, string2));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   123
#else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   124
#define RECVLOG(text) (void(0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   125
#define RECVLOG_OUT(text) (void(0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   126
#define LOGGING(string1, string2) (void(0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   127
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
   128
8b14b30db193 201044_02
hgs
parents:
diff changeset
   129
8b14b30db193 201044_02
hgs
parents:
diff changeset
   130
const TInt KBodyTextChunkSizeBytes = 512;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   131
8b14b30db193 201044_02
hgs
parents:
diff changeset
   132
_LIT(KIntegerKey,"%d");
8b14b30db193 201044_02
hgs
parents:
diff changeset
   133
const TInt KSpaceToAddNumber=20;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   134
8b14b30db193 201044_02
hgs
parents:
diff changeset
   135
8b14b30db193 201044_02
hgs
parents:
diff changeset
   136
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   137
LOCAL_C TBool IsIllegalChar(const TUint aChar)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   138
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   139
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   140
	// EPOC32 filenames must not contain any of the following chars
8b14b30db193 201044_02
hgs
parents:
diff changeset
   141
    return (aChar == '*' || aChar == '\\' || aChar == '<' || aChar == '>' ||
8b14b30db193 201044_02
hgs
parents:
diff changeset
   142
			aChar == ':'  || aChar == '"' ||  aChar    == '/' || aChar == '|' ||
8b14b30db193 201044_02
hgs
parents:
diff changeset
   143
			aChar < ' ' || aChar =='?');
8b14b30db193 201044_02
hgs
parents:
diff changeset
   144
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   145
8b14b30db193 201044_02
hgs
parents:
diff changeset
   146
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   147
LOCAL_C void RemoveSurroundingCharacters( const TUint8& aLeft, const TUint8& aRight, HBufC8& aString)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   148
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   149
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   150
	TPtr8 des = aString.Des();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   151
	TInt len  = des.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   152
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   153
	if( len>2 && des[0]==aLeft && des[len-1]==aRight )
8b14b30db193 201044_02
hgs
parents:
diff changeset
   154
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   155
		TPtrC8 mid = des.Mid(1, len-1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   156
		des.Copy(mid);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   157
		des.SetLength(len-2);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   158
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   159
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   160
8b14b30db193 201044_02
hgs
parents:
diff changeset
   161
8b14b30db193 201044_02
hgs
parents:
diff changeset
   162
//****************************************************************************************
8b14b30db193 201044_02
hgs
parents:
diff changeset
   163
//              Class CRfc822Token Functions
8b14b30db193 201044_02
hgs
parents:
diff changeset
   164
//****************************************************************************************
8b14b30db193 201044_02
hgs
parents:
diff changeset
   165
8b14b30db193 201044_02
hgs
parents:
diff changeset
   166
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   167
EXPORT_C CRfc822Token* CRfc822Token::NewLC()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   168
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   169
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   170
	CRfc822Token* self = new (ELeave) CRfc822Token;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   171
	CleanupStack::PushL(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   172
	self->ConstructL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   173
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   174
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   175
8b14b30db193 201044_02
hgs
parents:
diff changeset
   176
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   177
void CRfc822Token::ConstructL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   178
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   179
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   180
	iOutputLine = HBufC8::NewL(KMaxIMailHeaderReadLineLength+1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   181
	Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   182
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   183
8b14b30db193 201044_02
hgs
parents:
diff changeset
   184
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   185
CRfc822Token::CRfc822Token()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   186
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   187
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   188
	__DECLARE_NAME(_S("CRfc822Token"));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   189
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   190
8b14b30db193 201044_02
hgs
parents:
diff changeset
   191
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   192
EXPORT_C CRfc822Token::~CRfc822Token()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   193
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   194
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   195
	delete iOutputLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   196
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   197
8b14b30db193 201044_02
hgs
parents:
diff changeset
   198
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   199
EXPORT_C void CRfc822Token::Reset()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   200
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   201
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   202
	iOutputLine->Des().FillZ();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   203
	iBufferedInput.SetLength(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   204
	iBufferedInput.FillZ();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   205
8b14b30db193 201044_02
hgs
parents:
diff changeset
   206
	iLastToken = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   207
	iFirstLine = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   208
	i822FieldsExist=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   209
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   210
8b14b30db193 201044_02
hgs
parents:
diff changeset
   211
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   212
EXPORT_C void CRfc822Token::ParseNextLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   213
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   214
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   215
	TBool hitEof = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   216
	TBool endOfField = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   217
	// Always read one more packet than we need so we know we've read the entire field.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   218
8b14b30db193 201044_02
hgs
parents:
diff changeset
   219
	// Consequently, we need to check whether there is any buffered input from the
8b14b30db193 201044_02
hgs
parents:
diff changeset
   220
	// previous rfc822 field:*******
8b14b30db193 201044_02
hgs
parents:
diff changeset
   221
8b14b30db193 201044_02
hgs
parents:
diff changeset
   222
	if(iBufferedInput.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   223
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   224
		// the buffered input is never more than a line of text...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   225
		*iOutputLine = iBufferedInput;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   226
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   227
 		iBufferedInput.FillZ();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   228
		iBufferedInput.SetLength(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   229
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   230
	iInputLine = aSourceLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   231
8b14b30db193 201044_02
hgs
parents:
diff changeset
   232
	// discard any LF character from the begining of the line (this is abit strange?)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   233
	while(iInputLine.Length() > 0 && (iInputLine[0] == KImcvLF || iInputLine[0] == KImcvCR))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   234
		iInputLine.Delete(0, 1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   235
8b14b30db193 201044_02
hgs
parents:
diff changeset
   236
	// remove the CR at the end but only if there's stuff before it
8b14b30db193 201044_02
hgs
parents:
diff changeset
   237
	while(iInputLine.Length() > 0 && (iInputLine[iInputLine.Length()-1] == KImcvLF || iInputLine[iInputLine.Length()-1] == KImcvCR))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   238
		iInputLine.Delete(iInputLine.Length()-1, 1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   239
8b14b30db193 201044_02
hgs
parents:
diff changeset
   240
	// if the newly read line is now empty, then don't read any more through this tokeniser
8b14b30db193 201044_02
hgs
parents:
diff changeset
   241
	iLastToken = !iInputLine.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   242
8b14b30db193 201044_02
hgs
parents:
diff changeset
   243
	// only bother with the rest of the parsing if there's any data left
8b14b30db193 201044_02
hgs
parents:
diff changeset
   244
	if(iInputLine.Length() > 0 || iOutputLine->Length() > 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   245
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   246
		// check whether we're on the next field or still on the current one
8b14b30db193 201044_02
hgs
parents:
diff changeset
   247
		if(!iFirstLine && iInputLine.Length() > 0 && iInputLine[0] != KImcvSP && iInputLine[0] != KImcvTab)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   248
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   249
			// we've read the first line of the next field
8b14b30db193 201044_02
hgs
parents:
diff changeset
   250
			iBufferedInput = iInputLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   251
			endOfField = ETrue; // flag the fact that the current field is ready for parsing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   252
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   253
		else // the line belongs in the current field, we need to keep the leading whitespace
8b14b30db193 201044_02
hgs
parents:
diff changeset
   254
			 // Folding headers, RFC 2822, section 2.2.3
8b14b30db193 201044_02
hgs
parents:
diff changeset
   255
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   256
			// make sure we're not about to exceed the buffer
8b14b30db193 201044_02
hgs
parents:
diff changeset
   257
			//Restricting the field size of the header to 5000, to avoid -4 error
8b14b30db193 201044_02
hgs
parents:
diff changeset
   258
			//and which at times ends up in DOS condition [denial of service- user wouldn't be able to download any further mails]. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   259
			if (iOutputLine->Length()<5000)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   260
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   261
				if((iOutputLine->Length() + iInputLine.Length()) > iOutputLine->Des().MaxLength())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   262
					iOutputLine = iOutputLine->ReAllocL(iOutputLine->Length() + iInputLine.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   263
8b14b30db193 201044_02
hgs
parents:
diff changeset
   264
				// now copy the remaining data into the buffer
8b14b30db193 201044_02
hgs
parents:
diff changeset
   265
				iOutputLine->Des().Append(iInputLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   266
			    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
   267
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   268
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   269
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   270
		hitEof = ETrue;		//this means that EEndOfHeader is set if a line of zero length is parsed - ie. (clean CRLF - CRLF) = 0.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   271
	iFirstLine = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   272
8b14b30db193 201044_02
hgs
parents:
diff changeset
   273
	if(endOfField || iLastToken)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   274
		{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   275
		// only parse the input when we have a whole field, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   276
		// or we just found the blank line that
8b14b30db193 201044_02
hgs
parents:
diff changeset
   277
		// separates the body from the header
8b14b30db193 201044_02
hgs
parents:
diff changeset
   278
		if(MatchAndRemoveL(KImcvFromPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   279
			iHeaderPart = EFrom;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   280
		else if(MatchAndRemoveL(KImcvReplyToPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   281
			iHeaderPart = EReplyTo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   282
		else if(MatchAndRemoveL(KImcvToPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   283
			iHeaderPart = ETo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   284
		else if(MatchAndRemoveL(KImcvCcPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   285
			iHeaderPart = ECc;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   286
		else if(MatchAndRemoveL(KImcvBccPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   287
			iHeaderPart = EBcc;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   288
		else if(MatchAndRemoveL(KImcvSubjectPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   289
			iHeaderPart = ESubject;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   290
		else if(MatchAndRemoveL(KImcvDatePrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   291
			iHeaderPart = EDate;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   292
		else if(MatchAndRemoveL(KImcvReceivedPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   293
			iHeaderPart = EReceived;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   294
		else if(MatchAndRemoveL(KImcvMessageIdPrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   295
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   296
			iHeaderPart = EMessageId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   297
			RemoveSurroundingCharacters(KImcvLeftChevron, KImcvRightChevron, *iOutputLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   298
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   299
		else if (PriorityAndReceiptsMatchAndRemoveL(EPriority))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   300
			iHeaderPart=EPriority;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   301
		else if (PriorityAndReceiptsMatchAndRemoveL(EReturnReceiptTo))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   302
			iHeaderPart=EReturnReceiptTo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   303
		else if(hitEof)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   304
			iHeaderPart = EEndOfHeader;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   305
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   306
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   307
			iHeaderPart = EUnknown;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   308
			iImRecvConvert->iMimeParser->ParseLineL(*iOutputLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   309
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   310
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   311
	else 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   312
		iHeaderPart = ENotFinished;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   313
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   314
8b14b30db193 201044_02
hgs
parents:
diff changeset
   315
TBool CRfc822Token::PriorityAndReceiptsMatchAndRemoveL(THeaderPart aPriority)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   316
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   317
	CDesC8Array* fields=new (ELeave)CDesC8ArrayFlat(6);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   318
	CleanupStack::PushL(fields);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   319
	if (aPriority==EPriority)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   320
		CImcvUtils::PriorityFieldsL(*fields);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   321
	else if (aPriority==EReturnReceiptTo)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   322
		CImcvUtils::ReceiptFieldsL(*fields);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   323
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   324
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   325
		CleanupStack::PopAndDestroy(); //fields
8b14b30db193 201044_02
hgs
parents:
diff changeset
   326
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   327
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   328
	TInt count=fields->Count();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   329
	TBool matched=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   330
	for (TInt i=0;i<count;i++)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   331
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   332
		if (MatchAndRemoveL((*fields)[i]))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   333
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   334
			matched=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   335
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   336
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   337
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   338
	CleanupStack::PopAndDestroy(); //fields
8b14b30db193 201044_02
hgs
parents:
diff changeset
   339
	return matched;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   340
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   341
8b14b30db193 201044_02
hgs
parents:
diff changeset
   342
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   343
TBool CRfc822Token::MatchAndRemoveL(const TDesC8& aString)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   344
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   345
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   346
	TInt comparison;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   347
	TInt stringLength = aString.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   348
	TInt desLength = (*iOutputLine).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   349
	TInt compareLength = stringLength > desLength ? desLength : stringLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   350
	TPtrC8 left((*iOutputLine).Left(compareLength));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   351
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   352
	// now see whether the current line contains the search string
8b14b30db193 201044_02
hgs
parents:
diff changeset
   353
	comparison = left.CompareF(aString);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   354
	if(!comparison)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   355
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   356
		// found the match string at the start of the output line, so remove it
8b14b30db193 201044_02
hgs
parents:
diff changeset
   357
		// get rid of any whitespace betweebn the tag and the data while we have a chance
8b14b30db193 201044_02
hgs
parents:
diff changeset
   358
		if (!i822FieldsExist)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   359
			i822FieldsExist=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   360
		TInt whitespaceLength=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   361
		TInt maxLength=desLength-stringLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   362
		const TUint8* ptr = (*iOutputLine).Ptr();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   363
		while(whitespaceLength <= maxLength && (ptr[stringLength+whitespaceLength] == KImcvSP || ptr[stringLength+whitespaceLength] == KImcvTab))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   364
			whitespaceLength++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   365
		(iOutputLine->Des()).Delete(0, stringLength+whitespaceLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   366
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   367
	return (comparison==0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   368
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   369
8b14b30db193 201044_02
hgs
parents:
diff changeset
   370
8b14b30db193 201044_02
hgs
parents:
diff changeset
   371
//****************************************************************************************
8b14b30db193 201044_02
hgs
parents:
diff changeset
   372
//             Class CImRecvConvert
8b14b30db193 201044_02
hgs
parents:
diff changeset
   373
//****************************************************************************************
8b14b30db193 201044_02
hgs
parents:
diff changeset
   374
//----------------------------------------------------------------------------------------    
8b14b30db193 201044_02
hgs
parents:
diff changeset
   375
EXPORT_C CImRecvConvert* CImRecvConvert::NewLC(RFs& anFs, CMsvServerEntry* aServerEntry, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   376
												TUid aMsgType, TMsvId aEmailServiceId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   377
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   378
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   379
	CImRecvConvert* self = new (ELeave) CImRecvConvert(anFs, aServerEntry, aMsgType, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   380
																		aEmailServiceId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   381
	CleanupStack::PushL(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   382
	self->ConstructL(anFs);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   383
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   384
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   385
8b14b30db193 201044_02
hgs
parents:
diff changeset
   386
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   387
EXPORT_C CImRecvConvert* CImRecvConvert::NewL(RFs& anFs, CMsvServerEntry* aServerEntry, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   388
												TUid aMsgType, TMsvId aEmailServiceId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   389
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   390
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   391
	CImRecvConvert* self = CImRecvConvert::NewLC(anFs, aServerEntry, aMsgType, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   392
																aEmailServiceId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   393
	CleanupStack::Pop();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   394
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   395
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   396
8b14b30db193 201044_02
hgs
parents:
diff changeset
   397
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   398
void CImRecvConvert::ConstructL(RFs& anFs)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   399
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   400
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   401
	iFsSession = &anFs;  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   402
8b14b30db193 201044_02
hgs
parents:
diff changeset
   403
	RResourceFile resFile;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   404
	OpenResourceFileL(resFile, anFs);	// NB leaves if file not found
8b14b30db193 201044_02
hgs
parents:
diff changeset
   405
8b14b30db193 201044_02
hgs
parents:
diff changeset
   406
	// make sure the resource file will be closed if anything goes wrong
8b14b30db193 201044_02
hgs
parents:
diff changeset
   407
	// CloseResourceFile is declared in IMUTDLL.H and defined in IMUTDLL.CPP
8b14b30db193 201044_02
hgs
parents:
diff changeset
   408
	TCleanupItem close( CloseResourceFile, &resFile );
8b14b30db193 201044_02
hgs
parents:
diff changeset
   409
	CleanupStack::PushL( close );
8b14b30db193 201044_02
hgs
parents:
diff changeset
   410
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   411
	// Read iStore8BitData flag.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   412
	HBufC8* buf = resFile.AllocReadLC( STORE_8BIT_BODY_TEXT );
8b14b30db193 201044_02
hgs
parents:
diff changeset
   413
	TResourceReader reader;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   414
	reader.SetBuffer(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   415
	iStore8BitData = reader.ReadInt8();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   416
	CleanupStack::PopAndDestroy(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   417
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   418
	//read iStorePlainBodyText flag for writing bodytext chunk by chunk.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   419
	//For Pop case, it always writes bodytext chunk by chunk
8b14b30db193 201044_02
hgs
parents:
diff changeset
   420
	iStorePlainBodyText = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   421
8b14b30db193 201044_02
hgs
parents:
diff changeset
   422
8b14b30db193 201044_02
hgs
parents:
diff changeset
   423
	buf = resFile.AllocReadLC( REMOVED_ATTACHMENT_TAG );
8b14b30db193 201044_02
hgs
parents:
diff changeset
   424
	reader.SetBuffer(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   425
	iRemovedAttachmentTag = reader.ReadTPtrC().AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   426
	CleanupStack::PopAndDestroy(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   427
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   428
	buf = resFile.AllocReadLC( DEFAULT_ATTACHMENT_NAME );
8b14b30db193 201044_02
hgs
parents:
diff changeset
   429
	reader.SetBuffer(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   430
	iDefaultAttachmentName = reader.ReadTPtrC().AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   431
	CleanupStack::PopAndDestroy(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   432
8b14b30db193 201044_02
hgs
parents:
diff changeset
   433
	buf = resFile.AllocReadLC(PARTIAL_DOWNLOAD_FOOTER_MESSAGE);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   434
	reader.SetBuffer(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   435
	if(iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   436
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   437
		iPartialEmailFooter8 = buf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   438
		CleanupStack::Pop(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   439
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   440
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   441
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   442
		iPartialEmailFooter = (reader.ReadTPtrC()).AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   443
		CleanupStack::PopAndDestroy(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   444
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   445
	buf = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   446
	CleanupStack::PopAndDestroy(&resFile); // resFile (Close resfile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   447
8b14b30db193 201044_02
hgs
parents:
diff changeset
   448
	// create CImHeader object to store Rfc822 header info...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   449
	iOutputHeader = CImHeader::NewLC();	// PushL(iHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   450
	CleanupStack::Pop();				// iHeader
8b14b30db193 201044_02
hgs
parents:
diff changeset
   451
	if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   452
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   453
		//Create body text storage helper.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   454
		iBodyText = CMsvBodyText::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   455
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   456
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   457
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   458
		// create CRichText object to store body...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   459
		iParaLayer = CParaFormatLayer::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   460
		iCharLayer = CCharFormatLayer::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   461
		iOutputBody = CRichText::NewL(iParaLayer, iCharLayer);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   462
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   463
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   464
	// Create Rfc822 filter object...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   465
	iRfc822Token = CRfc822Token::NewLC(); // PushL(iRfc822Token)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   466
	CleanupStack::Pop();				  // iRfc822Token
8b14b30db193 201044_02
hgs
parents:
diff changeset
   467
	iRfc822Token->SetImRecvConvert(this);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   468
8b14b30db193 201044_02
hgs
parents:
diff changeset
   469
	// Create converter objects...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   470
	iCharacterConverter = CCnvCharacterSetConverter::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   471
	iCharConv = CImConvertCharconv::NewL(*iCharacterConverter, anFs);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   472
	iHeaderConverter = CImConvertHeader::NewL(*iCharConv); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   473
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   474
	// Create MIME filter object...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   475
	iMimeParser = CMimeParser::NewL(*this);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   476
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   477
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   478
	// logfile stuff
8b14b30db193 201044_02
hgs
parents:
diff changeset
   479
	iImcvLog=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   480
8b14b30db193 201044_02
hgs
parents:
diff changeset
   481
#ifdef __IMUT_LOGGING	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   482
	TRAPD(err,iImcvLog=CImLog::NewL(KLogFilePath, EAppend));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   483
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
   484
8b14b30db193 201044_02
hgs
parents:
diff changeset
   485
	iRootEntryId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   486
8b14b30db193 201044_02
hgs
parents:
diff changeset
   487
	iNotFinishedRfc822Header = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   488
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   489
	iEmailEntry = new (ELeave) TMsvEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   490
	iReceivingHeadersOnly=EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   491
8b14b30db193 201044_02
hgs
parents:
diff changeset
   492
	iParent = new (ELeave) CArrayFixFlat<TParentDetails>(3);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   493
8b14b30db193 201044_02
hgs
parents:
diff changeset
   494
	iFirstBoundaryReached=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   495
8b14b30db193 201044_02
hgs
parents:
diff changeset
   496
	ResetL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   497
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   498
	RECVLOG( KNewLogHeader )
8b14b30db193 201044_02
hgs
parents:
diff changeset
   499
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   500
8b14b30db193 201044_02
hgs
parents:
diff changeset
   501
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   502
CImRecvConvert::CImRecvConvert(RFs& anFs, CMsvServerEntry* aServerEntry, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   503
							   TUid aMsgType, TMsvId aEmailServiceId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   504
				: iServerEntry(aServerEntry), iNewMsgType(aMsgType), iDefaultEntryType(ETextEntry), 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   505
			  	  iEmailServiceId(aEmailServiceId), iAttachmentFile(anFs)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   506
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   507
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   508
	__DECLARE_NAME(_S("CImRecvConvert"));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   509
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   510
8b14b30db193 201044_02
hgs
parents:
diff changeset
   511
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   512
EXPORT_C CImRecvConvert::~CImRecvConvert()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   513
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   514
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   515
	delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   516
	delete iOutputHeader;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   517
	delete iBodyText;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   518
	delete iBodyBuf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   519
	delete iParaLayer;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   520
	delete iCharLayer;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   521
	delete iOutputBody;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   522
	delete iRemovedAttachmentTag;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   523
	delete iDefaultAttachmentName;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   524
	delete iRfc822Token;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   525
	delete iMimeParser;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   526
	delete iHeaderConverter;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   527
	delete iCharConv;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   528
	delete iCharacterConverter;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   529
	delete iAttachmentFullPath;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   530
	delete iImcvUtils;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   531
	delete iParent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   532
	RECVLOG(KDeleted)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   533
	delete iImcvLog;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   534
	delete iPartialEmailFooter8;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   535
	delete iPartialEmailFooter;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   536
	delete iPlainBodyTextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   537
	delete iPartialRetrievalBody;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   538
	iPartialRetrievalBody=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   539
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   540
8b14b30db193 201044_02
hgs
parents:
diff changeset
   541
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   542
EXPORT_C void CImRecvConvert::Cancel()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   543
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   544
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   545
	if(iAttachmentFileState == EFileIsOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   546
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   547
		iAttachmentFileState = EFileIsIncomplete; //because of cancel during download
8b14b30db193 201044_02
hgs
parents:
diff changeset
   548
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   549
	TRAPD(ignore, CloseAttachmentFileL()); //ensure the file is closed, and deleted
8b14b30db193 201044_02
hgs
parents:
diff changeset
   550
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   551
8b14b30db193 201044_02
hgs
parents:
diff changeset
   552
8b14b30db193 201044_02
hgs
parents:
diff changeset
   553
8b14b30db193 201044_02
hgs
parents:
diff changeset
   554
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   555
EXPORT_C void CImRecvConvert::ResetForHeadersL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   556
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   557
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   558
	// This function is used in preference to ResetL() when the owner
8b14b30db193 201044_02
hgs
parents:
diff changeset
   559
	// only wishes to create  email entries in the remote mailbox - 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   560
	// they do not wish to create any stores associated with the message
8b14b30db193 201044_02
hgs
parents:
diff changeset
   561
	// entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   562
	ResetL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   563
	iReceivingHeadersOnly=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   564
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   565
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   566
EXPORT_C void CImRecvConvert::ResetL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   567
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   568
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   569
	RECVLOG(KReset) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   570
8b14b30db193 201044_02
hgs
parents:
diff changeset
   571
	iBodyId = KMsvNullIndexEntryId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   572
	iSizeOfAttachmentsRemoved = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   573
8b14b30db193 201044_02
hgs
parents:
diff changeset
   574
	User::LeaveIfError(iServerEntry->SetEntry(iRootEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   575
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   576
	iReceivingHeadersOnly = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   577
	iMessageEntryCalled = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   578
	iLeaveError = KErrNone; 		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   579
	iCurrentMultipartFolderEntryId = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   580
8b14b30db193 201044_02
hgs
parents:
diff changeset
   581
	TParentDetails parent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   582
	parent.iAttachment = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   583
	parent.iMHTML = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   584
	parent.iICal = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   585
	parent.iVCal = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   586
	parent.iSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   587
	iParent->InsertL(0,parent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   588
8b14b30db193 201044_02
hgs
parents:
diff changeset
   589
	if(iEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   590
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   591
		delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   592
		iEmailEntry = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   593
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   594
	iEmailEntry = new (ELeave) TMsvEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   595
8b14b30db193 201044_02
hgs
parents:
diff changeset
   596
	// "iSavingAttachments" commands this code to store attachments in files.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   597
	// Currently this is always set to ETrue as we intend to save all attachments
8b14b30db193 201044_02
hgs
parents:
diff changeset
   598
	// However, if the user wishes to discard (ie do not save) any 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   599
	// attachments in incoming email messages - then this member variable
8b14b30db193 201044_02
hgs
parents:
diff changeset
   600
	// may be set to EFalse by the inline accessor function "SaveAllAttachments(TBool)"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   601
	iSavingAttachments = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   602
	iAttachmentFileState = EFileIsClosed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   603
8b14b30db193 201044_02
hgs
parents:
diff changeset
   604
	// iLeaveError contains the error value of any functions that leaves (ie CRichText::InsertL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   605
	// or any returned error value that generates a leave from within CImRecvConvert (ie RFile::Create)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   606
8b14b30db193 201044_02
hgs
parents:
diff changeset
   607
	iGlobalIndent = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   608
	iLongestLine = 50;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   609
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   610
	iImPriority = EMsvMediumPriority;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   611
	delete iImcvUtils;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   612
	iImcvUtils = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   613
	iImcvUtils = CImcvUtils::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   614
8b14b30db193 201044_02
hgs
parents:
diff changeset
   615
	// reset internal date
8b14b30db193 201044_02
hgs
parents:
diff changeset
   616
	iTimeDate.UniversalTime();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   617
	iParsedTime=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   618
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   619
	iMimeParser->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   620
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   621
	iNewEntry = EFalse; //EFalse if the entry was moved to. ETrue if the entry was just created
8b14b30db193 201044_02
hgs
parents:
diff changeset
   622
	iTopMessagePart = KMsvNullIndexEntryId; //A value of NULL indicates the next entry created is a main message entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   623
	ResetForNewEntryL(iDefaultEntryType);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   624
	iMIMEPart_822Header = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   625
	iPartialEmail = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   626
8b14b30db193 201044_02
hgs
parents:
diff changeset
   627
	RECVLOG(KReseted) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   628
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   629
8b14b30db193 201044_02
hgs
parents:
diff changeset
   630
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   631
void CImRecvConvert::ResetForNewEntryL(TValidEntryType entryType)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   632
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   633
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   634
	RECVLOG(KResetForNewEntry) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   635
8b14b30db193 201044_02
hgs
parents:
diff changeset
   636
	iFinishedHeader = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   637
8b14b30db193 201044_02
hgs
parents:
diff changeset
   638
	iPreviousLineLength = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   639
	iPreviousTrailingWhitespace = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   640
	iLastChar = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   641
8b14b30db193 201044_02
hgs
parents:
diff changeset
   642
	// Reset the new entry state
8b14b30db193 201044_02
hgs
parents:
diff changeset
   643
	ResetForNonMimeEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   644
8b14b30db193 201044_02
hgs
parents:
diff changeset
   645
	// Clear the storage classes
8b14b30db193 201044_02
hgs
parents:
diff changeset
   646
	iMimeParser->ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   647
	iRfc822Token->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   648
8b14b30db193 201044_02
hgs
parents:
diff changeset
   649
	iEmailPart = KNoPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   650
	iEntryType=entryType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   651
8b14b30db193 201044_02
hgs
parents:
diff changeset
   652
	if (iEntryType==EMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   653
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   654
		iEmailPart = KParentPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   655
		iMimeParser->SetMessageFolderType(EFolderTypeRFC822);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   656
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   657
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   658
8b14b30db193 201044_02
hgs
parents:
diff changeset
   659
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   660
void CImRecvConvert::ResetForNonMimeEntryL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   661
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
   662
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   663
	iEntryType = ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   664
	RECVLOG(KResetForNonMimeEntry) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   665
8b14b30db193 201044_02
hgs
parents:
diff changeset
   666
	iSkipData = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   667
	iPrepared = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   668
	iNewNonMIMEBodyPart=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   669
	iEncounteredLineEndingInCarriageReturn=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   670
8b14b30db193 201044_02
hgs
parents:
diff changeset
   671
	iAlgorithm = ENoAlgorithm;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   672
	iCurrentPartIsRichText = ETrue;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   673
	CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   674
	iEntryDataSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   675
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   676
	if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   677
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   678
		//Create a buffer to hold the body text as it is down loaded.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   679
		delete iBodyBuf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   680
		iBodyBuf = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   681
		iBodyBuf = CBufSeg::NewL(KBodyTextChunkSizeBytes);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   682
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   683
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   684
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   685
		iOutputBody->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   686
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   687
	iAttachmentName.Zero();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   688
	iFinalLine = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   689
8b14b30db193 201044_02
hgs
parents:
diff changeset
   690
	iOutputHeader->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   691
	iEmptyHeaderSize=iOutputHeader->DataSize();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   692
	RECVLOG(KResetedForNonMimeEntry) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   693
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   694
8b14b30db193 201044_02
hgs
parents:
diff changeset
   695
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   696
EXPORT_C TInt CImRecvConvert::ParseNextField(const TDesC8& aSourceLine) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   697
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   698
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   699
	__ASSERT_DEBUG(iRootEntryId!=KMsvNullIndexEntryId, gPanic(KPanicServiceIdNotValid));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   700
	RECVLOG_OUT(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   701
8b14b30db193 201044_02
hgs
parents:
diff changeset
   702
	// If we are temporarily on the null entry then move back to the entry we are working on
8b14b30db193 201044_02
hgs
parents:
diff changeset
   703
	if ((iLeaveError == KErrNone) && (iServerEntry->Entry().Id() == KMsvNullIndexEntryId))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   704
		iLeaveError = iServerEntry->SetEntry(iSavedEntryId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   705
8b14b30db193 201044_02
hgs
parents:
diff changeset
   706
	if(iLeaveError==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   707
		TRAP(iLeaveError, ParseNextLineL(aSourceLine));		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   708
8b14b30db193 201044_02
hgs
parents:
diff changeset
   709
	// Save the current entry id for later.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   710
	if (iLeaveError==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   711
		iSavedEntryId = iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   712
8b14b30db193 201044_02
hgs
parents:
diff changeset
   713
	TUid type = iServerEntry->Entry().iType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   714
	if( type != KUidMsvMessageEntry    &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
   715
		type != KUidMsvEmailTextEntry  &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
   716
		type != KUidMsvEmailHtmlEntry  &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
   717
		type != KUidMsvAttachmentEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   718
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   719
		// Set the current id to null so that we aren't locking any folders
8b14b30db193 201044_02
hgs
parents:
diff changeset
   720
		iServerEntry->SetEntry(KMsvNullIndexEntryId); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   721
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   722
8b14b30db193 201044_02
hgs
parents:
diff changeset
   723
	return iLeaveError;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   724
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   725
8b14b30db193 201044_02
hgs
parents:
diff changeset
   726
8b14b30db193 201044_02
hgs
parents:
diff changeset
   727
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   728
void CImRecvConvert::ParseNextLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   729
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   730
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   731
	iParsedMimeBoundaryLast=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   732
	if(!iFinishedHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   733
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   734
		// start by getting the next token from the header
8b14b30db193 201044_02
hgs
parents:
diff changeset
   735
		iRfc822Token->ParseNextLineL(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   736
8b14b30db193 201044_02
hgs
parents:
diff changeset
   737
		switch(iRfc822Token->iHeaderPart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   738
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   739
			case CRfc822Token::EUnknown:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   740
			case CRfc822Token::ENotFinished:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   741
				RECVLOG(KPartLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   742
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   743
			case CRfc822Token::EFrom:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   744
				iOutputHeader->SetFromL(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   745
				LOGGING(KFound,KImcvFromPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   746
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   747
			case CRfc822Token::EReplyTo:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   748
				iOutputHeader->SetReplyToL(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   749
				LOGGING(KFound,KImcvReplyToPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   750
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   751
			case CRfc822Token::ETo:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   752
				ParseRecipientListL(iOutputHeader->ToRecipients());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   753
				LOGGING(KFound,KImcvToPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   754
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   755
			case CRfc822Token::ECc: 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   756
				ParseRecipientListL(iOutputHeader->CcRecipients());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   757
				LOGGING(KFound,KImcvCcPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   758
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   759
			case CRfc822Token::EBcc: 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   760
				ParseRecipientListL(iOutputHeader->BccRecipients());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   761
				LOGGING(KFound,KImcvBccPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   762
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   763
			case CRfc822Token::ESubject:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   764
				iOutputHeader->SetSubjectL(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   765
				LOGGING(KFound,KImcvSubjectPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   766
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   767
			case CRfc822Token::EDate:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   768
			// if we have not already parsed the date from the received header.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   769
				if(!iParsedTime)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   770
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   771
					iRfc822Date.ParseDateField(*iRfc822Token->OutputLine() , iTimeDate);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   772
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
   773
					//if this is an embedded entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   774
					if (iEmailEntry->Id() != iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   775
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   776
						iEmailEntry->iDate = iTimeDate;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   777
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   778
						
8b14b30db193 201044_02
hgs
parents:
diff changeset
   779
					LOGGING(KFound,KImcvDatePrompt);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   780
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   781
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   782
			case CRfc822Token::EReceived:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   783
				if(!iParsedTime)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   784
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   785
					//	remove the data before the comma, to just leave the date
8b14b30db193 201044_02
hgs
parents:
diff changeset
   786
					TPtr8 ptr(iRfc822Token->OutputLine()->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   787
					TInt lPos=ptr.Locate(';');
8b14b30db193 201044_02
hgs
parents:
diff changeset
   788
8b14b30db193 201044_02
hgs
parents:
diff changeset
   789
					// No point trying to process a date if we did not find the ';' or
8b14b30db193 201044_02
hgs
parents:
diff changeset
   790
					// if there is no data after the ';'
8b14b30db193 201044_02
hgs
parents:
diff changeset
   791
					if ((lPos != KErrNotFound) && (lPos < ptr.Length() - 2))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   792
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   793
						ptr = ptr.Right(ptr.Length()-lPos-2);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   794
						iRfc822Date.ParseDateField(ptr,iTimeDate);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   795
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
   796
						//if this is an embedded entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   797
						if (iEmailEntry->Id() != iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   798
							{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   799
							iEmailEntry->iDate=iTimeDate;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   800
							}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   801
						//indicate that we have the time stamp for the entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   802
						iParsedTime=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   803
						
8b14b30db193 201044_02
hgs
parents:
diff changeset
   804
						LOGGING(KFound,KImcvReceivedPrompt);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   805
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   806
					else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   807
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   808
						LOGGING(KFoundIncomplete, KImcvReceivedPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   809
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   810
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   811
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   812
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   813
			case CRfc822Token::EMessageId:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   814
				iOutputHeader->SetImMsgIdL(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   815
				LOGGING(KFound,KImcvMessageIdPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   816
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   817
			case CRfc822Token::EPriority:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   818
				iImPriority=iImcvUtils->EvaluatePriorityText(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   819
				LOGGING(KFound,KImcvPriorityPrompt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   820
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   821
			case CRfc822Token::EReturnReceiptTo:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   822
				iOutputHeader->SetReceiptAddressL(*iRfc822Token->OutputLine());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   823
				LOGGING(KFound,KReturnReceiptTo);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   824
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   825
			case CRfc822Token::EEndOfHeader:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   826
				// the next line goes in the body part
8b14b30db193 201044_02
hgs
parents:
diff changeset
   827
				iFinishedHeader = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   828
				RECVLOG(KEndOFHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   829
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   830
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   831
				RECVLOG(KEndOFHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   832
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   833
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   834
8b14b30db193 201044_02
hgs
parents:
diff changeset
   835
8b14b30db193 201044_02
hgs
parents:
diff changeset
   836
		if(iRfc822Token->iHeaderPart != CRfc822Token::ENotFinished)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   837
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   838
			// Now that we've used the data, we also need to clear the output line from the tokeniser....
8b14b30db193 201044_02
hgs
parents:
diff changeset
   839
			iRfc822Token->OutputLine()->Des() = KNullDesC8;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   840
8b14b30db193 201044_02
hgs
parents:
diff changeset
   841
			// whatever part we just read, we may also have read the empty line that separates
8b14b30db193 201044_02
hgs
parents:
diff changeset
   842
			// the header from the body
8b14b30db193 201044_02
hgs
parents:
diff changeset
   843
			if((iFinishedHeader = iRfc822Token->LastToken()) != EFalse)	//iFinishedHeader set to 1 on CRLF-
8b14b30db193 201044_02
hgs
parents:
diff changeset
   844
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   845
				RECVLOG(KLastToken);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   846
				iNotFinishedRfc822Header = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   847
8b14b30db193 201044_02
hgs
parents:
diff changeset
   848
				iHeaderConverter->SetMessageType(iMimeParser->MessageIsMime());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   849
				iHeaderConverter->DecodeAllHeaderFieldsL(*iOutputHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   850
8b14b30db193 201044_02
hgs
parents:
diff changeset
   851
				if (iMimeParser->MessageIsMime())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   852
					EndOfHeaderMIMEProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   853
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   854
					EndOfHeaderProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   855
8b14b30db193 201044_02
hgs
parents:
diff changeset
   856
				// CMsvPlainBodyText will be using for storing bodytext in chunks.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   857
				if(iStorePlainBodyText && iEmailEntry->iType==KUidMsvEmailTextEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   858
					{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   859
					iFirstLinePlainText = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   860
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   861
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   862
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   863
					if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   864
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   865
						iBodyText->SetDefaultCharacterSet(iCharConv->SystemDefaultCharset());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   866
						if ( iMimeParser->MessageIsMime() && iMimeParser->ContentType()==EMimeText )
8b14b30db193 201044_02
hgs
parents:
diff changeset
   867
							iBodyText->SetCharacterSet(iMimeParser->CurrentCharsetL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   868
						else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   869
							iBodyText->SetCharacterSet(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   870
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   871
					else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   872
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   873
						// Get charset for decoding.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   874
						if ( iMimeParser->MessageIsMime() && iMimeParser->ContentType()==EMimeText )
8b14b30db193 201044_02
hgs
parents:
diff changeset
   875
							iCharConv->PrepareToConvertToFromOurCharsetL(iMimeParser->CurrentCharsetL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   876
						else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   877
							iCharConv->PrepareToConvertToFromOurCharsetL(iCharConv->SystemDefaultCharset());						
8b14b30db193 201044_02
hgs
parents:
diff changeset
   878
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   879
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   880
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   881
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   882
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   883
	else if (iReceivingHeadersOnly==EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   884
		{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   885
		//Set to EFalse when a single line is to be skipped (ie boundary line)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   886
		iCommitLine=ETrue; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   887
8b14b30db193 201044_02
hgs
parents:
diff changeset
   888
		// read one line of the message body if I am processing a whole email message
8b14b30db193 201044_02
hgs
parents:
diff changeset
   889
		if(iMimeParser->MessageIsMime())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   890
			ParseMimeLineL(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   891
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   892
			ParseBodyLineL(aSourceLine);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   893
8b14b30db193 201044_02
hgs
parents:
diff changeset
   894
		if((iCommitLine)&&(!iSkipData))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   895
			DecodeAndStoreLineL(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   896
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   897
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   898
8b14b30db193 201044_02
hgs
parents:
diff changeset
   899
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   900
EXPORT_C TMsvEmailEntry CImRecvConvert::MessageEntryDetailsL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   901
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   902
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   903
8b14b30db193 201044_02
hgs
parents:
diff changeset
   904
	iMessageEntryCalled=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   905
	CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   906
8b14b30db193 201044_02
hgs
parents:
diff changeset
   907
	// A message requiring manual termination and not part way through a MIME part header
8b14b30db193 201044_02
hgs
parents:
diff changeset
   908
	if( iTopMessagePart==EntryId() && iFinishedHeader) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   909
		StoreEntryStreamsL(KStore822Header|KStoreMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   910
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   911
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   912
		User::LeaveIfError(iServerEntry->SetEntry(iTopMessagePart));         
8b14b30db193 201044_02
hgs
parents:
diff changeset
   913
		if(iEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   914
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   915
			delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   916
			iEmailEntry=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   917
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   918
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   919
		iEmailEntry = new (ELeave) TMsvEmailEntry(iServerEntry->Entry());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   920
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   921
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   922
	return *iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   923
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   924
8b14b30db193 201044_02
hgs
parents:
diff changeset
   925
8b14b30db193 201044_02
hgs
parents:
diff changeset
   926
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   927
EXPORT_C void CImRecvConvert::MessageCompleteL(TMsvEmailEntry aEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   928
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   929
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   930
	// Restore the entry context
8b14b30db193 201044_02
hgs
parents:
diff changeset
   931
	if (iServerEntry->Entry().Id() == KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   932
		User::LeaveIfError(iServerEntry->SetEntry(iSavedEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   933
8b14b30db193 201044_02
hgs
parents:
diff changeset
   934
	__ASSERT_DEBUG(iMessageEntryCalled, gPanic(KPanicMessageEntryNotCalled));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   935
	__ASSERT_DEBUG(aEmailEntry.Id()==iTopMessagePart, gPanic(KPanicMessageEntryIdHasChanged)); // Id should be set to iTopMessagePart
8b14b30db193 201044_02
hgs
parents:
diff changeset
   936
8b14b30db193 201044_02
hgs
parents:
diff changeset
   937
	// Called ResetL() to reset object instead of ResetForHeadersL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   938
	__ASSERT_DEBUG(iReceivingHeadersOnly, gPanic(KPanicIncorrectResetState)); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   939
8b14b30db193 201044_02
hgs
parents:
diff changeset
   940
	if(iEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   941
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   942
		if (iEmailEntry->Id())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   943
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   944
			if(iLeaveError==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   945
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   946
				// a remote email header cannot have any attachments or be marked as complete...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   947
				aEmailEntry.SetAttachment(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   948
				aEmailEntry.SetMHTMLEmail(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   949
				aEmailEntry.SetComplete(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   950
				User::LeaveIfError(iServerEntry->ChangeEntryBulk(aEmailEntry));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   951
				RECVLOG(KHeaderComplete)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   952
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   953
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   954
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   955
				if (!iPopulateMessage)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   956
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   957
					TMsvId currentId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   958
					User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent()));			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   959
					User::LeaveIfError(iServerEntry->DeleteEntry(currentId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   960
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   961
				User::Leave(iLeaveError);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   962
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   963
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   964
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   965
8b14b30db193 201044_02
hgs
parents:
diff changeset
   966
	// Save the entry context and move it to null so that we're not locking any folders
8b14b30db193 201044_02
hgs
parents:
diff changeset
   967
	iSavedEntryId = iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   968
	User::LeaveIfError(iServerEntry->SetEntry(KMsvNullIndexEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   969
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   970
8b14b30db193 201044_02
hgs
parents:
diff changeset
   971
8b14b30db193 201044_02
hgs
parents:
diff changeset
   972
EXPORT_C void CImRecvConvert::MessageCompleteL(TBool aPartialDownload)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   973
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   974
	iPartialEmail=aPartialDownload;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   975
	MessageCompleteL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   976
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   977
8b14b30db193 201044_02
hgs
parents:
diff changeset
   978
8b14b30db193 201044_02
hgs
parents:
diff changeset
   979
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   980
EXPORT_C void CImRecvConvert::MessageCompleteL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   981
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   982
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   983
	// Restore the entry context
8b14b30db193 201044_02
hgs
parents:
diff changeset
   984
	RECVLOG(KStartMessageComplete)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   985
	if (iServerEntry->Entry().Id() == KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   986
		User::LeaveIfError(iServerEntry->SetEntry(iSavedEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   987
8b14b30db193 201044_02
hgs
parents:
diff changeset
   988
	if (iParsedMimeBoundaryLast==EFalse && iAttachmentFileState==EFileIsOpen && iPartialEmail!=EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   989
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   990
		iAttachmentFileState=EFileTopIncomplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   991
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   992
8b14b30db193 201044_02
hgs
parents:
diff changeset
   993
	CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   994
8b14b30db193 201044_02
hgs
parents:
diff changeset
   995
	if(!iEmailEntry->Id())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   996
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   997
8b14b30db193 201044_02
hgs
parents:
diff changeset
   998
	if(iLeaveError!=KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   999
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1000
		User::Leave(iLeaveError);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1001
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1002
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1003
	if (EntryId()!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1004
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1005
		iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1006
		StoreEntryStreamsL(KStoreMIMEHeader | KStoreBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1007
		MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1008
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1009
		if( iTopMessagePart==EntryId() && iFinishedHeader) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1010
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1011
			iEmailEntry->SetVisible(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1012
			iEmailEntry->SetInPreparation(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1013
			iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1014
			iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1015
			if(iEmailEntry->PartialDownloaded())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1016
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1017
				iEmailEntry->SetPartialDownloaded( EFalse );	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1018
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1019
			// Main message.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1020
			StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1021
			return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1022
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1023
		else if(iEmailEntry->iType == KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1024
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1025
			StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1026
			MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1027
			StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1028
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1029
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1030
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1031
	// A message requiring manual termination and not part way through 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1032
	// a MIME part header.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1033
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1034
	User::LeaveIfError(iServerEntry->SetEntry(iTopMessagePart));         
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1035
	if(iEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1036
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1037
		delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1038
		iEmailEntry=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1039
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1040
	iEmailEntry = new (ELeave) TMsvEmailEntry(iServerEntry->Entry());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1041
	iEmailEntry->SetVisible(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1042
	iEmailEntry->SetInPreparation(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1043
	iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1044
	iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1045
	if(iEmailEntry->PartialDownloaded())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1046
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1047
		iEmailEntry->SetPartialDownloaded( EFalse );	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1048
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1049
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1050
	iEmailEntry->SetAttachment(iParent->At(0).iAttachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1051
	iEmailEntry->SetMHTMLEmail(iParent->At(0).iMHTML);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1052
	iEmailEntry->SetVCalendar(iParent->At(0).iVCal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1053
	iEmailEntry->SetICalendar(iParent->At(0).iICal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1054
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1055
	if(iEmailEntry->MHTMLEmail() == EFalse && iEmailEntry->Attachment() == EFalse && iRelatedAttachments !=EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1056
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1057
		iEmailEntry->SetAttachment(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1058
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1059
	iRelatedAttachments=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1060
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1061
	iEmailEntry->iSize=iParent->At(0).iSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1062
	iEmailEntry->SetMessageFolderType(iParent->At(0).iFolder);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1063
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1064
	User::LeaveIfError(iServerEntry->ChangeEntry(*iEmailEntry));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1065
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1066
	// Save the entry context and move it to null so that we're not locking any folders
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1067
	iSavedEntryId = iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1068
	User::LeaveIfError(iServerEntry->SetEntry(KMsvNullIndexEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1069
	RECVLOG(KMessageComplete)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1070
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1071
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1072
EXPORT_C void CImRecvConvert::SetCaf(CImCaf& aCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1073
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1074
Initialise class CimCaf reference
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1075
@param aCaf - Reference to a CAF instance
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1076
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1077
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1078
	iCaf = &aCaf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1079
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1080
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1081
void CImRecvConvert::PrepareDecoder()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1082
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1083
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1084
	switch(iMimeParser->ContentEncoding())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1085
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1086
		case EEncodingTypeNone:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1087
		case EEncodingType7Bit:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1088
		case EEncodingType8Bit:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1089
			iAlgorithm = ENoAlgorithm;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1090
			RECVLOG(KCollectingData7)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1091
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1092
		case EEncodingTypeQP:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1093
			iAlgorithm = EQPDecode;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1094
			RECVLOG(KCollectingDataQP)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1095
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1096
		case EEncodingTypeBASE64:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1097
			iAlgorithm = EBase64Decode;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1098
			RECVLOG(KCollectingBase64)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1099
			break;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1100
		case EEncodingTypeUU:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1101
			iAlgorithm = EUUDecode;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1102
			RECVLOG(KCollectingUU)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1103
			break;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1104
		default:	// EEncodingTypeUnknown, EEncodingTypeNone, EEncodingTypeBinary	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1105
			iAlgorithm = ENoAlgorithm;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1106
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1107
		} // switch
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1108
	iPrepared = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1109
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1110
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1111
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1112
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1113
void CImRecvConvert::DecodeAndStoreLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1114
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1115
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1116
	//If bodytext has been stored using chunk storage mechanism.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1117
	if(iFirstLinePlainText && iEmailEntry->iType==KUidMsvEmailTextEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1118
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1119
		iBodyId = iEmailEntry->Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1120
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1121
		delete iPlainBodyTextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1122
		iPlainBodyTextEntry = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1123
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1124
		iPlainBodyTextEntry = CMsvPlainBodyTextEntry::NewL(iStore8BitData, *iServerEntry, iMimeParser->CurrentCharsetL(), iCharConv->SystemDefaultCharset());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1125
		iFirstLinePlainText = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1126
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1127
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1128
	TInt sourceLineLength=aSourceLine.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1129
	TBool blankLine = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1130
	TBool decodeError = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1131
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1132
	// create a temporary buffer to write the decoded data into. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1133
	// This will always be as long as or shorter than the original.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1134
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1135
	HBufC8* convertedLine = HBufC8::NewLC(sourceLineLength+KConversionRemainderLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1136
	TPtr8 des(convertedLine->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1137
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1138
	if(iFinalLine)						
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1139
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1140
		// We've got to the end of encoded section, so set in order to skip all
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1141
		// trailing empty lines & postamble until we reach the next MIME/UUE boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1142
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1143
		RECVLOG(KSkippingData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1144
		iSkipData = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1145
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1146
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1147
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1148
		switch(iAlgorithm)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1149
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1150
			case EBase64Decode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1151
				RECVLOG(KDecodingBase64);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1152
				// Keep track of the error so we don't append junk to the body-text
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1153
				decodeError = iB64Codec.Decode(aSourceLine, des); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1154
				RECVLOG(KDecodedBase64);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1155
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1156
			case EUUDecode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1157
				RECVLOG(KDecodingUU);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1158
				//used to end a Mime encoded UU section else no purpose
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1159
				iFinalLine=(aSourceLine.CompareF(KImcvUueLastLine)==0);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1160
				if(iFinalLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1161
					iCommitLine=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1162
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1163
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1164
					//returns True on invalid data
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1165
					if((!iFinalLine)&&(iUUCodec.Decode(aSourceLine, des))) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1166
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1167
						RECVLOG(KUUEDataCorrupt)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1168
						if(iAttachmentFileState==EFileIsOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1169
							{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1170
							iAttachmentFileState=EFileIsCorrupt;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1171
							iLeaveError=KErrCorrupt;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1172
							CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1173
							}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1174
						else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1175
							User::Leave(KErrCorrupt);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1176
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1177
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1178
				RECVLOG(KDecodedUU);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1179
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1180
			case EQPDecode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1181
				RECVLOG(KDecodingQP);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1182
				iQPCodec.Decode(aSourceLine, des);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1183
				RECVLOG(KDecodedQP);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1184
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1185
			case ENoAlgorithm:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1186
				{				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1187
				// If the data is to be stored in CRichText clean it up before copying it to the buffer
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1188
				TLex8 lex(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1189
				blankLine=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1190
				while(blankLine && !lex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1191
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1192
					blankLine = (lex.Peek()==KImcvSP || lex.Peek()==KImcvTab 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1193
						|| lex.Peek()==KImcvCR || lex.Peek()==KImcvLF);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1194
					lex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1195
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1196
				des.Copy(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1197
				}				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1198
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1199
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1200
			} // end switch
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1201
		// Commits the decoded data to the appropriate store or trashes the line 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1202
		if(iCommitLine && !decodeError) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1203
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1204
			if (iLeftOver.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1205
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1206
				des.Insert(0, iLeftOver);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1207
				iLeftOver.SetLength(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1208
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1209
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1210
			if(iCurrentPartIsRichText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1211
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1212
				if (iBodyId==KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1213
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1214
					iBodyId = iEmailEntry->Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1215
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1216
				//Store bodytext to message store as chunks.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1217
				if(iStorePlainBodyText && iEmailEntry->iType==KUidMsvEmailTextEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1218
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1219
					iPlainBodyTextEntry->AddChunkL(des);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1220
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1221
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1222
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1223
 					if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1224
						iBodyBuf->InsertL(iBodyBuf->Size(), des);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1225
					else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1226
						WriteToBodyL(des, blankLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1227
						
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1228
					}			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1229
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1230
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1231
				WriteToAttachmentL(des);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1232
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1233
		} // end else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1234
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1235
	CleanupStack::PopAndDestroy(); // convertedLine
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1236
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1237
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1238
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1239
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1240
void CImRecvConvert::ParseMimeLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1241
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1242
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1243
	iTopPartialDownloadCounter+=aSourceLine.Length(); // increment the number of bytes of the attachment downloaded so far
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1244
	if(!iMimeParser->IsBoundary(aSourceLine))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1245
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1246
		if(!iPrepared) // first line of the body
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1247
			{		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1248
			if (iMIMEPart_822Header)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1249
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1250
				// missing 822 part header. Revert to default.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1251
				EndOfHeaderMIMEProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1252
				iMIMEPart_822Header=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1253
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1254
			PrepareDecoder();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1255
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1256
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1257
		if (CheckUUEStartL(aSourceLine))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1258
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1259
			iAlgorithm=EUUDecode;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1260
			iCommitLine=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1261
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1262
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1263
		/* since aSourceLine is a body part here, Set iSkipData to false,  */	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1264
		iSkipData=EFalse; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1265
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1266
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1267
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1268
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1269
		iParsedMimeBoundaryLast=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1270
		// found a MIME boundary so store the current parts data and update its entry.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1271
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1272
		RECVLOG(KFoundMIMEBoundary)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1273
		iCommitLine=EFalse; //Dont store this line as its a boundary.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1274
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1275
		if(!iFirstBoundaryReached && iEntryType==EFolderEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1276
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1277
			iFirstBoundaryReached=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1278
			if (!iCurrentMultipartFolderEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1279
				iCurrentMultipartFolderEntryId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1280
			MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1281
			ResetForNewEntryL(iDefaultEntryType);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1282
			return; // First boundary encountered.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1283
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1284
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1285
		CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1286
		if(iNewEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1287
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1288
			iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1289
			iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1290
			StoreEntryStreamsL(KStoreMIMEHeader | KStoreBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1291
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1292
			if (iBodyId==KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1293
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1294
				iBodyId=iEmailEntry->Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1295
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1296
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1297
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1298
		iSkipData = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1299
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1300
		// check whether we just found the terminating boundary...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1301
		if(iMimeParser->IsTerminatingBoundary())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1302
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1303
			RECVLOG(KRemoveBoundary);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1304
			iMimeParser->RemoveBoundary();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1305
			RECVLOG(KRemovedBoundary);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1306
			iMIMEPart_822Header = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1307
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1308
			if (EntryId()!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1309
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1310
				if(iEmailPart==KParentPart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1311
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1312
					// rfc822 message which is not  not multipart.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1313
					iEmailPart=KNoPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1314
					MoveToParentEntryL();				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1315
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1316
					// Embedded message
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1317
					iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1318
					iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1319
					StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1320
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1321
				else if (iEmailEntry->iType==KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1322
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1323
					// Moving up from a multi embedded rfc822 message.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1324
					iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1325
					iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1326
					StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1327
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1328
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1329
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1330
			MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1331
			iEntryDataSize = iEmailEntry->iSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1332
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1333
			if(iServerEntry->Entry().iType == KUidMsvFolderEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1334
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1335
				iCurrentMultipartFolderEntryId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1336
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1337
			else if (EntryId()!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1338
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1339
				if(iEmailEntry->iType == KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1340
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1341
					iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1342
					iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1343
					StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1344
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1345
				MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1346
				iEntryDataSize += iEmailEntry->iSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1347
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1348
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1349
			if(!iNewEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1350
				ResetForNonMimeEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1351
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1352
			RECVLOG(KSkippingData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1353
			iSkipData = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1354
			iDefaultEntryType=ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1355
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1356
		else // if regular boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1357
			{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1358
			RECVLOG(KSectionHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1359
			if(iEmailPart==KParentPart && EntryId()!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1360
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1361
				// rfc822 message which is not  not multipart.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1362
				iEmailPart=KNoPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1363
				MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1364
				// Embedded message
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1365
				iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1366
				iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1367
				StoreMessageEntryDetailsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1368
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1369
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1370
			if (!iCurrentMultipartFolderEntryId && iEmailPart==KNoPart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1371
				MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1372
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1373
			ResetForNewEntryL(iDefaultEntryType);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1374
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1375
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1376
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1377
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1378
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1379
void CImRecvConvert::EndOfHeaderProcessingL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1380
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1381
	{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1382
	CreateEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1383
	StoreEntryStreamsL(KStore822Header);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1384
	iEntryDataSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1385
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1386
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1387
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1388
// Have just finished processing header, what next.. ?
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1389
// All MIME entry entry creation takes place here.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1390
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1391
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1392
void CImRecvConvert::EndOfHeaderMIMEProcessingL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1393
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1394
	{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1395
	if (iMimeParser->IsMessageDigest())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1396
		iDefaultEntryType=EMessageEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1397
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1398
	if (iMimeParser->VCard() || iMimeParser->VCalendar() || iMimeParser->ICalendar())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1399
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1400
		iCurrentPartIsRichText = EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1401
		iEntryType = EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1402
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1403
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1404
	// Don't create entry if an embedded message header. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1405
	if (!iMIMEPart_822Header || iTopMessagePart==EntryId() )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1406
		CreateEntryL(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1407
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1408
	if (!iMIMEPart_822Header && !iMimeParser->MimeFieldsExist() && iDefaultEntryType==EMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1409
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1410
		// MIME header not present. So expecting embedded 822 header
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1411
		iEmailPart = KParentPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1412
		iMIMEPart_822Header=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1413
		iEntryType=ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1414
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1415
	else if (iMimeParser->ContentType()==EMimeMessage)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1416
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1417
		// Having received A MIME header of type message/..., store and continue.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1418
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1419
		StoreEntryStreamsL(KStore822Header|KStoreMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1420
		iMimeParser->ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1421
		iMIMEPart_822Header=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1422
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1423
		// Non-multipart embedded message.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1424
		if (iTopMessagePart==EntryId())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1425
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1426
			iEntryType = EMessageEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1427
			ResetForNonMimeEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1428
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1429
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1430
			iEntryType=ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1431
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1432
	else if ( (iTopMessagePart==EntryId() || iMIMEPart_822Header)&&(!iReceivingHeadersOnly) )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1433
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1434
		// Main rfc822 header or embedded header.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1435
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1436
		TImEmailFolderType folderType=iMimeParser->MessageFolderType();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1437
		if (iMIMEPart_822Header)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1438
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1439
			iEmailEntry->iDetails.Set(iOutputHeader->From());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1440
			iEmailEntry->iDescription.Set(iOutputHeader->Subject());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1441
			iMIMEPart_822Header=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1442
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1443
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1444
		if (iRfc822Token->i822FieldsExist)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1445
			StoreEntryStreamsL(KStore822Header|KStoreMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1446
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1447
			StoreEntryStreamsL(KStoreMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1448
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1449
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1450
		if (iMimeParser->ContentType()==EMimeMultipart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1451
			{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1452
			RECVLOG(KSkippingData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1453
			ResetForNewEntryL(EFolderEntry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1454
			iMimeParser->SetMessageFolderType(folderType);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1455
			iSkipData = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1456
			iEmailPart = KMultiPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1457
			iCurrentMultipartFolderEntryId=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1458
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1459
		else 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1460
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1461
			// Not multipart but some header data to store.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1462
			iEntryDataSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1463
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1464
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1465
		CreateEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1466
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1467
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1468
	iRfc822Token->i822FieldsExist=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1469
	iMimeParser->ResetMimeFieldsExist();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1470
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1471
	iFinishedHeader = iMIMEPart_822Header ? EFalse:ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1472
	iSkipData = iMimeParser->ContentType()==EMimeMultipart ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1473
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1474
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1475
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1476
// Non Mime body parsing
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1477
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1478
void CImRecvConvert::ParseBodyLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1479
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1480
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1481
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1482
	TInt len=aSourceLine.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1483
	iTopPartialDownloadCounter+=len; // added for TOP. increment the number of bytes of the attachment downloaded so far
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1484
	TMsvId id=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1485
	if (iBodyId==KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1486
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1487
		iBodyId=iEmailEntry->Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1488
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1489
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1490
	// first check whether this line is a UUEncode start boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1491
	if(CheckUUEStartL(aSourceLine)) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1492
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1493
		RECVLOG(KFoundUUEStartBoundary)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1494
		TFileName tempStore = iAttachmentName;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1495
		id = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1496
		if (!iNewNonMIMEBodyPart || id!=iTopMessagePart) // main message entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1497
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1498
			iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1499
			iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1500
			StoreEntryStreamsL(KStoreBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1501
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1502
		MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1503
		if ( !CreateNonMIMEFolderEntryL(id))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1504
			ResetForNonMimeEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1505
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1506
		iEntryType = EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1507
		CreateEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1508
		SetAttachmentName(tempStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1509
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1510
		iCurrentPartIsRichText = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1511
		iAlgorithm=EUUDecode;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1512
		iCommitLine=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1513
		if(!iSavingAttachments)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1514
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1515
			RECVLOG(KSkippingData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1516
			iSkipData=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1517
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1518
		iNewNonMIMEBodyPart=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1519
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1520
	else if(aSourceLine.CompareF(KImcvUueEnd)==0) // Checks for the UUEncode end boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1521
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1522
		RECVLOG(KFoundUUEEndBoundary)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1523
		CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1524
		StoreEntryDataL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1525
		MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1526
		iSkipData = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1527
		iCommitLine=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1528
		iNewNonMIMEBodyPart=ETrue; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1529
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1530
	else if (iNewNonMIMEBodyPart && !( len==2 && aSourceLine[0]==KImcvCR && aSourceLine[1]==KImcvLF ))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1531
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1532
		id = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1533
		if (!iNewNonMIMEBodyPart || id!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1534
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1535
			iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1536
			iEmailEntry->SetBodyTextComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1537
			StoreEntryStreamsL(KStoreBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1538
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1539
		MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1540
		if ( !CreateNonMIMEFolderEntryL(id))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1541
			ResetForNonMimeEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1542
		iAlgorithm=ENoAlgorithm;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1543
		iEntryType = ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1544
		CreateEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1545
		iNewNonMIMEBodyPart=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1546
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1547
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1548
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1549
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1550
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1551
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1552
TBool CImRecvConvert::CreateNonMIMEFolderEntryL(TMsvId aCurrentId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1553
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1554
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1555
	if ( aCurrentId==iTopMessagePart || iCurrentMultipartFolderEntryId )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1556
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1557
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1558
	// Create Folder.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1559
	iServerEntry->SetEntry(iTopMessagePart); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1560
	iEmailPart = KMultiPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1561
	iEntryType = EFolderEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1562
	CreateEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1563
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1564
	// Move existing child entry under folder.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1565
	TMsvId destId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1566
	iServerEntry->SetEntry(iTopMessagePart); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1567
	iServerEntry->MoveEntryWithinService(aCurrentId, destId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1568
	User::LeaveIfError(iServerEntry->SetEntry(aCurrentId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1569
	User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent())); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1570
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1571
	// Create MimeHeader.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1572
	iEmailEntry->SetMessageFolderType(iMimeParser->MessageFolderType());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1573
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1574
	RECVLOG(KResetForNewEntry) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1575
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1576
	iMimeParser->ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1577
	if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1578
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1579
		//Create a buffer to hold the body text as it is down loaded.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1580
		delete iBodyBuf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1581
		iBodyBuf = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1582
		iBodyBuf = CBufFlat::NewL(KBodyTextChunkSizeBytes);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1583
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1584
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1585
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1586
		iOutputBody->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1587
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1588
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1589
	ResetForNonMimeEntryL(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1590
	RECVLOG(KResetedForNewEntry) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1591
	return ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1592
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1593
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1594
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1595
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1596
TBool CImRecvConvert::CreateAttachmentL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1597
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1598
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1599
	// Get and set Attachment File path
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1600
	// added to support TOP command. Reset the download counter each time we have a new
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1601
	// attachment
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1602
	iTopPartialDownloadCounter = 0; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1603
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1604
	// Need to check that the complete filename: iAttachmentFullPath & iAttachmentName	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1605
	// does not exceed 256 characters. Greater than this and it cannot be saved as a file.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1606
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1607
	TBool addExtension=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1608
	if(iAttachmentName.Length() == 0)	//i.e. problem with Attachment name
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1609
	    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1610
		// No filename present. Generate one.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1611
		if(iMimeParser->ContentDescription().Length()!=0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1612
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1613
			// Use ContentDescription() as default name 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1614
			// - as this is more informative than the default
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1615
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1616
			TLex sourceLineLex = iMimeParser->ContentDescription();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1617
			ExtractFilename(sourceLineLex, iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1618
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1619
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1620
			iAttachmentName = *iDefaultAttachmentName;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1621
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1622
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1623
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1624
		// Filename present. Check it is valid.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1625
		ReplaceInvalidCharacters(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1626
		if (iAttachmentName.Locate(KImcvFullStop)!=KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1627
			addExtension=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1628
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1629
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1630
	// Check length.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1631
	TInt maxFilenameLength = KMaxFileName-KMaxExtensionLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1632
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1633
	// Truncate filename if too long.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1634
	if (maxFilenameLength < iAttachmentName.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1635
		iAttachmentName.SetLength(maxFilenameLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1636
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1637
	if (addExtension)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1638
		AddFileExtension();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1639
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1640
	CMsvStore* store = iServerEntry->EditStoreL(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1641
	CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1642
	CMsvAttachment* attachment = CMsvAttachment::NewL(CMsvAttachment::EMsvFile);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1643
	CleanupStack::PushL(attachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1644
	attachment->SetAttachmentNameL(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1645
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1646
	// DEF071099 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1647
	HBufC8* buf = HBufC8::NewLC(iMimeParser->ContentSubType().Length() + iMimeParser->ContentTypeDescription().Length() + 1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1648
	TPtr8 ptr(buf->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1649
	ptr.Copy(iMimeParser->ContentTypeDescription());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1650
	ptr.Append(KImcvForwardSlash);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1651
	ptr.Append(iMimeParser->ContentSubType());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1652
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1653
	attachment->SetMimeTypeL(ptr);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1654
	CleanupStack::PopAndDestroy(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1655
	// DEF071099	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1656
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1657
	RFile file;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1658
	// Behaviour for attachment creation alters if it's a CAF session
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1659
	if(ImCafRegistered())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1660
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1661
		iCaf->PrepareProcessingL(); // Init the CAF session
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1662
		RFile startFile;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1663
		TFileName suggestedFileName;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1664
		if(iCaf->GetSuggestedAttachmentFileName(suggestedFileName) == KErrNone) // CAF agent may provide a filename
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1665
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1666
			store->CreateShareProtectedAttachmentL(suggestedFileName,startFile,attachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1667
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1668
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1669
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1670
			store->CreateShareProtectedAttachmentL(iAttachmentName,startFile,attachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1671
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1672
		iCaf->StartProcessing(iDefaultAttachmentName->Des(),attachment->FilePath(),*iServerEntry,startFile); // Init the CAF session
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1673
		startFile.Close(); // Safe to close as CimCaf Duplicate()'s
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1674
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1675
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1676
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1677
		// Normal behaviour
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1678
		store->AttachmentManagerExtensionsL().CreateAttachmentL(iAttachmentName,file,attachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1679
		iAttachmentFile.SetFileHandle(file,TImAttachmentFile::EImFileWrite);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1680
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1681
	// CreateAttachmentL takes ownership of CMsvAttachment so if call was successful we can pop it here
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1682
	CleanupStack::Pop(attachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1683
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1684
	store->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1685
	CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1686
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1687
	if(KErrNone!=iLeaveError)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1688
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1689
		iAttachmentFileState=EFileFailedToOpen;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1690
		CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1691
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1692
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1693
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1694
	iAttachmentFileState=EFileIsOpen;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1695
	return ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1696
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1697
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1698
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1699
void CImRecvConvert::WriteToAttachmentL(const TDesC8& text)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1700
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1701
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1702
	if ( (iAttachmentFileState==EFileIsClosed || iAttachmentFileState==EFileNotOpen) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1703
		&& CreateAttachmentL() && iEntryType!=EHtmlEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1704
			iEmailEntry->SetAttachment(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1705
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1706
	if(iAttachmentFileState!=EFileIsOpen || !text.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1707
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1708
		RECVLOG(KSkippingData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1709
		iSkipData = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1710
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1711
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1712
	// write decoded data into a file if there is any data there to write.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1713
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1714
	RECVLOG(KWritingToFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1715
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1716
	// Convert text before writing to attachment.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1717
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1718
	if(ImCafProcessing())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1719
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1720
		iLeaveError = iCaf->WriteData(text);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1721
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1722
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1723
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1724
		iLeaveError=iAttachmentFile.WriteFile(text);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1725
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1726
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1727
	if(KErrNone==iLeaveError)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1728
		iEntryDataSize += text.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1729
	else	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1730
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1731
		// the file write failed (eg.there is no space left), set new file state and skip 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1732
		RECVLOG(KFailedToWriteToFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1733
		iAttachmentFileState=EFileIsIncomplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1734
		CloseAttachmentFileL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1735
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1736
	RECVLOG(KWroteToFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1737
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1738
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1739
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1740
void CImRecvConvert::CloseAttachmentFileL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1741
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1742
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1743
	// If anything bad happened a message is sent to the parts CRichText
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1744
	switch(iAttachmentFileState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1745
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1746
		case EFileNotOpen:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1747
			iAttachmentFileState=EFileIsClosed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1748
		case EFileIsClosed: //do nothing - this shouldn't happen	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1749
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1750
		case EFileIsOpen:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1751
			// SUCCESSFUL attachment decode
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1752
			RECVLOG(KClosingAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1753
			if(ImCafProcessing())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1754
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1755
				iCaf->EndProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1756
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1757
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1758
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1759
				iAttachmentFile.CloseFile();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1760
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1761
			iAttachmentFileState=EFileIsClosed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1762
			iEmailEntry->SetComplete(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1763
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1764
		case EFileIsIncomplete:		// file write failed
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1765
		case EFileFailedToOpen:		// can't open attach file
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1766
		case EFileIsCorrupt:		// UU data being decoded is corrupt
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1767
			RECVLOG(KClosingAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1768
			if(ImCafProcessing())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1769
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1770
				iCaf->EndProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1771
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1772
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1773
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1774
				iAttachmentFile.CloseFile();	//file has to be closed before it can be deleted
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1775
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1776
			RECVLOG(KDeletingAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1777
			{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1778
			// NOTE - need the braces to stop error for re-definition of store
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1779
			CMsvStore* store = iServerEntry->EditStoreL(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1780
			CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1781
			// v2 supports multiple attachments under one attachment entry 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1782
			TInt attachmentCount = store->AttachmentManagerL().AttachmentCount();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1783
			for(TInt i=0;i<attachmentCount;i++)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1784
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1785
				// Remove [0] as array is shuffled. Once index[n] is removed n+1 becomes n
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1786
				store->AttachmentManagerExtensionsL().RemoveAttachmentL(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1787
				}			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1788
			if(attachmentCount)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1789
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1790
				store->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1791
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1792
			CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1793
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1794
			iEmailEntry->SetAttachment(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1795
			iAttachmentFileState=EFileIsClosed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1796
			RECVLOG(KDeletedAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1797
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1798
			if(iSavingAttachments && !iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1799
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1800
				WriteToBodyL(KImcvParagraph);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1801
				WriteToBodyL(*iRemovedAttachmentTag);	//lost attachment - notify user
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1802
				TBuf8<KMaxFileName> name;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1803
				name.Copy(iAttachmentName); //16 to 8
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1804
				WriteToBodyL(name);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1805
				WriteToBodyL(KImcvParagraph);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1806
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1807
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1808
			User::Leave(iLeaveError);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1809
			// Skip any remaining encoded data in message
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1810
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1811
		case EFileTopIncomplete:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1812
			RECVLOG(KClosingAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1813
			if(ImCafProcessing())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1814
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1815
				iCaf->EndProcessingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1816
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1817
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1818
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1819
				iAttachmentFile.CloseFile();	//file has to be closed before it can be deleted
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1820
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1821
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1822
			// added for TOP command. Ensure we know correct amount of data for later redownload
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1823
			iSizeOfAttachmentsRemoved+=iTopPartialDownloadCounter;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1824
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1825
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1826
			RECVLOG(KDeletingAttachFile)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1827
			{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1828
			// NOTE - need the braces to stop error for re-definition of store
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1829
			CMsvStore* store = iServerEntry->EditStoreL(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1830
			CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1831
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1832
			TInt attachmentCount = store->AttachmentManagerL().AttachmentCount();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1833
			for(TInt i=0;i<attachmentCount;i++)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1834
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1835
				// Remove [0] as array is shuffled. Once index[n] is removed n+1 becomes n
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1836
				store->AttachmentManagerExtensionsL().RemoveAttachmentL(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1837
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1838
			if(attachmentCount)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1839
				{			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1840
				store->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1841
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1842
			CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1843
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1844
			iEmailEntry->SetAttachment(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1845
			iAttachmentFileState=EFileIsClosed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1846
			RECVLOG(KDeletedAttachFile);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1847
			TMsvId id = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1848
			TMsvId parent = iServerEntry->Entry().Parent();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1849
			MoveToParentEntryL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1850
			TMsvId setTo=iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1851
			if(setTo!=parent)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1852
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1853
				iServerEntry->SetEntry(parent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1854
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1855
			User::LeaveIfError(iServerEntry->DeleteEntry(id));			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1856
			iServerEntry->SetEntry(setTo);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1857
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1858
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1859
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1860
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1861
//----------------------------------------------------------------------------------------  				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1862
TBool CImRecvConvert::LineIsAllWhitespace()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1863
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1864
	{// returns 1 if all elements of the current line are whitespace
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1865
	TBool	spaceFound = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1866
	TLex8	aLex = iLineLex;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1867
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1868
	while (spaceFound && aLex.Peek()!=KImcvCR)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1869
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1870
		if (aLex.Peek()==KImcvSP)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1871
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1872
			spaceFound = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1873
			aLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1874
			}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1875
		else spaceFound = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1876
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1877
	return (spaceFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1878
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1879
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1880
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1881
TBool CImRecvConvert::CheckUUEStartL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1882
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1883
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1884
	// Checks if the descriptor contains the UUE begin header
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1885
	// Extracts the file name if it is
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1886
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1887
	TInt sourceLength = aSourceLine.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1888
	if(sourceLength < KImcvUueStart().Length()+3) // can't be it, it's not long enough
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1889
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1890
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1891
	if(!aSourceLine.Left(KImcvUueStart().Length()).CompareF(KImcvUueStart)) // start of line might be UUE boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1892
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1893
		// we also need to check that the next three chars are numbers - Unix file access code
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1894
		const TUint8* _ptr = aSourceLine.Ptr();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1895
		TInt length=KImcvUueStart().Length();// this defines length as 6 ie. "b e g i n  " 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1896
		if(TChar(_ptr[length]).IsDigit() && TChar(_ptr[length+1]).IsDigit() && TChar(_ptr[length+2]).IsDigit())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1897
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1898
			// we've found 'begin ###' at the start of a line -
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1899
			// that's about as good as we can do 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1900
			// now grab the file name and paste it into the document
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1901
			// Extract filename from string, removing any surrounding quote marks
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1902
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1903
			HBufC16* pBuf16 = HBufC16::NewLC(aSourceLine.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1904
			pBuf16->Des().Copy(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1905
			TLex sourceLineLex = pBuf16->Ptr();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1906
			//parse until start of filename and mark
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1907
			length+=3;					// length (init'd to 6 above) now equals 9 ie. "begin ###"
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1908
			sourceLineLex.Inc(length);	// skips "begin ###"
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1909
			sourceLineLex.SkipSpace();	// skips any leading whitespace
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1910
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1911
			ExtractFilename(sourceLineLex, iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1912
			CleanupStack::PopAndDestroy(); // pBuf8
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1913
			return ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1914
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1915
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1916
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1917
	return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1918
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1919
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1920
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1921
void CImRecvConvert::AddFileExtension()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1922
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1923
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1924
	switch (iMimeParser->ContentType())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1925
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1926
		case EMimeText:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1927
			// Add on extension to make opening file from email editor possible.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1928
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1929
			if ( iMimeParser->ContentSubType()==KImcvHtml )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1930
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1931
				iAttachmentName.Append(KHtmlExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1932
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1933
			else if ( iMimeParser->ContentSubType()==KImcvRtf )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1934
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1935
				iAttachmentName.Append(KRtfExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1936
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1937
			else if (iMimeParser->VCard())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1938
 				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1939
 				iAttachmentName.Append(KVCardExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1940
 				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1941
			else if (iMimeParser->VCalendar())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1942
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1943
				iAttachmentName.Append(KVCalExtension);					
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1944
				}				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1945
			else if (iMimeParser->ICalendar())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1946
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1947
				iAttachmentName.Append(KICalExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1948
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1949
			else //if ( iMimeParser->ContentSubType()==KImcvPlain)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1950
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1951
				iAttachmentName.Append(KTextExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1952
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1953
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1954
		case EMimeImage:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1955
		case EMimeAudio:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1956
		case EMimeVideo:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1957
			if ( (iMimeParser->ContentSubType()==KImcvBmp) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1958
					|| (iMimeParser->ContentSubType()==KImcvGif)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1959
					|| (iMimeParser->ContentSubType()==KImcvJpeg)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1960
					|| (iMimeParser->ContentSubType()==KImcvTiff)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1961
					|| (iMimeParser->ContentSubType()==KImcvWav) )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1962
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1963
				TBuf<KMaxExtensionLength> buf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1964
				buf.Copy(iMimeParser->ContentSubType());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1965
				iAttachmentName.Append(KImcvFullStop);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1966
				iAttachmentName.Append(buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1967
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1968
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1969
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1970
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1971
		} // End switch
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1972
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1973
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1974
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1975
void CImRecvConvert::WriteToBodyL(const TDesC8& aText, TBool aBlankLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1976
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1977
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1978
	RECVLOG(KWritingToBody)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1979
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1980
	if(aText.Length() && aText[aText.Length()-1]==CEditableText::ELineBreak )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1981
		RECVLOG(KLineHasLineBreak)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1982
	TInt pos = iOutputBody->DocumentLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1983
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1984
	// Add bits of body text, converting along the way, till no characters left
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1985
	// .. to convert.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1986
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1987
	if(aBlankLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1988
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1989
		RECVLOG(KBlankLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1990
		iOutputBody->InsertL(pos, CEditableText::EParagraphDelimiter);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1991
		pos++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1992
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1993
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1994
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1995
	// Convert text before writing to body.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1996
	TInt rem = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1997
	HBufC16* text16=HBufC16::NewLC(aText.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1998
	TPtr16 ptr16(text16->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1999
	TInt unconvertedChars, firstPos; // not used 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2000
	rem = iCharConv->ConvertToOurCharsetL(aText, ptr16, unconvertedChars, firstPos);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2001
	if (rem < 0) // error
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2002
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2003
		// Copy unconverted characters.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2004
		Append(ptr16, aText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2005
		iOutputBody->InsertL(pos, ptr16);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2006
		CleanupStack::PopAndDestroy(); // text16
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2007
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2008
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2009
	else if (rem && rem < KConversionRemainderLength)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2010
		iLeftOver.Copy(aText.Right(rem));	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2011
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2012
	// Make sure that the line is not CRLF terminated 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2013
	// - replace with a line break if necessary.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2014
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2015
	TInt length = ptr16.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2016
	switch(iAlgorithm)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2017
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2018
		case EBase64Decode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2019
		case EUUDecode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2020
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2021
			// Check for CRLF throughout the string.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2022
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2023
			if (!length)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2024
				break; // String length zero.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2025
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2026
			if (iEncounteredLineEndingInCarriageReturn)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2027
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2028
				pos--; // overwrite the stored CR.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2029
				ptr16[0] = CEditableText::ELineBreak;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2030
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2031
			iEncounteredLineEndingInCarriageReturn = ptr16[length-1]==KImcvCR ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2032
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2033
			TInt start = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2034
			TInt offset = ptr16.Find(KImcvCRLF16);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2035
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2036
			while (offset != KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2037
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2038
				ptr16[offset] = CEditableText::ELineBreak;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2039
				const TDesC& buf = ptr16.Mid(start, offset-start+1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2040
				iOutputBody->InsertL(pos, buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2041
				pos += buf.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2042
				start=offset+2; // Skip the LF char.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2043
				offset = ptr16.Find(KImcvCRLF16);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2044
				} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2045
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2046
			if (start<length)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2047
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2048
				const TDesC& buf = ptr16.Right(length-start);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2049
				iOutputBody->InsertL(pos, buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2050
				pos += buf.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2051
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2052
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2053
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2054
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2055
		case EQPDecode:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2056
		case ENoAlgorithm:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2057
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2058
			// Check for CRLF at end of line.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2059
			if(length>=2 && ptr16[length-2]==KImcvCR && ptr16[length-1]==KImcvLF)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2060
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2061
				ptr16[length-2] = CEditableText::ELineBreak;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2062
				ptr16.SetLength(length-1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2063
				}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2064
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2065
			const TDesC& buf = text16->Des();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2066
			iOutputBody->InsertL(pos, buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2067
			pos += buf.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2068
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2069
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2070
	CleanupStack::PopAndDestroy(text16);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2071
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2072
	RECVLOG(KWroteToBody)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2073
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2074
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2075
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2076
void CImRecvConvert::WriteToBodyL(const TDesC16& aText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2077
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2078
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2079
	RECVLOG(KWritingToBody)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2080
	if (aText.Length() && aText[aText.Length()-1]==CEditableText::ELineBreak)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2081
		RECVLOG(KLineHasLineBreak)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2082
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2083
	TInt pos = iOutputBody->Read(0).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2084
	// get the text in before the paragraph marker that's always there
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2085
	pos = pos-1 < 0 ? 0 : pos-1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2086
	iOutputBody->InsertL(pos,aText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2087
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2088
	RECVLOG(KWroteToBody)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2089
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2090
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2091
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2092
void CImRecvConvert::ParseRecipientListL(CDesCArray& aList)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2093
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2094
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2095
	HBufC8* pBuf = HBufC8::NewLC(KMaxIMailHeaderReadLineLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2096
	TPtrC8 source(iRfc822Token->OutputLine()->Ptr(), iRfc822Token->OutputLine()->Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2097
	const TUint8* ptr = source.Ptr();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2098
	const TUint8* lastCharPtr = ptr + source.Length() - 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2099
	TUint8 lookFor = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2100
	TInt count = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2101
	TBool finishedEntry = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2102
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2103
	// get past white space
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2104
	while(*ptr&&((*ptr==KImcvSP)||(*ptr==KImcvSemiColon))) ptr++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2105
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2106
	// Entries are separated by commas or semicolons.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2107
	// Separators do not count if they appear within
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2108
	// "", <>, () or embedded series of these, eg "(one, two)"
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2109
	// so we need to keep track of these, including nesting.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2110
	while(*ptr && ptr <= lastCharPtr)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2111
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2112
		if(!pBuf->Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2113
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2114
			finishedEntry = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2115
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2116
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2117
		switch(*ptr)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2118
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2119
			case KImcvLeftBracket:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2120
				if(lookFor==KImcvRightBracket)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2121
					{ // We've already had a "(", so now we need another one
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2122
					count++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2123
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2124
				else if(lookFor==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2125
					{ //We weren't looking for anything else, now we need to
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2126
					lookFor = KImcvRightBracket;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2127
					count = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2128
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2129
				// else we were already looking for something else, ignore this
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2130
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2131
			case KImcvLeftChevron:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2132
				if(lookFor==KImcvRightChevron)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2133
					{ //We've already had a "<", so now we need another one
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2134
					count++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2135
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2136
				else if(lookFor==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2137
					{ //We weren't looking for anything else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2138
					lookFor = KImcvRightChevron;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2139
					count = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2140
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2141
				// else we were already looking for something else, ignore this
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2142
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2143
			case KImcvDoubleQuote:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2144
				if(lookFor==KImcvDoubleQuote)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2145
					{ // We already had a quote, so this matches it
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2146
					lookFor = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2147
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2148
				else if(lookFor==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2149
					{ //We weren't looking for anything else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2150
					lookFor = KImcvDoubleQuote;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2151
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2152
				// else we were already looking for something else, ignore this
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2153
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2154
			case KImcvRightBracket:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2155
			case KImcvRightChevron:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2156
				if(*ptr == lookFor)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2157
					{ //If we have found what we were looking for, decrease the count
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2158
					count--;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2159
					if(count==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2160
						{ // Got everything, now we're not looking for anything
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2161
						lookFor = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2162
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2163
					// else keep looking for the same thing	again
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2164
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2165
				// else we're looking for something else, ignore it
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2166
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2167
			case KImcvComma:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2168
			case KImcvSemiColon:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2169
				// If we're not looking for anything, we're finished
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2170
				if (lookFor == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2171
					finishedEntry = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2172
				// else this comma or semicolon is part of a different token, ignore it
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2173
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2174
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2175
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2176
		if(!finishedEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2177
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2178
			// check we're not about to blow the buffer
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2179
			if(pBuf->Length() >= pBuf->Des().MaxLength())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2180
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2181
				// ReAlloc will delete the original memory pointed to by pBuf
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2182
				// so we must take it off the cleanup stack...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2183
				CleanupStack::Pop(pBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2184
				pBuf = pBuf->ReAlloc(pBuf->Length() + 64); // arbitrary extension
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2185
				// ...and put the new one on instead
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2186
				CleanupStack::PushL(pBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2187
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2188
			pBuf->Des().Append((TChar)*ptr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2189
			// move to the next character
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2190
			ptr++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2191
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2192
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2193
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2194
			// that's it! store the address away
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2195
			HBufC16* pBuf16 = HBufC16::NewLC(pBuf->Des().Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2196
			pBuf16->Des().Copy(pBuf->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2197
			aList.AppendL( (HBufC16&) *pBuf16 );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2198
			CleanupStack::PopAndDestroy(); // pBuf16
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2199
			pBuf->Des().SetLength(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2200
			finishedEntry = EFalse; //Ready for next entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2201
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2202
			// get past the separator
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2203
			ptr++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2204
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2205
			// get past white space (& any other separators)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2206
			while(*ptr && (*ptr==KImcvSP || *ptr==KImcvTab || *ptr==KImcvComma || *ptr==KImcvSemiColon)) ptr++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2207
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2208
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2209
		// catch the last name in the list
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2210
		if (pBuf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2211
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2212
			TInt recipientLength = pBuf->Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2213
			if (recipientLength)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2214
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2215
				HBufC16* pBuf16 = HBufC16::NewLC(recipientLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2216
				pBuf16->Des().Copy(*pBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2217
				aList.AppendL(*pBuf16);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2218
				CleanupStack::PopAndDestroy(); // pBuf16
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2219
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2220
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2221
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2222
		CleanupStack::PopAndDestroy(); // pBuf
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2223
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2224
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2225
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2226
void CImRecvConvert::ExtractFilename(TLex& aLex, TDes& rFileName)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2227
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2228
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2229
	// This function steps through the filename extracting the bare name and checking 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2230
	//  the length is less than the max of 256 for EPOC ;checks that all chars are legal for EPOC32
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2231
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2232
	TChar endChar = KImcvSemiColon;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2233
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2234
	aLex.SkipSpace();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2235
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2236
	if (aLex.Peek()==KImcvDoubleQuote)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2237
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2238
		aLex.Inc();	// step over the " character
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2239
		endChar = KImcvDoubleQuote;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2240
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2241
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2242
	aLex.Mark();	// marks where we are as this is the first char of the filename
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2243
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2244
	TInt fileNameLength = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2245
	TInt maxFileNameLength = rFileName.MaxLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2246
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2247
	while(!aLex.Eos() && aLex.Peek()!=endChar && aLex.Peek()!=KImcvCR && fileNameLength < maxFileNameLength)	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2248
		//spools through the string until the end and marks char before quote (such that 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2249
		//  it extracts only the filename), EOS or before the maximum buffer length is exceeded 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2250
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2251
		fileNameLength++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2252
		aLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2253
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2254
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2255
	TPtrC marked = aLex.MarkedToken(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2256
	rFileName.Copy(marked);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2257
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2258
	ReplaceInvalidCharacters(rFileName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2259
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2260
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2261
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2262
void CImRecvConvert::SetAttachmentName(TDes& aFileName)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2263
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2264
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2265
	ReplaceInvalidCharacters(aFileName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2266
	iAttachmentName.Zero();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2267
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2268
	TUint delimiter = '.';
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2269
	TInt  maxLength = iAttachmentName.MaxLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2270
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2271
	__ASSERT_DEBUG(
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2272
		maxLength >= aFileName.Length(), gPanic(KPanicReadLengthTooLarge)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2273
		);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2274
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2275
	iAttachmentName.Copy(aFileName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2276
	TInt attachmentLen = iAttachmentName.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2277
	if (attachmentLen == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2278
		iAttachmentName = *iDefaultAttachmentName;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2279
	else if (iAttachmentName[0] == delimiter && maxLength >= attachmentLen + iDefaultAttachmentName->Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2280
		iAttachmentName.Insert(0, *iDefaultAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2281
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2282
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2283
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2284
void CImRecvConvert::ReplaceInvalidCharacters(TDes& rFileName)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2285
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2286
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2287
	TInt length = rFileName.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2288
	for(TInt index=0; index < length; index++)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2289
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2290
		//parse extracted filename and replace any illegal chars with a default.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2291
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2292
		if(IsIllegalChar((TUint)rFileName[index]))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2293
			rFileName[index] = KImcvDefaultChar;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2294
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2295
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2296
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2297
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2298
void CImRecvConvert::StoreEntryStreamsL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2299
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2300
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2301
	StoreEntryStreamsL(KStoreBodyText|KStore822Header|KStoreMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2302
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2303
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2304
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2305
void CImRecvConvert::StoreEntryStreamsL(TInt aSettings)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2306
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2307
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2308
	RECVLOG(KStartStoringEntryStream);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2309
	CMsvStore* entryStore = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2310
	TBool commitStore = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2311
	const TInt KChunkSize = 1024;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2312
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2313
	if (iReceivingHeadersOnly==EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2314
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2315
		//If bodytext has been stored using chunk mechanism.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2316
		if ((aSettings & KStoreBodyText ) && iPlainBodyTextEntry && iEmailEntry->iType==KUidMsvEmailTextEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2317
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2318
			iPlainBodyTextEntry->TryCommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2319
			TRAPD(error, entryStore = iServerEntry->ReadStoreL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2320
			if(error==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2321
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2322
				CleanupStack::PushL(entryStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2323
				CMsvPlainBodyText* plainBodyText = entryStore->InitialisePlainBodyTextForReadL(KChunkSize);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2324
				iEntryDataSize += plainBodyText->Size();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2325
				delete plainBodyText;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2326
				CleanupStack::PopAndDestroy();//entryStore
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2327
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2328
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2329
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2330
		TRAPD(error, entryStore = iServerEntry->EditStoreL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2331
		if(error==KErrNone) // if store does not exist then the entry is the wrong type
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2332
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2333
			CleanupStack::PushL(entryStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2334
			if (aSettings & KStore822Header)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2335
				Store822HeaderL(*entryStore, commitStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2336
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2337
			if (aSettings & KStoreMIMEHeader)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2338
				StoreMIMEHeaderL(*entryStore, commitStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2339
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2340
			if (aSettings & KStoreBodyText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2341
				StoreBodyTextL(*entryStore, commitStore);		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2342
							
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2343
			// only commit to the store if I wrote something into it
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2344
			if (commitStore)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2345
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2346
				RECVLOG(KStoringEntryStream);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2347
				entryStore->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2348
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2349
			StoreEntryDataL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2350
			CleanupStack::PopAndDestroy(); //entryStore			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2351
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2352
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2353
	RECVLOG(KDoneStoringEntryStream);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2354
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2355
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2356
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2357
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2358
void CImRecvConvert::Store822HeaderL(CMsvStore& aStore, TBool& aCommit)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2359
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2360
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2361
	if(iEmptyHeaderSize<(iOutputHeader->DataSize()))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2362
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2363
		iEntryDataSize += iOutputHeader->DataSize()-iEmptyHeaderSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2364
		RECVLOG(KStoringHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2365
		iOutputHeader->StoreL(aStore);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2366
		RECVLOG(KStoredHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2367
		aCommit = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2368
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2369
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2370
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2371
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2372
void CImRecvConvert::StoreMIMEHeaderL(CMsvStore& aStore, TBool& aCommit)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2373
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2374
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2375
	if(iMimeParser->MimeHeaderSize())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2376
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2377
		RECVLOG(KStoringMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2378
 		iMimeParser->StoreMimeHeaderWithoutCommitL(aStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2379
		aCommit = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2380
		RECVLOG(KStoredMIMEHeader);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2381
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2382
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2383
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2384
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2385
void CImRecvConvert::StoreBodyTextL(CMsvStore& aStore, TBool& aCommit)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2386
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2387
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2388
	if (iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2389
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2390
		if(iBodyBuf->Size())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2391
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2392
			iEntryDataSize += iBodyBuf->Size();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2393
			RECVLOG(KStoring8BitBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2394
			iBodyText->StoreL(aStore, *iBodyBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2395
			aCommit = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2396
			iBodyId=iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2397
			RECVLOG(KStored8BitBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2398
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2399
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2400
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2401
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2402
		if(iOutputBody->DocumentLength())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2403
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2404
			iEntryDataSize += iOutputBody->DocumentLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2405
			RECVLOG(KStoringBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2406
			aStore.StoreBodyTextL(*iOutputBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2407
			iBodyId=iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2408
			aCommit = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2409
			RECVLOG(KStoredBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2410
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2411
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2412
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2413
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2414
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2415
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2416
TBool CImRecvConvert::StoreEntryDataL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2417
//----------------------------------------------------------------------------------------	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2418
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2419
	// NB function should only be called if a whole email is being processed
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2420
	TBool commit=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2421
	RECVLOG(KUpdatingEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2422
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2423
	if (iEmailEntry->iType==KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2424
		iParent->At(0).iSize += iEntryDataSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2425
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2426
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2427
		iEmailEntry->iSize += iEntryDataSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2428
		if (iEntryType==EAttachmentEntry || iEntryType==EHtmlEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2429
			iEmailEntry->iDetails.Set(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2430
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2431
	User::LeaveIfError(iServerEntry->ChangeEntry(*iEmailEntry));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2432
	RECVLOG(KUpdatedEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2433
	return commit;	// if I wrote data into the store, tell owner	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2434
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2435
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2436
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2437
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2438
void CImRecvConvert::MoveToParentEntryL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2439
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2440
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2441
	// This function changes the context to the current entry's parent entry.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2442
	RECVLOG(KMoveToParentEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2443
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2444
	// Change context to the parent entry	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2445
	if (EntryId()==iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2446
		return; // Already there.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2447
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2448
	User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent())); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2449
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2450
	iNewEntry = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2451
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2452
	// only read and write to store if this is a real email message; headers stored in
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2453
	// the remote mailbox do not require any store information.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2454
	if (iReceivingHeadersOnly)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2455
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2456
		RECVLOG(KIgnoringStreams)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2457
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2458
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2459
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2460
	TBool allowAttachmentFlag=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2461
	if(iServerEntry->Entry().iType == KUidMsvFolderEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2462
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2463
		// Current entry is a folder entry signifying a MIME multipart.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2464
		// Change context to the parent entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2465
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2466
		TMsvEmailEntry entry = (TMsvEmailEntry) iServerEntry->Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2467
		iCurrentMultipartFolderEntryId = EntryId();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2468
		allowAttachmentFlag = !(entry.MessageFolderType()==EFolderTypeRelated || 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2469
								entry.MessageFolderType()==EFolderTypeAlternative);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2470
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2471
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2472
		if (EntryId()!=iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2473
			User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent())); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2474
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2475
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2476
	TBool childIsMHTML = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2477
	TBool childIsAttachment = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2478
	TBool childIsICalendar = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2479
	TBool childIsVCalendar = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2480
	//Make the parent entry the current entry 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2481
	if(iEmailEntry != NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2482
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2483
		childIsAttachment = (iEmailEntry->Attachment() || iEmailEntry->iType == KUidMsvMessageEntry) ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2484
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2485
		childIsICalendar = (iEmailEntry->ICalendar()) ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2486
		childIsVCalendar = (iEmailEntry->VCalendar()) ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2487
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2488
		// Dont want the flag propogated 'up' past a message entry.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2489
		if(iEmailEntry->iType != KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2490
			childIsMHTML = iEmailEntry->MHTMLEmail() ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2491
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2492
		delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2493
		iEmailEntry=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2494
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2495
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2496
	iEmailEntry = new (ELeave) TMsvEmailEntry(iServerEntry->Entry());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2497
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2498
	if (!iParent->Count())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2499
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2500
		TParentDetails parentDetails;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2501
		iParent->InsertL(0,parentDetails);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2502
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2503
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2504
	if (! iParent->At(0).iAttachment)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2505
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2506
		iParent->At(0).iAttachment=(childIsAttachment && allowAttachmentFlag)? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2507
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2508
		// if we aren't allowing attachments because of the folder type
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2509
		// remember there where attachments and check at the end whether
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2510
		// it was an MHTML message or not.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2511
		if(childIsAttachment && !allowAttachmentFlag)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2512
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2513
			iRelatedAttachments=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2514
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2515
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2516
	if (!iParent->At(0).iMHTML)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2517
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2518
		iParent->At(0).iMHTML = childIsMHTML ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2519
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2520
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2521
	if (!iParent->At(0).iICal)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2522
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2523
		iParent->At(0).iICal = childIsICalendar ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2524
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2525
	if (!iParent->At(0).iVCal)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2526
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2527
		iParent->At(0).iVCal = childIsVCalendar ? ETrue:EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2528
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2529
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2530
	iParent->At(0).iSize += iEntryDataSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2531
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2532
	iOutputHeader->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2533
	iEmptyHeaderSize=iOutputHeader->DataSize();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2534
	iMimeParser->ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2535
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2536
	iEntryDataSize=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2537
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2538
	RECVLOG(KMovedToParentEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2539
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2540
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2541
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2542
// Helper function to add the partial footer to the email if it exists
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2543
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2544
EXPORT_C void CImRecvConvert::WritePartialFooterL(TInt aAmountLeft)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2545
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2546
	if(iStore8BitData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2547
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2548
		WritePartialFooter8L(aAmountLeft);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2549
		return;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2550
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2551
	TMsvId msgId=iBodyId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2552
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2553
	if (msgId==KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2554
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2555
	TMsvId id = iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2556
	if (iServerEntry->SetEntry(msgId)==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2557
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2558
		TBool storePresent = iServerEntry->HasStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2559
		if (storePresent && iPartialEmailFooter->Length()>0 && aAmountLeft>0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2560
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2561
			CMsvStore* store = iServerEntry->ReadStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2562
			CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2563
			if (store->HasBodyTextL())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2564
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2565
				iOutputBody->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2566
				store->RestoreBodyTextL(*iOutputBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2567
				CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2568
				store = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2569
				HBufC* msg=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2570
				if (iPartialEmailFooter->Find(KIntegerKey)!=KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2571
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2572
					// display k left on the server, rounded up if between 1 and 1023 bytes
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2573
					TInt kBytesLeft = aAmountLeft / 1024;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2574
					if(kBytesLeft == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2575
						kBytesLeft = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2576
					msg = HBufC::NewLC(iPartialEmailFooter->Length()+KSpaceToAddNumber);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2577
					msg->Des().Format(*iPartialEmailFooter,kBytesLeft);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2578
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2579
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2580
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2581
					msg = iPartialEmailFooter->AllocLC();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2582
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2583
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2584
				iOutputBody->AppendParagraphL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2585
				TInt length = iOutputBody->DocumentLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2586
				iOutputBody->InsertL(length,*msg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2587
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2588
				CleanupStack::PopAndDestroy(msg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2589
									
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2590
				store = iServerEntry->EditStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2591
				CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2592
				// If chunk storage mechanism is used then add partial download footer
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2593
				// information to the body text, using CMsvPlainBodyText.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2594
				if(iStorePlainBodyText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2595
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2596
					CMsvPlainBodyText* plainBodyText = store->InitialisePlainBodyTextForWriteL(iStore8BitData, iMimeParser->CurrentCharsetL(),iCharConv->SystemDefaultCharset());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2597
					CleanupStack::PushL(plainBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2598
					plainBodyText->StoreRichTextAsPlainTextL(*iOutputBody);			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2599
					plainBodyText->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2600
					CleanupStack::PopAndDestroy(plainBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2601
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2602
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2603
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2604
					store->StoreBodyTextL(*iOutputBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2605
					store->Commit();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2606
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2607
				CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2608
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2609
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2610
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2611
				CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2612
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2613
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2614
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2615
	iServerEntry->SetEntry(id);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2616
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2617
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2618
void CImRecvConvert::WritePartialFooter8L(TInt aAmountLeft)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2619
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2620
	TMsvId msgId=iBodyId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2621
	if (msgId==KMsvNullIndexEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2622
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2623
	TMsvId id = iServerEntry->Entry().Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2624
	if (iServerEntry->SetEntry(msgId)==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2625
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2626
		// TMsvEmailEntry should also be set to CMsvServerEntry
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2627
		*iEmailEntry = iServerEntry->Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2628
		TBool storePresent = iServerEntry->HasStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2629
		if (storePresent && iPartialEmailFooter8->Length()>0 && aAmountLeft>0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2630
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2631
			CMsvStore* store = iServerEntry->ReadStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2632
			CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2633
			if (store->HasBodyTextL())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2634
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2635
				// if Uid does not Exist in Message Store, return KErrNotSupported.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2636
				TInt bufLength = iBodyText->GetBodyLengthL(*store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2637
				User::LeaveIfError(bufLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2638
				HBufC8* bodyBuffer = HBufC8::NewLC(bufLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2639
				iBodyBuf->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2640
				TPtr8 buf = bodyBuffer->Des();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2641
				iBodyText->GetBodyTextL(*store, buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2642
				if(!iStorePlainBodyText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2643
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2644
					iBodyBuf->InsertL(0, buf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2645
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2646
				CleanupStack::Pop(bodyBuffer);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2647
				iPartialRetrievalBody=bodyBuffer;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2648
				CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2649
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2650
				HBufC* msg=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2651
				TResourceReader reader;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2652
				reader.SetBuffer(iPartialEmailFooter8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2653
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2654
				if (iPartialEmailFooter8->Find((TDesC8&)KIntegerKey)!=KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2655
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2656
					_LIT8(Ktemp9, "....8 bit....Found KIntegerKey");
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2657
					RECVLOG(Ktemp9)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2658
					// display k left on the server, rounded up if between 1 and 1023 bytes
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2659
					TInt kBytesLeft = aAmountLeft / 1024;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2660
					if(kBytesLeft == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2661
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2662
						kBytesLeft = 1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2663
						}						
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2664
					HBufC* resourceBuf = (reader.ReadTPtrC()).AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2665
					CleanupStack::PushL(resourceBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2666
					msg = HBufC::NewL(resourceBuf->Length()+ 10);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2667
					msg->Des().Format(*resourceBuf,kBytesLeft);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2668
					CleanupStack::PopAndDestroy(resourceBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2669
					CleanupStack::PushL(msg);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2670
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2671
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2672
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2673
					msg = (reader.ReadTPtrC()).AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2674
					CleanupStack::PushL(msg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2675
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2676
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2677
				HBufC8* footerMsg= HBufC8::NewLC(msg->Size()+ 20);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2678
				if(iBodyText->CharacterSet())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2679
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2680
					iCharConv->PrepareToConvertToFromOurCharsetL(iBodyText->CharacterSet());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2681
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2682
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2683
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2684
					iCharConv->PrepareToConvertToFromOurCharsetL(iBodyText->DefaultCharacterSet());	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2685
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2686
				TInt numUnconverted = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2687
				TInt unConvertedIndex = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2688
				TPtr8 output(footerMsg->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2689
				TPtr16 input(msg->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2690
				iCharConv->ConvertFromOurCharsetL(input, output, numUnconverted, unConvertedIndex);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2691
				store=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2692
				store = iServerEntry->EditStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2693
				CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2694
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2695
				//If its Plain body Text then Partial download footer information
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2696
				//is added to the body text, using CMsvPlainBodyText.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2697
				if(iStorePlainBodyText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2698
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2699
					CMsvPlainBodyText* plainBodyText = store->InitialisePlainBodyTextForWriteL(iStore8BitData, iMimeParser->CurrentCharsetL(),iCharConv->SystemDefaultCharset());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2700
					CleanupStack::PushL(plainBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2701
					plainBodyText->StoreChunkL(*iPartialRetrievalBody);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2702
					plainBodyText->StoreChunkL(KImcvCRLF());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2703
					plainBodyText->StoreChunkL(*footerMsg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2704
					plainBodyText->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2705
					CleanupStack::PopAndDestroy(plainBodyText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2706
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2707
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2708
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2709
					iBodyBuf->InsertL(iBodyBuf->Size(), KImcvCRLF()); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2710
					iBodyBuf->InsertL(iBodyBuf->Size(), *footerMsg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2711
					iBodyText->StoreL(*store, *iBodyBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2712
					store->Commit();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2713
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2714
				CleanupStack::PopAndDestroy(3,msg); // msg, footerMsg, store
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2715
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2716
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2717
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2718
				CleanupStack::PopAndDestroy(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2719
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2720
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2721
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2722
	iServerEntry->SetEntry(id);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2723
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2724
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2725
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2726
void CImRecvConvert::CreateEntryL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2727
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2728
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2729
	RECVLOG(KCreatingEntry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2730
	if(iEmailEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2731
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2732
		delete iEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2733
		iEmailEntry=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2734
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2735
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2736
	if (iCurrentMultipartFolderEntryId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2737
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2738
		User::LeaveIfError(iServerEntry->SetEntry(iCurrentMultipartFolderEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2739
		iCurrentMultipartFolderEntryId=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2740
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2741
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2742
	iEmailEntry = new (ELeave) TMsvEmailEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2743
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2744
	TValidEntryType previousEntryType = iEntryType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2745
	if (!iTopMessagePart || iMIMEPart_822Header)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2746
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2747
		// At the main header, want to create a message entry.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2748
		// The stored iEntryType will indicate ( from header info) the next entry to be created.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2749
		// Save temporarily.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2750
		// Also applies to the special case where a message contains ony 1 embedded message.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2751
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2752
		previousEntryType=iEntryType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2753
		iEntryType=EMessageEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2754
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2755
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2756
	if ((iPopulateMessage) && (!iTopMessagePart))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2757
	// If this is the root of a message that is being populated then do not create it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2758
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2759
		User::LeaveIfError(iServerEntry->SetEntry(iRootEntryId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2760
		*iEmailEntry = iServerEntry->Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2761
		iTopMessagePart=iRootEntryId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2762
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2763
		// Delete all the children of the message entry.  This is needed because if the
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2764
		// message has been purged, the entries will still exist.  When the message is populated,
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2765
		// new entries are created.  If the original entries are not removed, then duplicate 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2766
		// entries will exist.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2767
		CMsvEntrySelection*	children = new(ELeave) CMsvEntrySelection;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2768
		CleanupStack::PushL(children);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2769
		User::LeaveIfError(iServerEntry->GetChildren(*children));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2770
		if (children->Count())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2771
			iServerEntry->DeleteEntries(*children);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2772
		CleanupStack::PopAndDestroy(children);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2773
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2774
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2775
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2776
		iEmailEntry->iMtm=iNewMsgType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2777
		iEmailEntry->iServiceId = iEmailServiceId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2778
		iEmailEntry->SetComplete(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2779
		iEmailEntry->iSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2780
		iEmailEntry->SetVisible(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2781
		iEmailEntry->SetInPreparation(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2782
		iEmailEntry->SetReceipt(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2783
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2784
		iEmailEntry->SetVCard(iMimeParser->VCard());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2785
		iEmailEntry->SetVCalendar(iMimeParser->VCalendar());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2786
		iEmailEntry->SetICalendar(iMimeParser->ICalendar());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2787
		iEmailEntry->SetMessageFolderType(iMimeParser->MessageFolderType());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2788
		iEmailEntry->SetPriority(iImPriority);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2789
		iEmailEntry->SetNew(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2790
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2791
		if(iOutputHeader->ReceiptAddress().Length()>0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2792
			iEmailEntry->SetReceipt(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2793
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2794
		iEmailEntry->iDate=iTimeDate;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2795
		switch(iEntryType)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2796
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2797
			case EMessageEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2798
				iParsedTime=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2799
				if(!iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2800
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2801
					iEmailEntry->SetUnread(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2802
					iEmailEntry->SetNew(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2803
					iEmailEntry->SetVisible(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2804
					iEmailEntry->SetInPreparation(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2805
					iEmailEntry->SetSendingState(KMsvSendStateNotApplicable);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2806
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2807
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2808
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2809
					TParentDetails parentDetails;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2810
					parentDetails.iMHTML=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2811
			        parentDetails.iAttachment=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2812
			        parentDetails.iICal=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2813
			        parentDetails.iVCal=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2814
					parentDetails.iSize=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2815
					iParent->InsertL(0,parentDetails);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2816
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2817
				iEmailEntry->iType=KUidMsvMessageEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2818
				iEmailEntry->iDetails.Set(iOutputHeader->From());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2819
				iEmailEntry->iDescription.Set(iOutputHeader->Subject());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2820
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2821
			case EFolderEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2822
				iEmailEntry->iType=KUidMsvFolderEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2823
				if (iMimeParser->MessageFolderType()==EFolderTypeUnknown)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2824
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2825
					// Get folder type of parent (the message)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2826
					TMsvEmailEntry entry=iServerEntry->Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2827
					iEmailEntry->SetMessageFolderType(entry.MessageFolderType());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2828
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2829
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2830
			case EAttachmentEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2831
				iEmailEntry->iType=KUidMsvAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2832
				iEmailEntry->iDetails.Set(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2833
				iEmailEntry->iDescription.Set(iMimeParser->ContentDescription());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2834
				break; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2835
			case ETextEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2836
				if ( iMimeParser->ContentDisposition()!=KImcvAttachment)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2837
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2838
					iEmailEntry->iType=KUidMsvEmailTextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2839
					if(iStorePlainBodyText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2840
						{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2841
						iFirstLinePlainText = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2842
						}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2843
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2844
				else 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2845
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2846
					iEmailEntry->iType=KUidMsvAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2847
					iEmailEntry->iDetails.Set(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2848
					iEmailEntry->iDescription.Set(iMimeParser->ContentDescription());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2849
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2850
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2851
			case EHtmlEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2852
				iEmailEntry->iType=KUidMsvEmailHtmlEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2853
				// If disposition not set or is inline..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2854
				if ( iMimeParser->ContentDisposition()==KImcvAttachment)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2855
					iEmailEntry->iType=KUidMsvAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2856
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2857
					iEmailEntry->SetMHTMLEmail(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2858
				iEmailEntry->iDetails.Set(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2859
				iEmailEntry->iDescription.Set(iMimeParser->ContentDescription());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2860
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2861
			case ERtfEntry:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2862
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2863
				iEmailEntry->iType=KUidMsvAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2864
				iEmailEntry->iDetails.Set(iAttachmentName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2865
				iEmailEntry->iDescription.Set(iMimeParser->ContentDescription());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2866
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2867
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2868
		if (iReceivingHeadersOnly)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2869
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2870
			User::LeaveIfError(iServerEntry->CreateEntryBulk(*iEmailEntry));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2871
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2872
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2873
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2874
			User::LeaveIfError(iServerEntry->CreateEntry(*iEmailEntry));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2875
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2876
		User::LeaveIfError(iServerEntry->SetEntry(iEmailEntry->Id()));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2877
		if(!iTopMessagePart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2878
			iTopMessagePart=iEmailEntry->Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2879
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2880
		//if (iEntryType==EHtmlEntry && iAttachmentFileState!=EFileIsOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2881
		//	CreateAttachmentL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2882
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2883
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2884
	iEntryType=previousEntryType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2885
	iNewEntry = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2886
	RECVLOG(KCreatedEntry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2887
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2888
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2889
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2890
void CImRecvConvert::Logging(const TDesC8& aString1, const TDesC8& aString2)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2891
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2892
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2893
	TBuf8<1024> aBuf(aString1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2894
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2895
	aBuf.Append(aString2);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2896
	RECVLOG(aBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2897
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2898
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2899
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2900
void CImRecvConvert::StoreMessageEntryDetailsL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2901
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2902
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2903
	iEmailEntry->SetAttachment(iParent->At(0).iAttachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2904
	iEmailEntry->SetMHTMLEmail(iParent->At(0).iMHTML);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2905
	iEmailEntry->SetICalendar(iParent->At(0).iICal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2906
	iEmailEntry->SetVCalendar(iParent->At(0).iVCal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2907
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2908
	if(iEmailEntry->MHTMLEmail() == EFalse && iEmailEntry->Attachment() == EFalse && iRelatedAttachments !=EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2909
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2910
		iEmailEntry->SetAttachment(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2911
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2912
	iRelatedAttachments=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2913
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2914
	iEmailEntry->iSize = iParent->At(0).iSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2915
	iEmailEntry->SetMessageFolderType(iParent->At(0).iFolder);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2916
	StoreEntryDataL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2917
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2918
	if (iParent->Count()>1)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2919
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2920
		iParent->At(1).iSize += iEmailEntry->iSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2921
		iParent->Delete(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2922
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2923
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2924
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2925
		iParent->At(0).iAttachment = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2926
		iParent->At(0).iMHTML = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2927
		iParent->At(0).iICal = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2928
		iParent->At(0).iVCal = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2929
		iParent->At(0).iSize = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2930
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2931
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2932
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2933
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2934
EXPORT_C TInt CImRecvConvert::DeletedAttachmentSize()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2935
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2936
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2937
	return iSizeOfAttachmentsRemoved;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2938
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2939
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2940
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2941
/****************************************************************************
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2942
	Class CMimeParser functions
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2943
*****************************************************************************/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2944
//----------------------------------------------------------------------------------------    
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2945
EXPORT_C CMimeParser* CMimeParser::NewLC(CImRecvConvert& aImRecvConvert)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2946
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2947
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2948
	CMimeParser* self = new (ELeave) CMimeParser(aImRecvConvert);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2949
	CleanupStack::PushL(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2950
	self->ConstructL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2951
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2952
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2953
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2954
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2955
EXPORT_C CMimeParser* CMimeParser::NewL(CImRecvConvert& aImRecvConvert)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2956
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2957
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2958
	CMimeParser* self = CMimeParser::NewLC(aImRecvConvert);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2959
	CleanupStack::Pop();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2960
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2961
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2962
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2963
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2964
CMimeParser::CMimeParser(CImRecvConvert& aImRecvConvert): iImRecvConvert(aImRecvConvert), 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2965
											iStartId(NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2966
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2967
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2968
	__DECLARE_NAME(_S("CMimeParser"));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2969
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2970
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2971
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2972
void CMimeParser::ConstructL() 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2973
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2974
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2975
	iMimeHeader = CImMimeHeader::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2976
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2977
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2978
	// Create a Desc array to store the boundary strings of a Mime message
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2979
	iBoundaryText = new (ELeave) CDesC8ArrayFlat(3);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2980
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2981
	// Set charset default value
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2982
	iDefaultCharset=iImRecvConvert.CharacterConverter().DefaultCharset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2983
	iCharset = iDefaultCharset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2984
	ResetMimeFieldsExist();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2985
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2986
	Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2987
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2988
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2989
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2990
EXPORT_C CMimeParser::~CMimeParser() 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2991
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2992
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2993
	delete iMimeHeader;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2994
	delete iBoundaryText;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2995
	delete iMimeHeaderLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2996
	delete iStartId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2997
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2998
8b14b30db193 201044_02
hgs
parents:
diff changeset
  2999
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3000
void CMimeParser::Reset() 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3001
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3002
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3003
	iBoundaryText->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3004
	iBoundaryIndex = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3005
	iBoundaryLength = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3006
	isMime = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3007
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3008
	iCharset = iDefaultCharset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3009
	ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3010
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3011
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3012
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3013
void CMimeParser::ResetForNewEntry()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3014
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3015
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3016
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3017
	iMimeHeader->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3018
	iEmptyMimeHeaderSize=iMimeHeader->Size();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3019
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3020
	iContentType = EMimeUnknownContent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3021
	iContentEncoding = EEncodingTypeNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3022
	iContentDescription.Zero();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3023
	iVCard = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3024
	iVCalendar = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3025
	iICalendar = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3026
	iStartPart=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3027
	iMessageFolderType = EFolderTypeUnknown;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3028
	iTerminatingBoundary = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3029
	iBoundaryFound = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3030
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3031
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3032
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3033
void CMimeParser::RestoreMimeParserL(CMsvStore& entryStore)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3034
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3035
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3036
	iMimeHeader->RestoreL(entryStore);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3037
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3038
	if(iMimeHeader->ContentType().Compare(KImcvText)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3039
		iContentType=EMimeText; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3040
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3041
	if(iMimeHeader->ContentType().Compare(KImcvMessage)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3042
		iContentType=EMimeMessage;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3043
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3044
	if(iMimeHeader->ContentType().Compare(KImcvMultipart)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3045
		iContentType=EMimeMultipart; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3046
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3047
	if(iMimeHeader->ContentType().Compare(KImcvImage)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3048
		iContentType=EMimeImage; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3049
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3050
	if(iMimeHeader->ContentType().Compare(KImcvApplication)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3051
		iContentType=EMimeApplication; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3052
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3053
	if(iMimeHeader->ContentType().Compare(KImcvAudio)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3054
		iContentType=EMimeAudio; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3055
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3056
	if(iMimeHeader->ContentType().Compare(KImcvVideo)==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3057
		iContentType=EMimeVideo; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3058
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3059
		iContentType=EMimeUnknownContent; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3060
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3061
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3062
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3063
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3064
void CMimeParser::ParseLineL(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3065
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3066
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3067
	if(iMimeHeaderLine==NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3068
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3069
		iMimeHeaderLine = HBufC8::NewL(aSourceLine.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3070
		*iMimeHeaderLine = aSourceLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3071
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3072
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3073
	iLex = *iMimeHeaderLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3074
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3075
	// find out whether the current line has anything to do with currently understood MIME Content tokens
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3076
	if(!iMimeHeaderLine->MatchF(KImcvMime) || !iMimeHeaderLine->MatchF(KImcvContent))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3077
		{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3078
		if(MatchAndRemoveToken(KImcvMimePrompt))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3079
			DoMimeVersion();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3080
		else if(MatchAndRemoveToken(KImcvContentType))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3081
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3082
			// Check CAF for recognition of content-type in RegisterL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3083
			if(!iImRecvConvert.iReceivingHeadersOnly)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3084
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3085
				// CAF processing.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3086
				// We need to trim any trailing data following and including semicolons
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3087
				// If we leave it to the Register method then it has to create a heap buffer
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3088
				// to do the manipulation. iMimeHeaderLine is modifiable so do it here.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3089
				TInt orgLength = iMimeHeaderLine->Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3090
				TInt endOffset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3091
				// Get the offset of the semicolon if any
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3092
				if((endOffset = iMimeHeaderLine->Locate(KImcvSemiColon)) != KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3093
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3094
			 		// Trim to the content-type token only
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3095
					iMimeHeaderLine->Des().SetLength(endOffset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3096
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3097
				// Sets CAF interested if framework to consume
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3098
				iImRecvConvert.ImCafRegisterL(iMimeHeaderLine->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3099
				// Restore length of the descriptor for futher processing
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3100
				iMimeHeaderLine->Des().SetLength(orgLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3101
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3102
			DoContentTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3103
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3104
		else if(MatchAndRemoveToken(KImcvContentLocation))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3105
			DoContentLocationL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3106
		else if(MatchAndRemoveToken(KImcvContentTransferEncoding))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3107
			DoEncodingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3108
		else if(MatchAndRemoveToken(KImcvContentId))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3109
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3110
			RemoveSurroundingCharacters(KImcvLeftChevron, KImcvRightChevron, *iMimeHeaderLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3111
			DoContentIdL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3112
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3113
		else if(MatchAndRemoveToken(KImcvContentDescription))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3114
			DoDescriptionL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3115
		else if(MatchAndRemoveToken(KImcvContentDisposition))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3116
			DoDispositionL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3117
		else if(MatchAndRemoveToken(KImcvContentBase))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3118
			DoContentBaseL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3119
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3120
	// Start adding to the CAF metadata if CAF's interested
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3121
	if(iImRecvConvert.ImCafRegistered())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3122
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3123
		iImRecvConvert.ImAddToCafMetaDataL(aSourceLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3124
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3125
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3126
	delete iMimeHeaderLine;	// clean up and null pointer iff CompleteMimeHeader and no foldover append req'd
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3127
	iMimeHeaderLine=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3128
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3129
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3130
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3131
void CMimeParser::DoMimeVersion()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3132
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3133
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3134
	// extract the MIME version from a header line which we already know
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3135
	// has 'MIME-Version' start of it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3136
	if(MatchAndRemoveToken(KImcvMimeVersion))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3137
		iCorrectMimeVersion = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3138
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3139
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3140
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3141
void CMimeParser::DoContentIdL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3142
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3143
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3144
	iMimeHeader->SetContentIDL(iMimeHeaderLine->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3145
	if(iStartId && iStartId->CompareF(iMimeHeaderLine->Des())==KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3146
		iStartPart=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3147
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3148
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3149
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3150
void CMimeParser::DoContentLocationL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3151
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3152
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3153
	TInt len = (*iMimeHeaderLine).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3154
	if (len == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3155
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3156
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3157
	RemoveSurroundingCharacters(KImcvQuote, KImcvQuote, *iMimeHeaderLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3158
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3159
	HBufC16* locationBuf = HBufC16::NewL( len );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3160
	CleanupStack::PushL(locationBuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3161
	TPtr locationPtr(locationBuf->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3162
	iImRecvConvert.iHeaderConverter->DecodeHeaderFieldL( iMimeHeaderLine->Des(), locationPtr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3163
	iMimeHeader->SetContentLocationL(locationPtr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3164
	CleanupStack::PopAndDestroy(); // locationBuf
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3165
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3166
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3167
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3168
void CMimeParser::DoContentBaseL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3169
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3170
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3171
	RemoveSurroundingCharacters(KImcvQuote, KImcvQuote, *iMimeHeaderLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3172
	iMimeHeader->SetContentBaseL(iMimeHeaderLine->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3173
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3174
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3175
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3176
void CMimeParser::DoAttachmentTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3177
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3178
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3179
	iImRecvConvert.iEntryType = CImRecvConvert::EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3180
	iImRecvConvert.iCurrentPartIsRichText = EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3181
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3182
	if(MatchAndRemoveToken(KImcvForwardSlash))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3183
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3184
		if(MatchAndRemoveToken(KImcvBmp))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3185
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3186
			iMimeHeader->SetContentSubTypeL(KImcvBmp);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3187
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3188
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3189
		if(MatchAndRemoveToken(KImcvGif))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3190
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3191
			iMimeHeader->SetContentSubTypeL(KImcvGif);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3192
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3193
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3194
		if(MatchAndRemoveToken(KImcvJpeg))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3195
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3196
			iMimeHeader->SetContentSubTypeL(KImcvJpeg);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3197
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3198
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3199
		if(MatchAndRemoveToken(KImcvTiff))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3200
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3201
			iMimeHeader->SetContentSubTypeL(KImcvTiff);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3202
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3203
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3204
		if(MatchAndRemoveToken(KImcvWav))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3205
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3206
			iMimeHeader->SetContentSubTypeL(KImcvWav);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3207
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3208
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3209
		if(MatchAndRemoveToken(KImcvZip))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3210
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3211
			iMimeHeader->SetContentSubTypeL(KImcvZip);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3212
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3213
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3214
		if(MatchAndRemoveToken(KImcvOctetStream))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3215
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3216
			iMimeHeader->SetContentSubTypeL(KImcvOctetStream);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3217
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3218
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3219
		if(MatchAndRemoveToken(KImcvExe))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3220
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3221
			iMimeHeader->SetContentSubTypeL(KImcvExe);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3222
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3223
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3224
		if(MatchAndRemoveToken(KImcvCmd))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3225
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3226
			iMimeHeader->SetContentSubTypeL(KImcvCmd);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3227
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3228
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3229
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3230
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3231
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3232
void CMimeParser::DoMessageTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3233
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3234
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3235
	iImRecvConvert.iEntryType = CImRecvConvert::EMessageEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3236
	iImRecvConvert.iEmailPart = CImRecvConvert::KParentPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3237
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3238
	iContentType=EMimeMessage; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3239
	iMimeHeader->SetContentTypeL(KImcvMessage);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3240
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3241
	if(MatchAndRemoveToken(KImcvForwardSlash))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3242
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3243
		if(MatchAndRemoveToken(KImcvRfc822))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3244
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3245
			//iMessageFolderType=EFolderTypeRFC822;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3246
			iMimeHeader->SetContentSubTypeL(KImcvRfc822);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3247
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3248
		else if(MatchAndRemoveToken(KImcvExternal))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3249
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3250
			iMessageFolderType=EFolderTypeExternal;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3251
			iMimeHeader->SetContentSubTypeL(KImcvExternal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3252
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3253
		else if(MatchAndRemoveToken(KImcvPartial))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3254
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3255
			iMessageFolderType=EFolderTypePartial;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3256
			iMimeHeader->SetContentSubTypeL(KImcvPartial);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3257
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3258
		else if(MatchAndRemoveToken(KImcvDeliveryStatus))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3259
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3260
			// We do not process this part. So store as text.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3261
			iMimeHeader->SetContentSubTypeL(KImcvDeliveryStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3262
			iImRecvConvert.iEntryType = CImRecvConvert::EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3263
			iImRecvConvert.iEmailPart = CImRecvConvert::KNoPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3264
			iContentType=EMimeUnknownContent; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3265
			iImRecvConvert.iCurrentPartIsRichText=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3266
			iImRecvConvert.iAttachmentName.Copy(KImcvDeliveryStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3267
			iImRecvConvert.iAttachmentName.Append(KTextExtension);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3268
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3269
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3270
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3271
			iMessageFolderType=EFolderTypeUnknown;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3272
			iMimeHeader->SetContentSubTypeL(KImcvUnknown);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3273
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3274
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3275
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3276
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3277
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3278
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3279
void CMimeParser::DoMultipartTypeForNonMIMEL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3280
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3281
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3282
	ResetForNewEntry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3283
	iMessageFolderType=EFolderTypeMixed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3284
	iMimeHeader->SetContentTypeL(KImcvMultipart);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3285
	iMimeHeader->SetContentSubTypeL(KImcvMixed);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3286
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3287
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3288
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3289
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3290
void CMimeParser::DoMultipartTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3291
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3292
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3293
	iImRecvConvert.iEntryType = CImRecvConvert::EFolderEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3294
	iImRecvConvert.iEmailPart = CImRecvConvert::KMultiPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3295
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3296
	iContentType=EMimeMultipart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3297
	iMimeHeader->SetContentTypeL(KImcvMultipart);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3298
	if(MatchAndRemoveToken(KImcvForwardSlash))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3299
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3300
		if(MatchAndRemoveToken(KImcvMixed))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3301
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3302
			iMessageFolderType=EFolderTypeMixed;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3303
			iMimeHeader->SetContentSubTypeL(KImcvMixed);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3304
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3305
		else if(MatchAndRemoveToken(KImcvRelated))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3306
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3307
			iMessageFolderType=EFolderTypeRelated;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3308
			iMimeHeader->SetContentSubTypeL(KImcvRelated);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3309
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3310
		else if(MatchAndRemoveToken(KImcvAlternative))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3311
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3312
			iMessageFolderType=EFolderTypeAlternative;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3313
			iMimeHeader->SetContentSubTypeL(KImcvAlternative);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3314
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3315
		else if(MatchAndRemoveToken(KImcvEncrypted))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3316
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3317
//	Add this when Encryption is handled iMessageFolderType=EFolderTypeEncrypted;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3318
			iMimeHeader->SetContentSubTypeL(KImcvEncrypted);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3319
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3320
		else if(MatchAndRemoveToken(KImcvParallel))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3321
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3322
			iMessageFolderType=EFolderTypeParallel;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3323
			iMimeHeader->SetContentSubTypeL(KImcvParallel);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3324
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3325
		else if(MatchAndRemoveToken(KImcvDigest))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3326
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3327
			iMessageFolderType=EFolderTypeDigest;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3328
			iMimeHeader->SetContentSubTypeL(KImcvDigest);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3329
			isMessageDigest=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3330
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3331
		else if(MatchAndRemoveToken(KImcvSigned))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3332
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3333
//	Add this when Signed is handled	iMessageFolderType=EFolderTypeSigned;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3334
			iMimeHeader->SetContentSubTypeL(KImcvSigned);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3335
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3336
		else if(MatchAndRemoveToken(KImcvReport))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3337
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3338
			iMimeHeader->SetContentSubTypeL(KImcvReport);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3339
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3340
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3341
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3342
			iMessageFolderType=EFolderTypeUnknown;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3343
			iMimeHeader->SetContentSubTypeL(KImcvUnknown);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3344
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3345
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3346
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3347
	if (iMessageFolderType==EFolderTypeRelated)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3348
		iImRecvConvert.iParent->At(0).iFolder=iMessageFolderType; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3349
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3350
	// Find any parameters specific to a Multipart content type	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3351
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3352
	HBufC8* paramValue = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3353
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3354
	// Extracts the boundary string
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3355
	ExtractParameterInfoL(KImcvBoundary, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3356
	if( paramValue!=NULL ) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3357
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3358
		CleanupStack::PushL(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3359
		iBoundaryFound = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3360
		iImRecvConvert.iEmailPart = CImRecvConvert::KMultiPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3361
		SetBoundaryL(*paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3362
		CleanupStack::PopAndDestroy(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3363
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3364
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3365
	// Extracts start ID if it has been defined;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3366
	ExtractParameterInfoL(KImcvStartPart, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3367
	if( paramValue!=NULL )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3368
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3369
		delete iStartId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3370
		iStartId = paramValue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3371
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3372
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3373
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3374
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3375
void CMimeParser::DoTextTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3376
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3377
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3378
	HBufC8* paramValue = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3379
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3380
	iImRecvConvert.iEntryType = CImRecvConvert::ETextEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3381
	iContentType=EMimeText;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3382
	iMimeHeader->SetContentTypeL(KImcvText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3383
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3384
	if(MatchAndRemoveToken(KImcvForwardSlash))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3385
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3386
		if(MatchAndRemoveToken(KImcvPlain))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3387
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3388
			iMimeHeader->SetContentSubTypeL(KImcvPlain);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3389
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3390
		else if(MatchAndRemoveToken(KImcvRtf))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3391
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3392
			iMimeHeader->SetContentSubTypeL(KImcvRtf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3393
			iImRecvConvert.iEntryType = CImRecvConvert::ERtfEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3394
			iImRecvConvert.iCurrentPartIsRichText = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3395
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3396
		else if(MatchAndRemoveToken(KImcvHtml))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3397
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3398
			iMimeHeader->SetContentSubTypeL(KImcvHtml);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3399
			iImRecvConvert.iEntryType = CImRecvConvert::EHtmlEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3400
			iImRecvConvert.iCurrentPartIsRichText = EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3401
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3402
		else if(MatchAndRemoveToken(KImcvDirectory))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3403
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3404
			iMimeHeader->SetContentSubTypeL(KImcvDirectory);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3405
			iMimeHeader->ContentTypeParams().AppendL(KImcvProfile);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3406
			ExtractParameterInfoL(KImcvProfile, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3407
			// Assume at right context, the email message, not attachment.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3408
			iMessageFolderType=EFolderTypeDirectory;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3409
			if( paramValue!=NULL )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3410
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3411
				CleanupStack::PushL(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3412
				iMimeHeader->ContentTypeParams().AppendL(*paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3413
				if(paramValue->MatchF(KImcvVCard) == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3414
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3415
					iVCard=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3416
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3417
				CleanupStack::PopAndDestroy(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3418
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3419
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3420
		else if(MatchAndRemoveToken(KImcvXVCard))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3421
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3422
			iMimeHeader->SetContentSubTypeL(KImcvXVCard);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3423
			iVCard=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3424
			}		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3425
		else if(MatchAndRemoveToken(KImcvVCalender))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3426
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3427
			iMimeHeader->SetContentSubTypeL(KImcvVCalender);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3428
			iVCalendar=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3429
			}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3430
		else if(MatchAndRemoveToken(KImcvICalendar))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3431
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3432
			iMimeHeader->SetContentSubTypeL(KImcvICalendar);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3433
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3434
			// Get the method value
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3435
			ExtractParameterInfoL(KImcvICalendarMethod, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3436
			if (paramValue!=NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3437
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3438
				CleanupStack::PushL(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3439
				iMimeHeader->ContentTypeParams().AppendL(KImcvICalendarMethod);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3440
				iMimeHeader->ContentTypeParams().AppendL(*paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3441
				CleanupStack::PopAndDestroy(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3442
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3443
			// Get the component value
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3444
			ExtractParameterInfoL(KImcvICalendarComponent, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3445
			if (paramValue!=NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3446
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3447
				CleanupStack::PushL(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3448
				iMimeHeader->ContentTypeParams().AppendL(KImcvICalendarComponent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3449
				iMimeHeader->ContentTypeParams().AppendL(*paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3450
				CleanupStack::PopAndDestroy(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3451
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3452
			iICalendar=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3453
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3454
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3455
		// Extract the charset value, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3456
		ExtractParameterInfoL(KImcvCharset, paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3457
		if(paramValue!=NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3458
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3459
			CleanupStack::PushL(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3460
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3461
			// check if at top level header or Mime part header
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3462
			TUint charsetUid = iImRecvConvert.CharacterConverter().GetMimeCharsetUidL(*paramValue); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3463
			if(iImRecvConvert.NotFinishedRfc822Header() == EFalse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3464
				iCharset=charsetUid;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3465
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3466
			// Store in CMimeHeader::iContentTypeParams
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3467
			iMimeHeader->ContentTypeParams().AppendL(KImcvCharset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3468
			iMimeHeader->ContentTypeParams().AppendL(*paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3469
			CleanupStack::PopAndDestroy(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3470
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3471
			if (!iImRecvConvert.CharacterConverter().PrepareToConvertToFromOurCharsetL(charsetUid))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3472
				charsetUid=KUidMsvCharsetNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3473
			iMimeHeader->SetMimeCharset(charsetUid);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3474
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3475
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3476
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3477
			iMimeHeader->SetMimeCharset(iDefaultCharset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3478
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3479
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3480
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3481
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3482
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3483
void CMimeParser::DoContentTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3484
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3485
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3486
	RemoveSurroundingCharacters(KImcvLeftChevron, KImcvRightChevron, *iMimeHeaderLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3487
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3488
	if(MatchAndRemoveToken(KImcvText))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3489
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3490
		DoTextTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3491
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3492
	else if(MatchAndRemoveToken(KImcvMultipart))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3493
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3494
		DoMultipartTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3495
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3496
	else if(MatchAndRemoveToken(KImcvMessage))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3497
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3498
		DoMessageTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3499
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3500
	else if(MatchAndRemoveToken(KImcvImage))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3501
		{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3502
		iContentType=EMimeImage; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3503
		iMimeHeader->SetContentTypeL(KImcvImage);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3504
		DoAttachmentTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3505
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3506
	else if(MatchAndRemoveToken(KImcvApplication))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3507
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3508
		iContentType=EMimeApplication; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3509
		iMimeHeader->SetContentTypeL(KImcvApplication);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3510
		DoAttachmentTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3511
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3512
	else if(MatchAndRemoveToken(KImcvAudio))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3513
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3514
		iContentType=EMimeAudio; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3515
		iMimeHeader->SetContentTypeL(KImcvAudio);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3516
		DoAttachmentTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3517
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3518
	else if(MatchAndRemoveToken(KImcvVideo))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3519
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3520
		iContentType=EMimeVideo; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3521
		iMimeHeader->SetContentTypeL(KImcvVideo);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3522
		DoAttachmentTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3523
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3524
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3525
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3526
		iContentType=EMimeUnknownContent; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3527
		iMimeHeader->SetContentTypeL(KImcvUnknown);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3528
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3529
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3530
	// Extract the filename if it exists
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3531
	HBufC* paramStore = HBufC::NewLC(MaxMimeParameterValueLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3532
	HBufC8* paramStore8 = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3533
	TPtr paramValue(paramStore->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3534
	ExtractParameterInfoL(KImcvMimeTypeName, paramValue,paramStore8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3535
	CleanupStack::PushL(paramStore8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3536
	if(paramValue.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3537
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3538
		iMimeHeader->ContentTypeParams().AppendL(KImcvMimeTypeName);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3539
		TPtr8 paramValue8(paramStore8->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3540
		iMimeHeader->ContentTypeParams().AppendL(paramValue8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3541
		iImRecvConvert.SetAttachmentName(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3542
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3543
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3544
	CleanupStack::PopAndDestroy(2,paramStore); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3545
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3546
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3547
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3548
void CMimeParser::DoEncodingL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3549
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3550
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3551
	// Some servers will specify the content transfer encoding field, but leave
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3552
	// it's value blank. Check for this, and default to 7 bit if this happens.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3553
	if ((*iMimeHeaderLine).Length() == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3554
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3555
		iMimeHeader->SetContentTransferEncodingL(KMiut7BitString);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3556
		iContentEncoding = EEncodingType7Bit;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3557
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3558
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3559
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3560
	iMimeHeader->SetContentTransferEncodingL(*iMimeHeaderLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3561
	switch ((*iMimeHeaderLine)[0])
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3562
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3563
		case '7': // 7bit
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3564
			iContentEncoding = EEncodingType7Bit;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3565
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3566
		case '8': // 8bit
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3567
			iContentEncoding = EEncodingType8Bit;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3568
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3569
		case 'q': // quoted-printable
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3570
		case 'Q': 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3571
			iContentEncoding = EEncodingTypeQP;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3572
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3573
		case 'b': // binary or base64
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3574
		case 'B':
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3575
			if ((*iMimeHeaderLine).Length() <2)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3576
				return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3577
			iContentEncoding = ((*iMimeHeaderLine)[1] == 'i' || (*iMimeHeaderLine)[1] == 'I' ? EEncodingTypeBinary : EEncodingTypeBASE64);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3578
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3579
		case 'x': //in order to support UU encoded within a MIME message
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3580
		case 'X':
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3581
			iContentEncoding = ((*iMimeHeaderLine).FindF(KImcvXUUString)==KErrNotFound ? EEncodingTypeUnknown : EEncodingTypeUU);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3582
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3583
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3584
			iContentEncoding = EEncodingTypeUnknown;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3585
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3586
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3587
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3588
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3589
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3590
void CMimeParser::DoDescriptionL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3591
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3592
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3593
	TPtrC8 marked(iMimeHeaderLine->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3594
	if (marked.Length()>KMaxFileName)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3595
		marked.Set(marked.Left(KMaxFileName));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3596
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3597
	iContentDescription.Copy(marked);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3598
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3599
	// remove the CRLF
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3600
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3601
	TInt length = iContentDescription.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3602
	if (length>2)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3603
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3604
		if (iContentDescription[length-2]==KImcvCR && iContentDescription[length-1]==KImcvLF)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3605
			iContentDescription.SetLength(length-2);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3606
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3607
	iMimeHeader->SetContentDescriptionL(marked);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3608
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3609
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3610
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3611
void CMimeParser::DoDispositionL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3612
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3613
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3614
	TBool inLine = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3615
	if(MatchAndRemoveToken(KImcvAttachment))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3616
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3617
		iMimeHeader->SetContentDispositionL(KImcvAttachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3618
		if (iMimeHeader->ContentSubType()!=KImcvRfc822)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3619
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3620
			iImRecvConvert.iCurrentPartIsRichText = EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3621
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3622
		if (iImRecvConvert.iEntryType!=CImRecvConvert::EMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3623
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3624
			iImRecvConvert.iEntryType = CImRecvConvert::EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3625
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3626
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3627
	else if(MatchAndRemoveToken(KImcvInline))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3628
		inLine = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3629
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3630
	// Extract the filename if it exists, unless we already have a name for it	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3631
	if(!iImRecvConvert.iAttachmentName.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3632
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3633
		HBufC* paramStore = HBufC::NewLC(KHeaderBufferLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3634
		TPtr paramValue(paramStore->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3635
		HBufC8* paramStore8 = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3636
		ExtractParameterInfoL(KImcvMimeDispositionFilename, paramValue,paramStore8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3637
		CleanupStack::PushL(paramStore8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3638
		if(paramValue.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3639
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3640
			iMimeHeader->ContentTypeParams().AppendL(KImcvMimeDispositionFilename);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3641
			TPtr8 paramValue8(paramStore8->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3642
			iMimeHeader->ContentTypeParams().AppendL(paramValue8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3643
			iImRecvConvert.SetAttachmentName(paramValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3644
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3645
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3646
		CleanupStack::PopAndDestroy(2,paramStore); // paramStore, paramStore8
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3647
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3648
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3649
		if(inLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3650
 		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3651
 		// Content Disposition set to inline
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3652
 		if (iImRecvConvert.iAttachmentName.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3653
 			// filename exists
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3654
 			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3655
 			iMimeHeader->SetContentDispositionL(KImcvAttachment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3656
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3657
			if (iMimeHeader->ContentSubType()!=KImcvRfc822)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3658
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3659
				iImRecvConvert.iCurrentPartIsRichText = EFalse;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3660
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3661
			if (iImRecvConvert.iEntryType!=CImRecvConvert::EMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3662
 				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3663
 				iImRecvConvert.iEntryType = CImRecvConvert::EAttachmentEntry;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3664
 				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3665
 			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3666
 		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3667
 			iMimeHeader->SetContentDispositionL(KImcvInline);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3668
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3669
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3670
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3671
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3672
TPtrC8 CMimeParser::ContentSubType() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3673
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3674
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3675
	return iMimeHeader->ContentSubType();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3676
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3677
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3678
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3679
TPtrC8 CMimeParser::ContentTypeDescription() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3680
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3681
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3682
	return iMimeHeader->ContentType();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3683
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3684
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3685
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3686
TBool CMimeParser::VCard() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3687
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3688
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3689
	return iVCard;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3690
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3691
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3692
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3693
TBool CMimeParser::VCalendar() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3694
//----------------------------------------------------------------------------------------  	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3695
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3696
	return iVCalendar;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3697
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3698
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3699
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3700
TBool CMimeParser::ICalendar() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3701
//----------------------------------------------------------------------------------------  	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3702
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3703
	return iICalendar;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3704
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3705
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3706
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3707
TBool CMimeParser::StartPart() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3708
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3709
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3710
	return iStartPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3711
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3712
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3713
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3714
TImEmailFolderType CMimeParser::MessageFolderType() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3715
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3716
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3717
	return iMessageFolderType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3718
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3719
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3720
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3721
void CMimeParser::SetMessageFolderType(TImEmailFolderType aFolderType)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3722
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3723
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3724
	iMessageFolderType=aFolderType;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3725
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3726
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3727
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3728
void CMimeParser::SetBoundaryL(const TDesC8& aBoundaryText)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3729
//----------------------------------------------------------------------------------------  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3730
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3731
	TBuf8<KMaxBoundaryTextLength+2> tempBoundary(KImcvMimeBoundaryStartEnd);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3732
// From RFC 1521, (Boundaries) must be no longer than 70 characters.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3733
// Including beginning and end "--" 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3734
	if (aBoundaryText.Length()>70)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3735
		tempBoundary.Append(aBoundaryText.Left(70));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3736
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3737
		tempBoundary.Append(aBoundaryText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3738
	iBoundaryText->AppendL(tempBoundary);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3739
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3740
	iBoundaryIndex = iBoundaryText->MdcaCount(); //iBoundaryIndex stores a count value not the index here
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3741
	iBoundaryIndex = ((iBoundaryIndex > 0)? (iBoundaryIndex-1): 0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3742
	iBoundaryLength = iBoundaryText->MdcaPoint(iBoundaryIndex).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3743
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3744
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3745
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3746
TBool CMimeParser::IsBoundary(const TDesC8& aSourceLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3747
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3748
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3749
	if(iBoundaryText->MdcaCount())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3750
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3751
		TInt found = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3752
		TInt aLineLength = aSourceLine.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3753
		TInt compareLength = aLineLength > iBoundaryLength ? iBoundaryLength : aLineLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3754
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3755
		if (aLineLength > 3) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3756
			{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3757
			// To Handle cases when server sends clipped version of mails which does not have closing 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3758
			// boundary.. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3759
			if (aSourceLine[aLineLength-4] == KImcvHyphen && aSourceLine[aLineLength-3] == KImcvHyphen) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3760
				{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3761
				compareLength =aLineLength-4; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3762
				}    
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3763
			} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3764
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3765
		TPtrC8 tempSourceLine(aSourceLine.Ptr(), compareLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3766
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3767
		TInt error = iBoundaryText->Find(tempSourceLine, found, ECmpNormal);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3768
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3769
		if(error||(!iBoundaryLength))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3770
			return KBoundaryNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3771
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3772
		// The following code is executed only if aSourceLine is a boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3773
		if(found!=iBoundaryIndex)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3774
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3775
			iReceiveError = (iReceiveError)? iReceiveError: KBoundaryError;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3776
			iBoundaryIndex = found;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3777
			iBoundaryText->Delete(found++);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3778
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3779
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3780
		if(aLineLength >= compareLength+4) // allow for CRLF & then check for the double hyphen
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3781
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3782
			if((aSourceLine[compareLength] == KImcvHyphen) && (aSourceLine[compareLength+1] == KImcvHyphen))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3783
				iTerminatingBoundary = ETrue; // this is a terminating boundary
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3784
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3785
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3786
			iTerminatingBoundary = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3787
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3788
		return KBoundaryFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3789
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3790
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3791
	return KBoundaryNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3792
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3793
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3794
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3795
void CMimeParser::RemoveBoundary()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3796
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3797
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3798
	iBoundaryText->Delete(iBoundaryIndex);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3799
	if(iBoundaryText->MdcaCount())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3800
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3801
		iBoundaryIndex = iBoundaryText->MdcaCount(); //iBoundaryIndex stores a count value not the index here
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3802
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3803
		iBoundaryIndex = ((iBoundaryIndex > 0)? (iBoundaryIndex-1): 0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3804
		iBoundaryLength = iBoundaryText->MdcaPoint(iBoundaryIndex).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3805
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3806
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3807
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3808
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3809
TBool CMimeParser::MatchAndRemoveToken( const TDesC8& aToken )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3810
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3811
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3812
	TInt comparison;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3813
	TInt tokenLength = aToken.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3814
	TInt desLength = (*iMimeHeaderLine).Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3815
	TInt compareLength = tokenLength > desLength ? desLength : tokenLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3816
	TPtrC8 left((*iMimeHeaderLine).Left(compareLength));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3817
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3818
	// now see whether the current line contains the search string
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3819
	comparison = left.CompareF(aToken);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3820
	if (!comparison)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3821
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3822
		// found the match string at the start of the output line, so remove it
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3823
		iMimeFieldsExist=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3824
		isMime=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3825
		// get rid of any whitespace betweebn the tag and the data while we have a chance
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3826
		TInt whitespaceLength=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3827
		TInt maxLength=desLength-tokenLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3828
		const TUint8* ptr = (*iMimeHeaderLine).Ptr();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3829
		while ( whitespaceLength <= maxLength && (ptr[tokenLength+whitespaceLength] == KImcvSP || ptr[tokenLength+whitespaceLength] == KImcvTab) )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3830
			whitespaceLength++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3831
		iMimeHeaderLine->Des().Delete(0, tokenLength+whitespaceLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3832
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3833
		// Reset iLex, so its length is updated.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3834
		iLex = *iMimeHeaderLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3835
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3836
	return (comparison==0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3837
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3838
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3839
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3840
TBool CMimeParser::IsSpecialChar( const TUint8 aChar )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3841
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3842
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3843
	return (aChar == '(' || aChar == ')' || aChar == '<' || aChar == '>' || aChar == '@' 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3844
		 || aChar == ',' || aChar == ';' || aChar == ':' || aChar == '\\'|| aChar == '"' 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3845
		 || aChar == '/' || aChar == '[' || aChar == ']' || aChar == '?' || aChar == '=');
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3846
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3847
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3848
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3849
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3850
// Implicitly the parameter ASSUMED TO BE is not encoded as return parameter, rBuffer, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3851
// is 8 bit. iLex should currently be pointing at the space after content-type description.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3852
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3853
void CMimeParser::ExtractParameterInfoL(const TDesC8& aTag, HBufC8*& rBuffer)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3854
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3855
	{	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3856
	rBuffer = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3857
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3858
	TLexMark8 mark;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3859
	TInt offset;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3860
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3861
	// Workaround due to this method not being able to 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3862
	// correctly handle multiple content-type parameters			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3863
	iLex = *iMimeHeaderLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3864
								
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3865
	if( (offset=iLex.Remainder().FindF(aTag)) != KErrNotFound )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3866
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3867
		// move past the tag	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3868
		iLex.Inc(offset+aTag.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3869
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3870
		// Default : no charset info or folding
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3871
		// move forward to the start of the boundary string itself.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3872
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3873
		while (iLex.Peek() != KImcvEquals  && !iLex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3874
			iLex.Inc(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3875
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3876
		TPtrC8 paramBuffer(ExtractParameterString(mark));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3877
		if( paramBuffer.Length() > 0 )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3878
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3879
			rBuffer = paramBuffer.AllocL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3880
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3881
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3882
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3883
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3884
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3885
Searches the passed parameter list for the specified attribute.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3886
 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3887
@param aTag    The name of the attribute to be found
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3888
@param aParameterList The string to be searched
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3889
@return    TInt   The offset of the data sequence for the first attribute matching aTag
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3890
		from the beginning of the passed parameter list data
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3891
	    KErrNotFound, if the data sequence cannot be found.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3892
	     Zero, if the length of the search data sequence is zero	 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3893
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3894
TInt  CMimeParser::FindAttribute(const TDesC8& aTag,const TDesC8& aParameterList)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3895
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3896
	TInt offset = KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3897
	TInt cumulativeOffset= 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3898
	TInt tagLength=aTag.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3899
	TInt aParameterListLength =aParameterList.Length();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3900
	     
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3901
	while( offset!= KErrNotFound)	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3902
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3903
	   	offset = aParameterList.Mid(cumulativeOffset).FindF(aTag);	  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3904
		if (offset != KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3905
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3906
			// Matching string found - check that it is the correct syntax for an attribute
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3907
			// according to RFC2045 and RFC2231
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3908
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3909
			// Increment cumulativeOffset - indicates the start of this instance of aTag
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3910
			cumulativeOffset+=offset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3911
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3912
			TBool preCharValid = EFalse;			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3913
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3914
			// Check the preceeding character is OK. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3915
			// Note that test for cumulativeOffset==0 must be 1st OR'd condition
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3916
			if (cumulativeOffset==0 ||  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3917
			 aParameterList[(cumulativeOffset)-1]  == KImcvTab || 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3918
			 aParameterList[(cumulativeOffset)-1]  == KImcvSemiColon || 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3919
			 aParameterList[(cumulativeOffset)-1] == KImcvSP || 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3920
			 aParameterList[(cumulativeOffset)-1] == KImcvCR ||  
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3921
			 aParameterList[(cumulativeOffset)-1] == KImcvLF )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3922
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3923
				preCharValid = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3924
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3925
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3926
			// Check following character is OK
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3927
			// Note boundary check must be before character checks
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3928
			if ( (preCharValid) &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3929
			 ((cumulativeOffset+tagLength) < aParameterListLength) &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3930
			 (( aParameterList[cumulativeOffset+tagLength] == KImcvAny) ||    
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3931
			 (aParameterList[cumulativeOffset+tagLength] == KImcvEquals  )))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3932
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3933
				// Match found - return the offset into the original string
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3934
				return cumulativeOffset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3935
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3936
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3937
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3938
				// update cumulativeOffset to indicate end of invalid aTag match.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3939
				cumulativeOffset += tagLength;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3940
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3941
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3942
		}		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3943
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3944
	// no match found
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3945
	return KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3946
   	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3947
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3948
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3949
// iLex should currently be pointing at the space after content-type description.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3950
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3951
void CMimeParser::ExtractParameterInfoL(const TDesC8& aTag, TDes16& rBuffer, HBufC8*& rBuffer8)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3952
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3953
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3954
	TInt offset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3955
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3956
	rBuffer.Copy(KNullDesC);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3957
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3958
	// we need to extract the <aTag> text from the same line
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3959
	// iLex should currently be pointing at the space after content-type description
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3960
	if( (offset=FindAttribute(aTag,iLex.Remainder()))!=KErrNotFound )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3961
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3962
		// Check which type of encoding present.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3963
		TLexMark8 initMark;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3964
		iLex.Mark(initMark);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3965
		TLexMark8 mark;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3966
		iLex.Inc(offset+aTag.Length()); 	// move past the tag
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3967
		const TPtrC8 param = ExtractParameterString(mark);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3968
		if( param.Length() > 0 )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3969
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3970
			rBuffer8 = param.AllocLC();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3971
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3972
		if ( ParseRfc2047ParameterInfoL(param, rBuffer) == EFalse )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3973
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3974
			iLex.UnGetToMark(initMark);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3975
			ParseRfc2231ParameterInfoL(aTag, rBuffer, offset );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3976
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3977
		if( param.Length() > 0 )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3978
		    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3979
            CleanupStack::Pop(rBuffer8);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3980
		    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3981
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3982
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3983
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3984
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3985
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3986
// Detect encoding of form =?charset?Q?" Text "?=
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3987
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3988
TBool CMimeParser::ParseRfc2047ParameterInfoL(const TDesC8& aParam, TDes& rBuffer)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3989
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3990
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3991
	TBool parameterPresent = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3992
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3993
	// Check for =? somewhere in text.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3994
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3995
	if ( aParam.Find(KImcvEncodedWordStart) != KErrNotFound )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3996
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3997
		// Make assumption that '=?' appearing in parameter means 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3998
		//it is part of encoding
8b14b30db193 201044_02
hgs
parents:
diff changeset
  3999
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4000
		parameterPresent = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4001
		iImRecvConvert.iHeaderConverter->DecodeHeaderFieldL(aParam, rBuffer);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4002
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4003
	return parameterPresent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4004
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4005
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4006
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4007
// For extracting parameter data following Mime header fields, in the format
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4008
//  *(;tag=data).       As specified in rfc2231
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4009
// Assumes parameter data seperated by ';'
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4010
// Takes tag(name) of parameter as input, returning a descriptor with the data
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4011
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4012
TBool CMimeParser::ParseRfc2231ParameterInfoL(const TDesC8& aTag, TDes& rBuffer, TInt aOffset)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4013
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4014
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4015
TBool parameterPresent = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4016
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4017
	// For storing extracted parameter information
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4018
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4019
	HBufC8* info = HBufC8::NewLC(KHeaderBufferLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4020
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4021
	// For storing information relating to parameter extraction/conversion
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4022
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4023
	TInt count = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4024
	TPtrC8 charset8;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4025
	TPtrC8 language8;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4026
	TBool continuation=ETrue; // is RFC2231 section 3 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4027
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4028
	// Following rfc 2231, parameter may be encoded & folded in the following way
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4029
	//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4030
	// <name>*0*=us-ascii'en'<encoded data>
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4031
	// <name>*1*=< more encoded data>
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4032
	// <name>*2=<unencoded info>
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4033
	do 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4034
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4035
		// move past the tag	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4036
		iLex.Inc(aOffset+aTag.Length());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4037
		if (iLex.Peek() != KImcvAny) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4038
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4039
			// Default : no charset info or folding
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4040
			// move forward to the start of the boundary string itself
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4041
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4042
			while (iLex.Peek() != KImcvEquals  && !iLex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4043
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4044
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4045
				iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4046
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4047
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4048
		else	// *, Parameter is encoded
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4049
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4050
			iLex.Inc(); // Past '*'
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4051
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4052
			// If parameter folded :- need to get several bits of data and join together.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4053
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4054
			if ( iLex.Peek()!=KImcvEquals) // Get Number
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4055
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4056
				iLex.Mark(); // Beginnig of number
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4057
				iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4058
				while (iLex.Peek() != KImcvEquals && iLex.Peek() != KImcvAny && !iLex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4059
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4060
					iLex.Inc(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4061
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4062
				TPtrC8 numPtr = iLex.MarkedToken();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4063
				TLex8 lex(numPtr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4064
				lex.Val(count);  // Store number in count.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4065
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4066
				// if * exists,  has language/charset
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4067
				if (iLex.Peek() == KImcvAny) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4068
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4069
					iLex.Inc(); // Past *
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4070
					// rfc2231 section 4 - has language/charset info
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4071
					continuation = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4072
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4073
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4074
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4075
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4076
			// Must get charset & language information etc..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4077
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4078
			if (!count && !continuation)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4079
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4080
				iLex.Inc(); // Past '='
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4081
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4082
				if (iLex.Peek()==KImcvQuote)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4083
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4084
					iLex.Inc(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4085
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4086
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4087
				// Extract CHARSET token
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4088
				iLex.Mark();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4089
				while (iLex.Peek() != KImcvSingleQuote && !iLex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4090
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4091
					iLex.Inc(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4092
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4093
				TPtrC8 marked = iLex.MarkedToken();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4094
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4095
				charset8.Set(marked );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4096
				iLex.Inc(); // Past ' 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4097
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4098
				// Extract LANGUAGE token
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4099
				iLex.Mark();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4100
				while (iLex.Peek() != KImcvSingleQuote && !iLex.Eos())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4101
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4102
					iLex.Inc(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4103
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4104
				TPtrC8 marked1 = iLex.MarkedToken();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4105
				language8.Set(marked1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4106
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4107
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4108
			} // else, param encoded
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4109
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4110
		TLexMark8 mark;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4111
		TPtrC8 param = ExtractParameterString(mark);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4112
		// Save parameter data
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4113
		TInt maxlen=info->Des().MaxLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4114
		if ((*info).Length() + param.Length() > maxlen )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4115
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4116
			info = info->ReAllocL(maxlen + param.Length() + MaxMimeParameterValueLength);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4117
		 	CleanupStack::Pop();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4118
			CleanupStack::PushL(info); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4119
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4120
		info->Des().Append( param );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4121
	} while( ( aOffset=FindAttribute(aTag,iLex.Remainder()))!=KErrNotFound );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4122
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4123
	TPtr8 infoPtr(info->Des());	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4124
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4125
	DecodeRfc2231ParameterInfoL( infoPtr, rBuffer, charset8/*, language8*/ );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4126
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4127
	CleanupStack::PopAndDestroy(info); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4128
	return parameterPresent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4129
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4130
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4131
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4132
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4133
TBool CMimeParser::DecodeRfc2231ParameterInfoL(TDes8& aInput, TDes& rBufOut, 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4134
											   		TPtrC8 aCharset/*, TPtrC8 aLanguage*/)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4135
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4136
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4137
	HBufC8* QPdecodedbuf = HBufC8::NewLC( aInput.Length() );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4138
	TPtr8 ptr(QPdecodedbuf->Des());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4139
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4140
	iImRecvConvert.iQPCodec.SetQPChar(KImcvPercentSign);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4141
	iImRecvConvert.iQPCodec.Decode( aInput, ptr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4142
	iImRecvConvert.iQPCodec.SetQPChar(KImcvEquals);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4143
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4144
	// Convert parameter, based on charset supplied.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4145
	CImConvertCharconv& charconv = iImRecvConvert.CharacterConverter();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4146
	TUint id = charconv.GetMimeCharsetUidL( aCharset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4147
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4148
	if(id==KUidMsvCharsetNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4149
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4150
		id=charconv.SystemDefaultCharset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4151
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4152
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4153
	// DEF055073 - find the maximum length of the descriptor we are filling
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4154
	TInt maxLength = rBufOut.MaxLength();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4155
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4156
	if (!charconv.PrepareToConvertToFromOurCharsetL(id))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4157
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4158
		// DEF055073 - Only attempt copy, if ptr will fit inside rBufOut
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4159
		if(ptr.Length() <= maxLength)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4160
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4161
			rBufOut.Copy(ptr);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4162
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4163
		/* Otherwise, just copy what will fit. This is OK, because 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4164
		 * charconv.ConvertToOurCharsetL also truncates to avoid
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4165
		 * an overflow */
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4166
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4167
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4168
			rBufOut.Copy(ptr.Left(maxLength));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4169
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4170
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4171
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4172
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4173
		// Charset found, so do conversion
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4174
		TInt unconverted;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4175
		TInt indexOfFirst;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4176
		TInt rem = charconv.ConvertToOurCharsetL(ptr, rBufOut, unconverted, indexOfFirst);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4177
		if (rem < 0) // error
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4178
			Append(rBufOut, ptr);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4179
		else if (rem && rem < KConversionRemainderLength)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4180
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4181
			// DEF055073 - Only attempt copy, if ptr will fit inside rBufOut
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4182
			if(ptr.Length() <= maxLength)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4183
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4184
				rBufOut.Copy(ptr);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4185
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4186
			/* Otherwise, just copy what will fit. This is OK, because 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4187
			 * charconv.ConvertToOurCharsetL also truncates to avoid
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4188
			 * an overflow */
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4189
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4190
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4191
				rBufOut.Copy(ptr.Left(maxLength));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4192
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4193
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4194
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4195
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4196
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4197
	CleanupStack::PopAndDestroy(QPdecodedbuf);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4198
	return ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4199
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4200
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4201
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4202
// Check for delimiter & mark parameter text string
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4203
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4204
TPtrC8 CMimeParser::ExtractParameterString(TLexMark8& rMark)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4205
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4206
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4207
	// move on to the first char of the boundary ; this MIGHT be a double-quote
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4208
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4209
	TBool delimited = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4210
	TBool encodedWord = EFalse; //Non compliance of RFC-2047 for ContentType & Content Disposition
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4211
	iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4212
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4213
	if ( iLex.Peek() == KImcvDoubleQuote )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4214
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4215
		delimited = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4216
		iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4217
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4218
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4219
	while ( iLex.Peek().IsSpace() )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4220
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4221
		iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4222
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4223
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4224
	iLex.Mark( rMark );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4225
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4226
	//Check if the encoded_word exists, set the flag to parse the string.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4227
	//Ex: Content-Disposition: attachment; filename==?KOI8-R?B?RG9jdW1lbnQ2LnR4dA==?=
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4228
	if(iLex.Peek() == KImcvEquals)   //search for QuestionMark followed by Equals	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4229
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4230
		iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4231
		if(iLex.Peek() == KImcvQuestionMark)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4232
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4233
			encodedWord = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4234
			iLex.Inc();	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4235
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4236
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4237
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4238
			iLex.UnGet();	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4239
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4240
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4241
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4242
	TBool finished = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4243
	while ( !finished  && !iLex.Eos() )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4244
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4245
		iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4246
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4247
		if ( delimited )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4248
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4249
			finished = (iLex.Peek() == KImcvDoubleQuote);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4250
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4251
		else if(encodedWord)     //Parse the string if encoded_word exists.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4252
			{                    //Ex: Content-Disposition: attachment; filename==?KOI8-R?B?RG9jdW1lbnQ2LnR4dA==?=
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4253
			if(iLex.Peek() == KImcvQuestionMark)    // search for Equals followed by QuestionMark, and set finished flag to ETrue.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4254
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4255
				iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4256
				if(iLex.Peek() == KImcvEquals)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4257
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4258
					iLex.Inc();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4259
					finished = ETrue;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4260
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4261
					else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4262
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4263
					iLex.UnGet();		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4264
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4265
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4266
			}			
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4267
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4268
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4269
			finished = ( iLex.Peek().IsSpace() || IsSpecialChar((TUint8)iLex.Peek()) );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4270
		 	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4271
		} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4272
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4273
	return iLex.MarkedToken( rMark );
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4274
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4275
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4276
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4277
// Which charset to use .. ? If the body part charset set, use that.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4278
// else if the main header charset set, use that... else default to us-ascii.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4279
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4280
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4281
TUint CMimeParser::CurrentCharsetL() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4282
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4283
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4284
	TPtrC8 paramCharset = GetContentTypeValue(KImcvCharset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4285
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4286
	TUint charsetId;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4287
	if (paramCharset.Length())
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4288
		// charset parameter present.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4289
		charsetId = iImRecvConvert.CharacterConverter().GetMimeCharsetUidL(paramCharset);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4290
	else if (iCharset) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4291
		// Main Mime header has default charset value.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4292
		charsetId = iCharset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4293
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4294
		charsetId = iDefaultCharset;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4295
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4296
	return charsetId;		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4297
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4298
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4299
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4300
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4301
const TPtrC8 CMimeParser::GetContentTypeValue(const TDesC8& aContentTypeParameter) const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4302
//----------------------------------------------------------------------------------------
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4303
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4304
	CDesC8Array& contentTypeParams = iMimeHeader->ContentTypeParams();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4305
	__ASSERT_DEBUG(!(contentTypeParams.Count()&1), User::Invariant());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4306
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4307
	TInt result;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4308
	if (KErrNone==contentTypeParams.Find(aContentTypeParameter,result,ECmpFolded8))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4309
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4310
		result++;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4311
		if ((result&1) && result <= contentTypeParams.Count())    
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4312
			{       
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4313
				// check result+1 is odd & entry exists
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4314
				return iMimeHeader->ContentTypeParams()[result];
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4315
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4316
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4317
	return TPtrC8();        // couldn't find match so return an empty descriptor
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4318
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4319
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4320
void CImRecvConvert::ImCafRegisterL(const TDesC8& aMimeLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4321
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4322
	if(iCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4323
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4324
		iCaf->RegisterL(aMimeLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4325
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4326
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4327
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4328
void CImRecvConvert::ImAddToCafMetaDataL(const TDesC8& aMimeLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4329
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4330
	if(iCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4331
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4332
		iCaf->AddToMetaDataL(aMimeLine);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4333
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4334
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4335
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4336
void CImRecvConvert::ImAddToCafMetaDataL(const TDesC8& aField, const TDesC8& aData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4337
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4338
	if(iCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4339
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4340
		iCaf->AddToMetaDataL(aField,aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4341
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4342
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4343
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4344
TBool CImRecvConvert::ImCafProcessing() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4345
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4346
	if(iCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4347
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4348
		return iCaf->Processing();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4349
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4350
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4351
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4352
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4353
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4354
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4355
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4356
TBool CImRecvConvert::ImCafRegistered() const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4357
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4358
	if(iCaf)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4359
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4360
		return iCaf->Registered();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4361
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4362
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4363
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4364
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4365
		}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4366
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  4367