email/imap4mtm/imapsession/src/cimapbodystructurebuilder.cpp
author hgs
Wed, 03 Nov 2010 22:55:44 +0530
changeset 80 8b14b30db193
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
8b14b30db193 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2009 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 "cimapbodystructurebuilder.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    17
8b14b30db193 201044_02
hgs
parents:
diff changeset
    18
#include "cimapatom.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    19
#include "cimapatomwalker.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    20
#include "cimapatomparser.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    21
#include "cimapbodystructure.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    22
#include "cimapfetchresponse.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    23
#include "cimapsessionconsts.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    24
#include "cimapcommand.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    25
#include "imappaniccodes.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    26
8b14b30db193 201044_02
hgs
parents:
diff changeset
    27
8b14b30db193 201044_02
hgs
parents:
diff changeset
    28
CImapBodyStructureBuilder* CImapBodyStructureBuilder::NewL(CImapFetchResponse& aFetchResponse, TInt aLogId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    29
// static method
8b14b30db193 201044_02
hgs
parents:
diff changeset
    30
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    31
	CImapBodyStructureBuilder* self = new(ELeave)CImapBodyStructureBuilder(aFetchResponse, aLogId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    32
	CleanupStack::PushL(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    33
	self->ConstructL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    34
	CleanupStack::Pop(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    35
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    36
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    37
CImapBodyStructureBuilder::CImapBodyStructureBuilder(CImapFetchResponse& aFetchResponse, TInt aLogId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    38
	: iFetchResponse(aFetchResponse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    39
	, iBodyStructureOwned(ETrue)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    40
	, iProcessBlockState(EWaitLine)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    41
	, iLogId(aLogId)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    42
	{}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    43
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    44
void CImapBodyStructureBuilder::ConstructL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
    45
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    46
	iAtomParser = CImapAtomParser::NewL(EFalse, iLogId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    47
	iAtomWalker = CImapAtomWalker::NewL(iLogId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    48
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    49
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    50
CImapBodyStructureBuilder::~CImapBodyStructureBuilder()
8b14b30db193 201044_02
hgs
parents:
diff changeset
    51
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    52
	delete iAtomWalker;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    53
	delete iAtomParser;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    54
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    55
	// NOTE
8b14b30db193 201044_02
hgs
parents:
diff changeset
    56
	//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    57
	// CImapBodyStructure is a tree data strucutre, where any CImapBodyStructure owns and 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    58
	// is responssible for destroying its children.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    59
	//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    60
	// iBodyStructureStack[0] is the root bodystructure 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    61
	// ownership of the which is usually passed to CImapFetchResponse object before we get here
8b14b30db193 201044_02
hgs
parents:
diff changeset
    62
	// So destroying iBodyStructureStack[0] will cause all its children to be destroyed too.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    63
	//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    64
	// With the exception of the root bodystructure, iBodyStructureStack does not own any 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    65
	// of the objects it points to, and MUST NOT destroy them.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    66
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    67
	if (iBodyStructureOwned)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    68
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    69
		if (iBodyStructureStack.Count() > 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    70
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    71
			// delete the root bodystructure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    72
			delete iBodyStructureStack[0];
8b14b30db193 201044_02
hgs
parents:
diff changeset
    73
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    74
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    75
	iBodyStructureStack.Close(); // And DO NOT destroy the data that is pointed to.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    76
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    77
8b14b30db193 201044_02
hgs
parents:
diff changeset
    78
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    79
Parses a block of incoming data from the session.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    80
ProcessBlockL() should be called repeatedly with more data until it returns EFalse to 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    81
indicate that enough data has been received.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    82
This method parses the incoming data into an atom tree as the data is received.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    83
When the last block of data is received, the method will then parse the complete atom tree,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    84
populating iFetchResponse with a fully initialised CImapBodyStructure tree.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    85
@param aData either a line or literal block of data.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    86
@return Whether ProcessBlockL() expects to be called again with the next block of data from the session.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    87
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    88
TBool CImapBodyStructureBuilder::ProcessBlockL(const TDesC8& aData)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    89
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    90
	TBool wantMore = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    91
	switch (iProcessBlockState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    92
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    93
		case EWaitLine:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    94
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    95
			wantMore = iAtomParser->ProcessLineL(aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    96
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
    97
			if (!wantMore)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    98
				{				
8b14b30db193 201044_02
hgs
parents:
diff changeset
    99
				iAtomWalker->SetRootL(iAtomParser->RootAtom());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   100
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   101
				// Get to the first "("
8b14b30db193 201044_02
hgs
parents:
diff changeset
   102
				__ASSERT_ALWAYS(iAtomWalker->CurrentDes(EFalse).Length()==0, CImapCommand::CorruptDataL(iLogId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   103
				__ASSERT_ALWAYS(iAtomWalker->PeekAcross() == NULL, CImapCommand::CorruptDataL(iLogId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   104
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
   105
				iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   106
				__ASSERT_ALWAYS(iAtomWalker->CurrentMatch(KImapTxtOpenBracket()), CImapCommand::CorruptDataL(iLogId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   107
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   108
				iProcessBlockState = EParsing;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   109
				ParseLoopL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   110
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   111
				TransferBufferOwnershipToFetchResponseL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   112
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   113
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   114
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   115
				iProcessBlockState = EWaitLiteral;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   116
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   117
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   118
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   119
		case EWaitLiteral:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   120
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   121
			iAtomParser->ProcessLiteralBlockL(aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   122
			iProcessBlockState = EWaitLine;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   123
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   124
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   125
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   126
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   127
			// This is an internal programming error.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   128
			__ASSERT_DEBUG(EFalse, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderInvalidProcessBlockState));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   129
			wantMore = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   130
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   131
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   132
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   133
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   134
	return wantMore;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   135
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   136
8b14b30db193 201044_02
hgs
parents:
diff changeset
   137
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   138
Assigns the root bodystructure object, and its associated data to iFetchResponse.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   139
iFetchResponse takes ownership of the bodystructure and its data.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   140
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   141
void CImapBodyStructureBuilder::TransferBufferOwnershipToFetchResponseL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   142
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   143
	// Check for internal programming errors.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   144
	__ASSERT_DEBUG(iBodyStructureOwned, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderRootNotOwned));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   145
	__ASSERT_DEBUG(iBodyStructureStack.Count() == 1, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderExpectedRootAtomOnlyOnStack));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   146
	__ASSERT_DEBUG(iBodyStructureStack[0] == iBodyStructure, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderCurrentAtomIsNotRoot));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   147
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   148
	// Prepare to transfer ownership of bodyStructureData from iAtomParser to iFetchResponse
8b14b30db193 201044_02
hgs
parents:
diff changeset
   149
	// bodyStructureData will no longer be owned by iAtomParser
8b14b30db193 201044_02
hgs
parents:
diff changeset
   150
	HBufC8* bodyStructureData = iAtomParser->DetachBuffer();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   151
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   152
	// Transfer ownership of iBodyStructure and bodyStructureData to iFetchResponse
8b14b30db193 201044_02
hgs
parents:
diff changeset
   153
	iFetchResponse.SetBodyStructure(iBodyStructure, bodyStructureData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   154
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   155
	// iBodyStructure is no longer owned by "this" CImapBodyStructureBuilder object.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   156
	iBodyStructureOwned = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   157
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   158
8b14b30db193 201044_02
hgs
parents:
diff changeset
   159
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   160
Returns any data that was not parsed by ParseBlockL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   161
 - i.e any data that follows the top level BODYSTRUCTURE.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   162
This will be a null string until ParseBlockL() has returned EFalse
8b14b30db193 201044_02
hgs
parents:
diff changeset
   163
to indicate that it has finished parsing.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   164
When non-null, the returned pointer descriptor points into a section of the 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   165
aData descriptor that was passed into ParseBlockL().  Consequently, it is
8b14b30db193 201044_02
hgs
parents:
diff changeset
   166
only valid while the aData descriptor it points into is valid.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   167
@return a descriptor pointing to unparsed data.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   168
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   169
TPtrC8 CImapBodyStructureBuilder::UnparsedData()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   170
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   171
	return iAtomParser->UnparsedData();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   172
	}	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   173
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   174
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   175
The main loop for parsing the bodystructure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   176
The loop uses a state machine and bodystructure stack in order to handle
8b14b30db193 201044_02
hgs
parents:
diff changeset
   177
embedded bodystructures without needing to use recursion.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   178
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   179
void CImapBodyStructureBuilder::ParseLoopL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   180
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   181
	// Check for internal programming error
8b14b30db193 201044_02
hgs
parents:
diff changeset
   182
	__ASSERT_DEBUG(iBodyStructureStack.Count() == 0, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderStackNotEmpty));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   183
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   184
	TParseStep parseStep = EParseNewBodyStructure;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   185
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   186
	while (parseStep != EParseComplete)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   187
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   188
		switch (parseStep)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   189
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   190
			case EParseNewBodyStructure:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   191
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   192
				// Either at the start of the root body structure,
8b14b30db193 201044_02
hgs
parents:
diff changeset
   193
				// Or at the start of an embedded body structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   194
				PushNewBodyStructureL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   195
				parseStep = ParseBodyStructureTypeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   196
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   197
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   198
			case EParseBasic:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   199
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   200
				// Found a "basic" bodystructure - i.e. not text, rfc822 or multipart.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   201
				ParseBodyTypeBasicL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   202
				ParseBodyExt1PartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   203
				parseStep = EParseSubStructureComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   204
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   205
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   206
			case EParseText:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   207
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   208
				// Found a "TEXT" body structure
8b14b30db193 201044_02
hgs
parents:
diff changeset
   209
				ParseBodyTypeTextL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   210
				ParseBodyExt1PartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   211
				parseStep = EParseSubStructureComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   212
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   213
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   214
			case EParseBodyTypeMessageRfc822:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   215
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   216
				// Found a "MESSAGE/RFC822" body structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   217
				// This contains an embedded bodystructure, so parse up to the structure,
8b14b30db193 201044_02
hgs
parents:
diff changeset
   218
				// and then allow the loop to parse the embedded structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   219
				TRAPD(err, ParseBodyTypeMessageRfc822L());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   220
				if(err == KErrImapCorrupt)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   221
				    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
   222
				parseStep =EParseRemainderMessageRfc822;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   223
				    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
   224
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   225
				    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
   226
                    parseStep = EParseNewBodyStructure;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   227
				    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
   228
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   229
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   230
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   231
			case EParseRemainderMessageRfc822:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   232
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   233
				// Just finished parsing the embedded bodystructure of a "MESSAGE/RFC822".
8b14b30db193 201044_02
hgs
parents:
diff changeset
   234
				// Complete parsing the parent MESSAGE/RFC822 structure here.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   235
				ParseRemainderMessageRfc822L();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   236
				ParseBodyExt1PartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   237
				parseStep = EParseSubStructureComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   238
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   239
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   240
			case EParseRemainderMultipart:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   241
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   242
				// Just finished parsing the final embedded bodystructure of a MULTIPART structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   243
				// Complete parsing the parent MULTIPART structure here
8b14b30db193 201044_02
hgs
parents:
diff changeset
   244
				ParseRemainderMultipartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   245
				parseStep = EParseSubStructureComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   246
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   247
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   248
			case EParseSubStructureComplete:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   249
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   250
				// Just finished parsing a bodystructure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   251
				// If it is the root bodystructure then we are complete.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   252
				// Otherwise, let ParseSubStructureCompleteL() will find out whether it is
8b14b30db193 201044_02
hgs
parents:
diff changeset
   253
				// * embedded in a MESSAGE/RFC822 structure - requiring the remainder to be parsed next: EParseRemainderMessageRfc822
8b14b30db193 201044_02
hgs
parents:
diff changeset
   254
				// * embedded in a MULTIPART structure in which case
8b14b30db193 201044_02
hgs
parents:
diff changeset
   255
				//   > either there is another embedded structure next: EParseNewBodyStructure
8b14b30db193 201044_02
hgs
parents:
diff changeset
   256
				//   > or this is the last embedded structure, so we need to parse the multipart remainder: EParseRemainderMultipart
8b14b30db193 201044_02
hgs
parents:
diff changeset
   257
					
8b14b30db193 201044_02
hgs
parents:
diff changeset
   258
				if (PopBodyStructureL())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   259
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   260
					// we were actually in the root, so we are fully complete.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   261
					parseStep = EParseComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   262
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   263
				else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   264
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   265
					// we were in a genuine substructure, so need to walk up and decide what to do.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   266
					parseStep = ParseSubStructureCompleteL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   267
					}				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   268
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   269
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   270
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   271
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   272
				// This is an internal programming error.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   273
				__ASSERT_DEBUG(EFalse, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderInvalidParseStep));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   274
				User::Leave(KErrGeneral); // avoid an infinite loop.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   275
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   276
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   277
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   278
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   279
8b14b30db193 201044_02
hgs
parents:
diff changeset
   280
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   281
When the parse loop comes across a new root or embedded bodystructure, it will use this method to...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   282
  > Create a new CImapBodyStructure object to represent the bodystructure
8b14b30db193 201044_02
hgs
parents:
diff changeset
   283
  > Push the object onto the stack and make it "current"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   284
  > Associate an embedded bodystructure with its parent.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   285
8b14b30db193 201044_02
hgs
parents:
diff changeset
   286
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   287
void CImapBodyStructureBuilder::PushNewBodyStructureL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   288
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   289
	// Going to create a new body structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   290
	// Need to be sure that something (either the stack root or its tree)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   291
	// is going to own and ultimatelty destroy it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   292
	__ASSERT_DEBUG(iBodyStructureOwned, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderRootNotOwned));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   293
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   294
	CImapBodyStructure* bodyStructure = CImapBodyStructure::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   295
	CleanupStack::PushL(bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   296
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   297
	// root bodystructure is iBodyStructureStack[0]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   298
	if (iBodyStructure == NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   299
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   300
		// Check for internal programming error
8b14b30db193 201044_02
hgs
parents:
diff changeset
   301
		__ASSERT_DEBUG(iBodyStructureStack.Count() == 0, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderStackNotEmpty));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   302
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   303
		iBodyStructureStack.AppendL(bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   304
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   305
		// ownership is now transferred to the root bodystructure tree
8b14b30db193 201044_02
hgs
parents:
diff changeset
   306
		CleanupStack::Pop(bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   307
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   308
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   309
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   310
		// Check for internal programming error
8b14b30db193 201044_02
hgs
parents:
diff changeset
   311
		__ASSERT_DEBUG(iBodyStructureStack.Count() > 0, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderStackIsEmpty));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   312
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   313
		iBodyStructure->AppendEmbeddedBodyStructureL(*bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   314
										
8b14b30db193 201044_02
hgs
parents:
diff changeset
   315
		// ownership is now transferred to the root bodystructure tree
8b14b30db193 201044_02
hgs
parents:
diff changeset
   316
		CleanupStack::Pop(bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   317
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   318
		iBodyStructureStack.AppendL(bodyStructure);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   319
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   320
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   321
	// This is now the bodystructure that we are parsing.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   322
	iBodyStructure = bodyStructure;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   323
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   324
8b14b30db193 201044_02
hgs
parents:
diff changeset
   325
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   326
Pops a bodystructure from the stack - except the root, which will not be popped.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   327
@return whether we were in the root already.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   328
*/	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   329
TBool CImapBodyStructureBuilder::PopBodyStructureL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   330
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   331
	TBool bRootAlready = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   332
	TInt stackCount = iBodyStructureStack.Count();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   333
8b14b30db193 201044_02
hgs
parents:
diff changeset
   334
	if (stackCount > 1)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   335
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   336
		// Pop the bodystructure stack
8b14b30db193 201044_02
hgs
parents:
diff changeset
   337
		--stackCount;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   338
		CImapBodyStructure* poppedBs = iBodyStructureStack[stackCount];
8b14b30db193 201044_02
hgs
parents:
diff changeset
   339
		iBodyStructureStack.Remove(stackCount); // No need to destroy the bodystructure, as it is now owned by iBodyStructureStack[stackCount-1]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   340
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   341
		iBodyStructure = iBodyStructureStack[stackCount-1];
8b14b30db193 201044_02
hgs
parents:
diff changeset
   342
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   343
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   344
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   345
		// Check for internal programming error: Not expecting a stack count of 0 or less
8b14b30db193 201044_02
hgs
parents:
diff changeset
   346
		__ASSERT_DEBUG(stackCount == 1, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderExpectedRootAtomOnlyOnStack));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   347
		bRootAlready = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   348
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   349
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   350
	return bRootAlready;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   351
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   352
8b14b30db193 201044_02
hgs
parents:
diff changeset
   353
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   354
Found the closing bracket of our substructure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   355
Pop the stack, walk up and decide what to do next.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   356
If we've reached the root level, then parsing is complete.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   357
If our parent is a multipart, then check to see if we have a sibling.  
8b14b30db193 201044_02
hgs
parents:
diff changeset
   358
	If not then we have come to the end of our parent's structure too - handle this in a separate loop.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   359
If our parent is a Rfc822, then we need to parse the remainder of the Rfc822 structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   360
	If not then we have come to the end of our parent's structure too - handle this in a separate loop.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   361
@return 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   362
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   363
CImapBodyStructureBuilder::TParseStep CImapBodyStructureBuilder::ParseSubStructureCompleteL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   364
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   365
	TParseStep nextStep = EParseComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   366
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   367
	iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   368
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   369
	if (iBodyStructure->BodyStructureType() == CImapBodyStructure::ETypeMultipart)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   370
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   371
		// Expecting either an open bracket for another bodystructure
8b14b30db193 201044_02
hgs
parents:
diff changeset
   372
		// or the subtype. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   373
		CImapAtom* peekAcross = iAtomWalker->PeekAcross(); // peekAcross does not need to be destroyed as no ownership is transferred.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   374
		if (peekAcross == NULL)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   375
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   376
			// But not expecting "nothing".
8b14b30db193 201044_02
hgs
parents:
diff changeset
   377
			CImapCommand::CorruptDataL(iLogId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   378
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   379
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   380
		if (peekAcross->Match(KImapTxtOpenBracket()))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   381
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   382
			// position the atom walker on the open bracket, ready for ParseBodyStructureTypeL
8b14b30db193 201044_02
hgs
parents:
diff changeset
   383
			// to walk down into it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   384
			iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   385
			nextStep = EParseNewBodyStructure;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   386
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   387
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   388
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   389
			// stay where we are, so that ParseRemainderMultipartL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   390
			// can walk accross to the subtype, as any other Parse method would do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   391
			nextStep = EParseRemainderMultipart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   392
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   393
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   394
	else if (iBodyStructure->BodyStructureType() == CImapBodyStructure::ETypeMessageRfc822)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   395
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   396
		// stay where we are, so that ParseRemainderMessageRfc822L()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   397
		// can walk accross to the body-fld-lines, as any other Parse method would do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   398
		nextStep = EParseRemainderMessageRfc822;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   399
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   400
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   401
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   402
		// No other bodystruct type has substructures.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   403
		// So getting here is an internal programming error.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   404
		__ASSERT_DEBUG(EFalse, TImapServerPanic::ImapPanic(TImapServerPanic::EBodyStructureBuilderInvalidBodyStructureType));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   405
		User::Leave(KErrGeneral);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   406
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   407
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   408
	return nextStep;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   409
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   410
8b14b30db193 201044_02
hgs
parents:
diff changeset
   411
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   412
body = "(" (body-type-1part / body-type-mpart) ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   413
8b14b30db193 201044_02
hgs
parents:
diff changeset
   414
This method expects iAtomWalker to be positioned at the opening bracket of a body structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   415
The method works out the type of the bodystructure, and returns the appropriate next parse 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   416
step to the parse loop.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   417
For multipart structures, iAtomWalker is left positioned at the opening bracket of the embedded structure.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   418
Foa all other structures, iAtomWalker is left positioned at the subtype field.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   419
8b14b30db193 201044_02
hgs
parents:
diff changeset
   420
@return The next step for the parse loop to take.  This is one of
8b14b30db193 201044_02
hgs
parents:
diff changeset
   421
  > EParseNewBodyStructure for MULTIPART structures
8b14b30db193 201044_02
hgs
parents:
diff changeset
   422
  > EParseText for TEXT structures
8b14b30db193 201044_02
hgs
parents:
diff changeset
   423
  > EParseBodyTypeMessageRfc822 for MESSAGE/RFC822
8b14b30db193 201044_02
hgs
parents:
diff changeset
   424
  > EParseBasic for all other structures.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   425
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   426
CImapBodyStructureBuilder::TParseStep CImapBodyStructureBuilder::ParseBodyStructureTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   427
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   428
	// Start at the opening bracket
8b14b30db193 201044_02
hgs
parents:
diff changeset
   429
	__ASSERT_ALWAYS(iAtomWalker->CurrentMatch(KImapTxtOpenBracket()), CImapCommand::CorruptDataL(iLogId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   430
	iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   431
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   432
	// What kind of body type does this represent?	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   433
	// Assume Basic, unless we find otherwise.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   434
	TParseStep nextStep = EParseBasic;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   435
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   436
	// Is it body-type-mpart? - check for opening bracket
8b14b30db193 201044_02
hgs
parents:
diff changeset
   437
	// body-type-mpart = 1*body SP media-subtype [SP body-ext-mpart]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   438
	if (iAtomWalker->CurrentMatch(KImapTxtOpenBracket()))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   439
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   440
		// According to section 6.4.5 of RFC3501, "MULTIPART" is the correct Type string for
8b14b30db193 201044_02
hgs
parents:
diff changeset
   441
		// multipart messages.  This is an implicit value not directly available from the
8b14b30db193 201044_02
hgs
parents:
diff changeset
   442
		// bodystructure input string.  So we point the bodystructure object at a constant string instead.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   443
		iBodyStructure->SetType(KImapTxtMultipart());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   444
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   445
		iBodyStructure->SetBodyStructureType(CImapBodyStructure::ETypeMultipart);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   446
		nextStep = EParseNewBodyStructure;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   447
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   448
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   449
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   450
		// body-type-1part = (body-type-basic / body-type-msg / body-type-text) [SP body-ext-1part]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   451
		iBodyStructure->SetType(iAtomWalker->CurrentDes(EFalse)); // media-basic and variants is a string, not an nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   452
		__ASSERT_ALWAYS(iAtomWalker->PeekDown() == NULL, CImapCommand::CorruptDataL(iLogId));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   453
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   454
		iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   455
		iBodyStructure->SetSubType(iAtomWalker->CurrentDes(EFalse)); // media-subtype and variants is a string, not an nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   456
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   457
		if (iBodyStructure->Type().CompareF(KImapTxtText())==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   458
		// body-type-text = media-text SP body-fields SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   459
		// 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   460
		// media-text = DQUOTE "TEXT" DQUOTE SP media-subtype
8b14b30db193 201044_02
hgs
parents:
diff changeset
   461
		// media-subtype = string
8b14b30db193 201044_02
hgs
parents:
diff changeset
   462
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   463
			// we have media-text...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   464
			// ... so this is body-type-text
8b14b30db193 201044_02
hgs
parents:
diff changeset
   465
			iBodyStructure->SetBodyStructureType(CImapBodyStructure::ETypeText);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   466
			nextStep = EParseText;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   467
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   468
		else if (iBodyStructure->Type().CompareF(KImapTxtMessage())==0 && iBodyStructure->SubType().CompareF(KImapTxtRfc822())==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   469
		// body-type-msg = media-message SP body-fields SP envelope SP body SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   470
		// 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   471
		// media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE
8b14b30db193 201044_02
hgs
parents:
diff changeset
   472
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   473
			// we have media-message...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   474
			// ... so this is body-type-msg
8b14b30db193 201044_02
hgs
parents:
diff changeset
   475
			iBodyStructure->SetBodyStructureType(CImapBodyStructure::ETypeMessageRfc822);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   476
			nextStep = EParseBodyTypeMessageRfc822;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   477
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   478
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   479
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   480
			// Not multipart, text or rfc822, so must be basic.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   481
			iBodyStructure->SetBodyStructureType(CImapBodyStructure::ETypeBasic);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   482
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   483
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   484
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   485
	return nextStep;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   486
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   487
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   488
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   489
body-type-basic = media-basic SP body-fields
8b14b30db193 201044_02
hgs
parents:
diff changeset
   490
8b14b30db193 201044_02
hgs
parents:
diff changeset
   491
This method expects media-basict to have been parsed already, as part of ParseBodyStructureTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   492
It expects the atom walker to be positioned at the last atom of media-basic
8b14b30db193 201044_02
hgs
parents:
diff changeset
   493
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   494
void CImapBodyStructureBuilder::ParseBodyTypeBasicL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   495
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   496
	// body-fields
8b14b30db193 201044_02
hgs
parents:
diff changeset
   497
	ParseBodyFieldsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   498
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   499
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   500
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   501
body-type-text = media-text SP body-fields SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   502
8b14b30db193 201044_02
hgs
parents:
diff changeset
   503
This method expects media-text to have been parsed already, as part of ParseBodyStructureTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   504
It expects the atom walker to be positioned at the last atom of media-text
8b14b30db193 201044_02
hgs
parents:
diff changeset
   505
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   506
void CImapBodyStructureBuilder::ParseBodyTypeTextL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   507
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   508
	// body-fields
8b14b30db193 201044_02
hgs
parents:
diff changeset
   509
	ParseBodyFieldsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   510
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   511
	// body-fld-lines = number
8b14b30db193 201044_02
hgs
parents:
diff changeset
   512
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   513
	iBodyStructure->SetBodyLines(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   514
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   515
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   516
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   517
body-type-msg = media-message SP body-fields SP envelope SP body SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   518
8b14b30db193 201044_02
hgs
parents:
diff changeset
   519
This method parses up to and including envelope.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   520
It then returns, allowing the parse loop to parse the nested "body" that is next.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   521
Upon completion of the nested "body", ParseRemainderMessageRfc822L() will be called to finish parsing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   522
the message body type
8b14b30db193 201044_02
hgs
parents:
diff changeset
   523
8b14b30db193 201044_02
hgs
parents:
diff changeset
   524
This method expects media-message to have been parsed already, as part of ParseBodyStructureTypeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   525
It expects the atom walker to be positioned at the last atom of media-text
8b14b30db193 201044_02
hgs
parents:
diff changeset
   526
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   527
void CImapBodyStructureBuilder::ParseBodyTypeMessageRfc822L()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   528
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   529
	// body-fields SP SP body SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   530
	ParseBodyFieldsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   531
	//Sometime RFCb22  message has empty evvelopel, in that case we are traping this and  processed.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   532
    TRAPD(err, ParseEnvelopeL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   533
   
8b14b30db193 201044_02
hgs
parents:
diff changeset
   534
    // Expect a body substructure next.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   535
    // Position iAtomWalker at the opening bracket, ready for ParseBodyStructureTypeL
8b14b30db193 201044_02
hgs
parents:
diff changeset
   536
    iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   537
    if(err == KErrImapCorrupt)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   538
        CImapCommand::CorruptDataL(iLogId);
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
body-type-msg = media-message SP body-fields SP envelope SP body SP body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   543
8b14b30db193 201044_02
hgs
parents:
diff changeset
   544
ParseBodyTypeMessageRfc822L processes up to and including body-fields.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   545
The ParseLoop processes the nested "body"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   546
This method processes the remainder - i.e. body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   547
It expects the atom walker to be positioned at the field just prior to body-fld-lines
8b14b30db193 201044_02
hgs
parents:
diff changeset
   548
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   549
void CImapBodyStructureBuilder::ParseRemainderMessageRfc822L()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   550
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   551
	// body-fld-lines = number
8b14b30db193 201044_02
hgs
parents:
diff changeset
   552
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   553
	iBodyStructure->SetBodyLines(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   554
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   555
8b14b30db193 201044_02
hgs
parents:
diff changeset
   556
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   557
body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP body-fld-enc SP body-fld-octets	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   558
8b14b30db193 201044_02
hgs
parents:
diff changeset
   559
This method expects iAtomWalker to be positioned just prior to body-fld-param
8b14b30db193 201044_02
hgs
parents:
diff changeset
   560
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   561
void CImapBodyStructureBuilder::ParseBodyFieldsL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   562
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   563
	ParseBodyFieldParamsL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   564
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   565
	// body-fld-id = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   566
	iAtomWalker->WalkAcrossL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   567
	iBodyStructure->SetBodyId(iAtomWalker->CurrentDes(ETrue)); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   568
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   569
	// body-fld-desc = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   570
	iAtomWalker->WalkAcrossL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   571
	iBodyStructure->SetBodyDescription(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   572
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   573
	// body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ "QUOTED-PRINTABLE") DQUOTE) / string
8b14b30db193 201044_02
hgs
parents:
diff changeset
   574
	// i.e. it's a string that might be in quotes
8b14b30db193 201044_02
hgs
parents:
diff changeset
   575
	iAtomWalker->WalkAcrossL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   576
	iBodyStructure->SetBodyEncoding(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   577
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   578
	// body-fld-octets = number
8b14b30db193 201044_02
hgs
parents:
diff changeset
   579
	iAtomWalker->WalkAcrossL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   580
	iBodyStructure->SetBodySizeOctets(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   581
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   582
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   583
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   584
body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   585
8b14b30db193 201044_02
hgs
parents:
diff changeset
   586
This method expects iAtomWalker to be positioned just prior to the "(" or "NIL" atom.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   587
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   588
void CImapBodyStructureBuilder::ParseBodyFieldParamsL(TBool aStoreAsDisposition)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   589
8b14b30db193 201044_02
hgs
parents:
diff changeset
   590
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   591
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomNil)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   592
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   593
		// there are no params
8b14b30db193 201044_02
hgs
parents:
diff changeset
   594
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   595
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   596
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   597
	// Consume the bracket
8b14b30db193 201044_02
hgs
parents:
diff changeset
   598
	iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   599
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   600
	do 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   601
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   602
		CImapBodyStructure::TAttributeValuePair pair;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   603
		pair.iAttribute.Set(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   604
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   605
		iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   606
		pair.iValue.Set(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   607
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   608
		if (aStoreAsDisposition)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   609
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   610
			iBodyStructure->AppendExtDispositionParameterListL(pair);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   611
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   612
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   613
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   614
			iBodyStructure->AppendParameterListL(pair);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   615
			}		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   616
		} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   617
		while (iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   618
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   619
	iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   620
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   621
8b14b30db193 201044_02
hgs
parents:
diff changeset
   622
/** 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   623
body-fld-dsp = "(" string SP body-fld-param ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   624
8b14b30db193 201044_02
hgs
parents:
diff changeset
   625
This method expects iAtomWalker to be positioned just prior to the "(" or "NIL" atom.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   626
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   627
void CImapBodyStructureBuilder::ParseBodyFieldDispL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   628
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   629
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomNil)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   630
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   631
		// there are no params
8b14b30db193 201044_02
hgs
parents:
diff changeset
   632
		return;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   633
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   634
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   635
	iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   636
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   637
	// string
8b14b30db193 201044_02
hgs
parents:
diff changeset
   638
	iBodyStructure->SetExtDispositionName(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   639
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   640
	// body-fld-param
8b14b30db193 201044_02
hgs
parents:
diff changeset
   641
	ParseBodyFieldParamsL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   642
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   643
	iAtomWalker->WalkUpL();	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   644
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   645
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   646
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   647
body-fld-lang = nstring / "(" string *(SP string) ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   648
8b14b30db193 201044_02
hgs
parents:
diff changeset
   649
This method should only be called if body-fld-lang is expected.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   650
The caller should check first, using iAtomWalker->PeekAcross()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   651
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   652
void CImapBodyStructureBuilder::ParseBodyFieldLangL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   653
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   654
	// Consume the bracket
8b14b30db193 201044_02
hgs
parents:
diff changeset
   655
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   656
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   657
	if (iAtomWalker->CurrentMatch(KImapTxtOpenBracket()))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   658
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   659
		// we have many strings
8b14b30db193 201044_02
hgs
parents:
diff changeset
   660
		// "(" string *(SP string) ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   661
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   662
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   663
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   664
		do 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   665
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   666
			iBodyStructure->AppendExtLanguageListL(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   667
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   668
			} while (iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   669
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   670
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   671
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   672
	else 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   673
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   674
		// we have a single nstring - only add it if it is non-empty
8b14b30db193 201044_02
hgs
parents:
diff changeset
   675
		const TDesC8& language = iAtomWalker->CurrentDes(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   676
		if (language.Length() > 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   677
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   678
			iBodyStructure->AppendExtLanguageListL(language);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   679
			}		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   680
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   681
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   682
8b14b30db193 201044_02
hgs
parents:
diff changeset
   683
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   684
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   685
8b14b30db193 201044_02
hgs
parents:
diff changeset
   686
This only appears in
8b14b30db193 201044_02
hgs
parents:
diff changeset
   687
body-type-1part = (body-type-basic / body-type-msg / body-type-text) [SP body-ext-1part]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   688
So, this method treats the body-fld-md5 field as optional
8b14b30db193 201044_02
hgs
parents:
diff changeset
   689
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   690
void CImapBodyStructureBuilder::ParseBodyExt1PartL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   691
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   692
	// Return as soon as a field is not found.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   693
	if (iAtomWalker->WalkAcrossL(EFalse))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   694
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   695
		// body-fld-md5 = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   696
		iBodyStructure->SetExtMD5(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   697
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   698
		// [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   699
		ParseCommonOptionalExtensionsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   700
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   701
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   702
8b14b30db193 201044_02
hgs
parents:
diff changeset
   703
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   704
body-type-mpart = 1*body SP media-subtype [SP body-ext-mpart]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   705
This method deals with media-subtype [SP body-ext-mpart]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   706
8b14b30db193 201044_02
hgs
parents:
diff changeset
   707
body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   708
8b14b30db193 201044_02
hgs
parents:
diff changeset
   709
It expects iAtomWalker to be positioned just prior to media-subtype.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   710
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   711
void CImapBodyStructureBuilder::ParseRemainderMultipartL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   712
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   713
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   714
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   715
	// media-subtype = string
8b14b30db193 201044_02
hgs
parents:
diff changeset
   716
	iBodyStructure->SetSubType(iAtomWalker->CurrentDes(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   717
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   718
	// The remainder of items are optional.  Return as soon as one is not found.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   719
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   720
	// body-fld-param
8b14b30db193 201044_02
hgs
parents:
diff changeset
   721
	if (iAtomWalker->PeekAcross())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   722
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   723
		ParseBodyFieldParamsL(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   724
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   725
		// [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   726
		ParseCommonOptionalExtensionsL();		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   727
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   728
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   729
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   730
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   731
body-ext-1part = body-fld-md5   [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   732
body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]]
8b14b30db193 201044_02
hgs
parents:
diff changeset
   733
Apart from the first parameter, body extensions for 1 and multi part are the same.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   734
So this method parses them in one place.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   735
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   736
void CImapBodyStructureBuilder::ParseCommonOptionalExtensionsL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   737
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   738
	// Return as soon as a field is not found.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   739
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   740
	// body-fld-dsp
8b14b30db193 201044_02
hgs
parents:
diff changeset
   741
	if (iAtomWalker->PeekAcross())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   742
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   743
		ParseBodyFieldDispL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   744
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   745
		// body-fld-lang
8b14b30db193 201044_02
hgs
parents:
diff changeset
   746
		if (iAtomWalker->PeekAcross())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   747
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   748
			ParseBodyFieldLangL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   749
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   750
			// body-fld-loc = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   751
			if (iAtomWalker->WalkAcrossL(EFalse))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   752
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   753
				iBodyStructure->SetExtLocation(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   754
				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   755
				// *(SP body-extension)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   756
				if (iAtomWalker->PeekAcross())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   757
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   758
					ParseBodyExtensionL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   759
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   760
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   761
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   762
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   763
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   764
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   765
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   766
body-extension = nstring / number / "(" body-extension *(SP body-extension) ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   767
RFC3501 says:  "Future expansion. Client implementations
8b14b30db193 201044_02
hgs
parents:
diff changeset
   768
				MUST accept body-extension fields. Server
8b14b30db193 201044_02
hgs
parents:
diff changeset
   769
				implementations MUST NOT generate
8b14b30db193 201044_02
hgs
parents:
diff changeset
   770
				body-extension fields except as defined by
8b14b30db193 201044_02
hgs
parents:
diff changeset
   771
				future standard or standards-track
8b14b30db193 201044_02
hgs
parents:
diff changeset
   772
				revisions of this specification.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   773
As body-extension is always at the end of a (sub)bodystructure, it is safe to ignore.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   774
This method provides a placeholder for extracting any body-extension data that we might 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   775
be interested in, in the future.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   776
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   777
void CImapBodyStructureBuilder::ParseBodyExtensionL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   778
	{}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   779
8b14b30db193 201044_02
hgs
parents:
diff changeset
   780
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   781
envelope = "(" env-date SP env-subject SP env-from SP env-sender SP env-reply-to SP env-to SP env-cc SP env-bcc SP env-in-reply-to SP env-message-id ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   782
8b14b30db193 201044_02
hgs
parents:
diff changeset
   783
This method expects iAtomWalker to be positioned at the opening bracket.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   784
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   785
void CImapBodyStructureBuilder::ParseEnvelopeL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   786
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   787
	// Always expect an open bracket here, so allow atom walker to leave if there is one
8b14b30db193 201044_02
hgs
parents:
diff changeset
   788
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   789
	iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   790
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   791
	CImapEnvelope& envelope = iBodyStructure->GetRfc822EnvelopeStructureL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   792
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   793
	// env-date = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   794
	envelope.SetEnvDate(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   795
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   796
	// env-subject = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   797
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   798
	envelope.SetEnvSubject(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   799
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   800
	// This single address structure will be *copied* into various envelope address arrays
8b14b30db193 201044_02
hgs
parents:
diff changeset
   801
	CImapEnvelope::TAddress address; // this will copied into many en
8b14b30db193 201044_02
hgs
parents:
diff changeset
   802
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   803
	// env-from = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   804
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   805
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   806
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   807
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   808
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   809
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   810
			envelope.AppendEnvFromL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   811
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   812
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   813
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   814
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   815
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   816
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   817
	// env-sender = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   818
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   819
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   820
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   821
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   822
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   823
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   824
			envelope.AppendEnvSenderL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   825
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   826
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   827
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   828
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   829
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   830
	// env-reply-to = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   831
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   832
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   833
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   834
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   835
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   836
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   837
			envelope.AppendEnvReplyToL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   838
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   839
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   840
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   841
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   842
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   843
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   844
	// env-to = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   845
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   846
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   847
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   848
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   849
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   850
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   851
			envelope.AppendEnvToL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   852
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   853
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   854
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   855
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   856
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   857
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   858
	// env-cc = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   859
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   860
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   861
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   862
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   863
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   864
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   865
			envelope.AppendEnvCcL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   866
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   867
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   868
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   869
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   870
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   871
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   872
	// env-bcc = "(" 1*address ")" / nil
8b14b30db193 201044_02
hgs
parents:
diff changeset
   873
	if (iAtomWalker->WalkAcrossToNilOrOpenL() == CImapAtomWalker::EAtomOpen)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   874
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   875
		iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   876
		do
8b14b30db193 201044_02
hgs
parents:
diff changeset
   877
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   878
			ParseAddressL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   879
			envelope.AppendEnvBccL(address);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   880
			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   881
			} while(iAtomWalker->WalkAcrossL(EFalse));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   882
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   883
		iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   884
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   885
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   886
	// env-in-reply-to = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   887
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   888
	envelope.SetEnvInReplyTo(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   889
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   890
	// env-message-id = nstring	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   891
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   892
	envelope.SetEnvMessageId(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   893
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   894
	iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   895
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   896
8b14b30db193 201044_02
hgs
parents:
diff changeset
   897
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   898
address = "(" addr-name SP addr-adl SP addr-mailbox SP addr-host ")"
8b14b30db193 201044_02
hgs
parents:
diff changeset
   899
8b14b30db193 201044_02
hgs
parents:
diff changeset
   900
This method expects iAtomWalker to be positioned at the opening bracket.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   901
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   902
void CImapBodyStructureBuilder::ParseAddressL(CImapEnvelope::TAddress& aAddress)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   903
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   904
	// Always expect an open bracket here, so allow atom walker to leave if there is one
8b14b30db193 201044_02
hgs
parents:
diff changeset
   905
	iAtomWalker->WalkDownL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   906
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   907
	// addr-name = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   908
	aAddress.SetName(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   909
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   910
	// addr-adl = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   911
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   912
	aAddress.SetAdl(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   913
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   914
	// addr-mailbox = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   915
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   916
	aAddress.SetMailbox(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   917
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   918
	// addr-host = nstring
8b14b30db193 201044_02
hgs
parents:
diff changeset
   919
	iAtomWalker->WalkAcrossL(ETrue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   920
	aAddress.SetHost(iAtomWalker->CurrentDes(ETrue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   921
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   922
	iAtomWalker->WalkUpL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   923
	}