email/imap4mtm/imapsession/test/src/ctestimapatombuilder.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/test/src/ctestimapatombuilder.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,207 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "ctestimapatombuilder.h"
+
+#include <utf.h>
+
+#include "cimapatom.h"
+#include "cimapatomparser.h"
+#include "cimapatomwalker.h"
+#include "cimaplogger.h"
+
+CTestImapAtomBuilder::CTestImapAtomBuilder()
+	: iAtomParser(NULL)
+	{}
+
+CTestImapAtomBuilder::~CTestImapAtomBuilder()
+	{
+	delete iAtomParser;
+	}
+
+void CTestImapAtomBuilder::SetupL()
+	{
+	iAtomParser = CImapAtomParser::NewL(EFalse, KDefaultLog);
+	}
+	
+void CTestImapAtomBuilder::TearDownL()
+	{
+	delete iAtomParser;
+	iAtomParser = NULL;
+	}
+
+// Tests
+void CTestImapAtomBuilder::TestAtomParserL()
+	{
+	INFO_PRINTF1(_L("TestL"));
+	
+	_LIT8(KLine, "sugar (one (two \"33 () three\" )) apple wibble");
+	TPtrC8 ptrLine = KLine();
+	TBool wantMore = iAtomParser->ProcessLineL(ptrLine);
+	
+	ASSERT_FALSE(wantMore);
+	
+	CImapAtom* root = iAtomParser->RootAtom();
+	RPointerArray<CImapAtom> stack;
+	stack.AppendL(root);
+	
+	CImapAtom* current = root;
+	
+	while(current!=NULL)
+		{
+		TPtrC8 ptrAtom = current->Atom(EFalse);
+		TInt topOfStack = stack.Count() - 1;
+				
+		// Log the data (SendDataReq is non-leaving, so avoid leaving.  Hence no cleanup stack)
+		HBufC16* unicodeAtom = NULL;
+		TRAPD(err,
+			unicodeAtom = CnvUtfConverter::ConvertToUnicodeFromUtf8L(ptrAtom);
+		);
+		
+		if (err == KErrNone)
+			{
+			INFO_PRINTF3(_L("%d [%S]"), topOfStack, unicodeAtom);
+			}
+			
+		delete unicodeAtom;	
+		unicodeAtom=NULL;
+		
+		// Try going down
+		CImapAtom* candidateAtom = current->Child();
+		if (candidateAtom != NULL)
+			{
+			stack.AppendL(candidateAtom);
+			++topOfStack;
+			}
+		// Try going along
+		else
+			{
+			candidateAtom = current->Next();
+			// Try going back-up-and-along
+			while (candidateAtom == NULL && topOfStack > 0)
+				{
+				stack.Remove(topOfStack);
+				--topOfStack;
+				candidateAtom = stack[topOfStack];
+				candidateAtom = candidateAtom->Next();
+				}
+			
+			stack[topOfStack] = candidateAtom;
+			}
+			
+		// Could use a table (or at least tables - need repeats) to parse different BODYSTRUCTURE's !!!
+		current = candidateAtom;
+	}
+		
+	stack.Reset();
+	
+	INFO_PRINTF1(_L("Complete"));
+	}
+	
+void CTestImapAtomBuilder::TestWalkerL()
+	{
+	INFO_PRINTF1(_L("TestWalkerL"));
+	
+//	_LIT8(KLine, "spandex (one (two \"33 () three\" )) arse wibble (apple ((pear) banana) cherry) dog");
+//	TPtrC8 ptrLine = KLine();
+//	TBool wantMore = iAtomParser->ProcessLineL(ptrLine);
+//	ASSERT_FALSE(wantMore);
+
+	_LIT8(KLine1, "(TEXT PLAIN (name1 value1 name2 value2) ID {25}");
+	_LIT8(KLit2, "first line\r\nsecond line\r\n");
+//	_LIT8(KLine3, "encoding size lines");
+//	_LIT8(KLine3, "encoding size \"missing quote"); // and missing end bracket!
+	_LIT8(KLine3, "encoding size lines) Stuff at the end that we're not interested in");
+//	_LIT8(KLine3, "encoding size lines)");
+	
+	TBool wantMore = iAtomParser->ProcessLineL(KLine1);
+	ASSERT_TRUE(wantMore);
+	iAtomParser->ProcessLiteralBlockL(KLit2);
+	wantMore = iAtomParser->ProcessLineL(KLine3);
+	ASSERT_FALSE(wantMore);
+	
+	DumpAtomTreeL(iAtomParser->RootAtom());
+
+	TPtrC8 unparsed = iAtomParser->UnparsedData();
+	TInt len = unparsed.Length();
+	}
+
+void CTestImapAtomBuilder::DumpAtomTreeL(CImapAtom* aRoot)
+	{
+	CImapAtomWalker* atomWalker = CImapAtomWalker::NewL(KDefaultLog);
+	CleanupStack::PushL(atomWalker);
+	atomWalker->SetRootL(aRoot);
+		
+	TBool bFound = ETrue;
+		
+	while(bFound)
+		{
+		TPtrC8 ptrAtom = atomWalker->CurrentDes(EFalse);
+						
+		// Log the data (SendDataReq is non-leaving, so avoid leaving.  Hence no cleanup stack)
+		HBufC16* unicodeAtom = NULL;
+		TRAPD(err,
+			unicodeAtom = CnvUtfConverter::ConvertToUnicodeFromUtf8L(ptrAtom);
+		);
+		
+		if (err == KErrNone)
+			{
+			INFO_PRINTF3(_L("%d [%S]"), atomWalker->StackCount(), unicodeAtom);
+			}
+			
+		delete unicodeAtom;	
+		unicodeAtom=NULL;
+		
+		// Try going down
+		if (atomWalker->PeekDown() == NULL)
+			{
+			// Try going across
+			if (atomWalker->WalkAcrossL(EFalse) == NULL)
+				{
+				// Might not find something on the way up
+				bFound = EFalse;
+				
+				// Try going up
+				while (atomWalker->StackCount() > 1)
+					{
+					atomWalker->WalkUpL();
+					CImapAtom* upAtom = atomWalker->Current();
+					
+					if (upAtom && atomWalker->WalkAcrossL(EFalse) != NULL)
+						{
+						// found something!
+						bFound = ETrue;
+						break;
+						}
+					}
+				}
+			}
+		else
+			{
+			atomWalker->WalkDownL();
+			}
+		}
+		
+	CleanupStack::PopAndDestroy(atomWalker);
+	
+	INFO_PRINTF1(_L("Complete"));
+	}
+CTestSuite* CTestImapAtomBuilder::CreateSuiteL(const TDesC& aName)
+// static
+	{
+	SUB_SUITE;
+	ADD_TEST_STEP(TestWalkerL);
+	END_SUITE;
+	}