textrendering/texthandling/tfields/T_STREAM.CPP
changeset 0 1fb32624e06b
child 16 748ec5531811
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/tfields/T_STREAM.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,607 @@
+/*
+* Copyright (c) 1997-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 <e32test.h>
+//#include /**/ <s32mem.h>
+#include <s32file.h>
+#include <flddef.h>
+#include <fldbase.h>
+#include <fldset.h>
+#include "TESTFAC.H"
+
+const TInt KTestCleanupStack=0x20;
+
+LOCAL_D RTest test(_L("T_STREAM - Fields Persistence"));
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+LOCAL_D CTextFieldSet* TheFieldSetOriginal;
+LOCAL_D CTextFieldSet* TheFieldSetCopy;
+LOCAL_D TTestFieldFactory* TheFactory;
+
+_LIT(KTFieldOutputFile, "c:\\etext\\tfield.tst");
+// Test Picture persistance.
+LOCAL_C void testStoreRestore(CTextFieldSet* aCopy,const CTextFieldSet* aOriginal)
+    {
+	// set up the store
+	RFs	theFs;
+	theFs.Connect();
+	theFs.Delete(KTFieldOutputFile);
+	theFs.MkDirAll(KTFieldOutputFile);
+	CFileStore* theStore=CDirectFileStore::CreateL(theFs, KTFieldOutputFile, EFileRead | EFileWrite);
+	CleanupStack::PushL(theStore);
+	theStore->SetTypeL(KDirectFileStoreLayoutUid);
+	//
+	// store the original
+	TStreamId id(0);
+	TRAPD(ret,id=aOriginal->StoreL(*theStore));
+		test(ret==KErrNone);
+	//
+	// restore into the copy
+	TRAP(ret,aCopy->RestoreL(*theStore,id));
+		test(ret==KErrNone);
+	//
+	// tidy up
+	CleanupStack::PopAndDestroy();  // theStore
+	theFs.Close();
+    }
+
+
+
+template <class T>
+void testCopyPaste(T* aCopy, T* aOriginal,TInt aCopyPos,TInt aLen,TInt aPastePos,TInt aPasteLen=-1)
+// Copy part of anOriginal to aCopy using memory-based streams.
+//
+	{
+	// set up the store
+	RFs	theFs;
+	theFs.Connect();
+	CFileStore* theStore=CDirectFileStore::ReplaceL(theFs,KTFieldOutputFile,EFileRead|EFileWrite);
+	CleanupStack::PushL(theStore);
+	theStore->SetTypeL(KDirectFileStoreLayoutUid);
+	//
+	// Copy anOriginal out to the buffer
+	TStreamId id(0);
+	TRAPD(ret,id=aOriginal->CopyToStoreL(*theStore,aCopyPos,aLen));
+		test(ret==KErrNone);
+	//
+	// paste into the copy
+	TRAP(ret,aCopy->PasteFromStoreL(*theStore,id,aPastePos,aPasteLen));
+		test(ret==KErrNone);
+	//
+	// tidy up
+	CleanupStack::PopAndDestroy();  // theStore
+	theFs.Close();
+
+	}
+
+
+LOCAL_C TBool IsEqual(const CTextFieldSet* aCopy,const CTextFieldSet* anOriginal)
+//
+// Returns true if aCopy contents matches anOriginal contents.
+//
+	{
+	// test the num chars and num fields
+	TInt charCount = anOriginal->CharCount();
+	TInt fieldCount = anOriginal->FieldCount();
+	test(charCount==aCopy->CharCount());
+	test(fieldCount==aCopy->FieldCount());
+
+	// test each entry in the array
+	for (TInt pos=0 ; pos<charCount ;)
+		{
+		TFindFieldInfo infoOrig,infoCopy;
+		anOriginal->FindFields(infoOrig,pos,charCount-pos);
+		aCopy->FindFields(infoCopy,pos,charCount-pos);
+		test(infoOrig==infoCopy);
+		pos += infoOrig.iFirstFieldPos+infoOrig.iFirstFieldLen;
+		if (infoOrig.iFieldCountInRange==0)
+			break;
+		}
+
+	return ETrue;
+	}
+
+
+LOCAL_C TBool UpdateField(TInt aPos,CTextFieldSet* aSet)
+	{
+	// find out which field aPos is in
+	TFindFieldInfo info;
+	TBool ret;
+	ret=aSet->FindFields(info,aPos);
+		test(ret);
+	// get the new value
+	HBufC* buf = HBufC::NewL(5); 
+	CleanupStack::PushL(buf);
+ 	TInt err=aSet->NewFieldValueL(buf,aPos); 
+		test(err==KErrNone);
+	// Notify FieldSet of update
+	aSet->NotifyFieldUpdate(aPos,buf->Length());
+	// tidy up
+	CleanupStack::PopAndDestroy();
+	return ret;
+	}
+
+
+LOCAL_C void test2()
+// Streams an empty field set
+//
+	{
+	test.Next(_L("- streaming of a default FieldSet (no fields)"));
+	testStoreRestore(TheFieldSetCopy,TheFieldSetOriginal);
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test3()
+// Streams a field set containing 100 chars & 1 field
+//
+	{
+	test.Next(_L("- streaming with a field"));
+
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	ret=UpdateField(10,TheFieldSetOriginal);
+		test(ret);
+
+	// test streaming
+	testStoreRestore(TheFieldSetCopy,TheFieldSetOriginal);
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test4()
+// Streams a field set into a non-empty target
+//
+	{
+	test.Next(_L("- streaming into a non-empty target"));
+
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	ret=UpdateField(10,TheFieldSetOriginal);
+		test(ret);
+
+	// insert a block of text into the copy
+	TheFieldSetCopy->NotifyInsertion(0,40); // pos=0, len=40
+	// insert two fields into the copy
+	CTextField* field2 = TheFieldSetCopy->NewFieldL(KDummyFieldUid);
+	CTextField* field3 = TheFieldSetCopy->NewFieldL(KDummyFieldUid);
+	ret=TheFieldSetCopy->InsertFieldL(20,field2,KDummyFieldUid); 
+		test(ret==KErrNone);
+	ret=TheFieldSetCopy->InsertFieldL(30,field3,KDummyFieldUid); 
+		test(ret==KErrNone);
+	ret=UpdateField(20,TheFieldSetCopy);
+		test(ret);
+	ret=UpdateField(33,TheFieldSetCopy);
+		test(ret);
+
+	// test streaming
+	testStoreRestore(TheFieldSetCopy,TheFieldSetOriginal);
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test5()
+// Streams a field set containing an out of date field
+//
+	{
+	test.Next(_L("- streaming an out of date field"));
+
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	ret=UpdateField(10,TheFieldSetOriginal);
+		test(ret);
+	// invalidate the field
+	TheFieldSetOriginal->NotifyInsertion(11,7); // pos=11, len=7
+
+	// test streaming
+	testStoreRestore(TheFieldSetCopy,TheFieldSetOriginal);
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test6()
+// Tests that copy/paste methods exist
+//
+	{
+	test.Next(_L("- testing copy/paste methods with empty array"));
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,0,0,0); // copyPos,Len,PastePos
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test7()
+// Tests copy/paste methods in detail
+//
+	{
+	test.Next(_L("- testing copy/paste methods in detail"));
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	TBool ok=UpdateField(10,TheFieldSetOriginal);
+		test(ok);
+		test(TheFieldSetOriginal->CharCount()==103);
+	// copy out of that into an empty array
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,15,0); // copyPos,Len,PastePos
+	// check that the contents of the array are as expected
+	TFindFieldInfo info;
+	TheFieldSetCopy->FindFields(info,0,15);
+		test(TheFieldSetCopy->CharCount()==15);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==5);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->Reset();
+	// test copying part of a field
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,6,0); // copyPos,Len,PastePos
+	TheFieldSetCopy->FindFields(info,0,6);
+		test(TheFieldSetCopy->CharCount()==6);
+		test(TheFieldSetCopy->FieldCount()==0);
+		test(info.iFieldCountInRange==0);
+	TheFieldSetCopy->Reset();
+	// test copying exactly one field
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,3,0); // copyPos,Len,PastePos
+	TheFieldSetCopy->FindFields(info,0,3);
+		test(TheFieldSetCopy->CharCount()==3);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==0);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->Reset();
+	// test pasting into text in a non-empty array
+	TheFieldSetCopy->NotifyInsertion(0,50); // pos=0, len=50
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,15,10); // copyPos,Len,PastePos
+	TheFieldSetCopy->FindFields(info,0,65);
+		test(TheFieldSetCopy->CharCount()==65);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==15);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->Reset();
+	// test pasting into a field
+	TheFieldSetCopy->NotifyInsertion(0,50); // pos=0, len=50
+	field=TheFieldSetCopy->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	ret=TheFieldSetCopy->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	ok=UpdateField(10,TheFieldSetCopy);
+		test(ok);
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,15,11); // copyPos,Len,PastePos
+	TheFieldSetCopy->FindFields(info,0,68);
+		test(TheFieldSetCopy->CharCount()==68);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==10);
+		test(info.iFirstFieldLen==18);
+	TheFieldSetCopy->Reset();
+	// test pasting at the start & end of a field
+	TheFieldSetCopy->NotifyInsertion(0,10); // pos=0, len=10
+	field=TheFieldSetCopy->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	ret=TheFieldSetCopy->InsertFieldL(5,field,KDummyFieldUid); // pos=5
+		test(ret==KErrNone);
+	ok=UpdateField(5,TheFieldSetCopy);
+		test(ok);
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,3,8); // copyPos,Len,PastePos
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,3,5); // copyPos,Len,PastePos
+	TheFieldSetCopy->FindFields(info,0,19);
+		test(TheFieldSetCopy->CharCount()==19);
+		test(TheFieldSetCopy->FieldCount()==3);
+		test(info.iFieldCountInRange==3);
+		test(info.iFirstFieldPos==5);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->FindFields(info,8,11);
+		test(info.iFieldCountInRange==2);
+		test(info.iFirstFieldPos==8);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->FindFields(info,11,8);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==11);
+		test(info.iFirstFieldLen==3);
+	// tidy up
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test8()
+// Tests paste method with restricted target length
+//
+	{
+	test.Next(_L("- testing paste method with restricted length"));
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert 2 fields into the original
+	// 1...
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	TBool ok=UpdateField(10,TheFieldSetOriginal);
+		test(ok);
+	// 2..
+	field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	ret=TheFieldSetOriginal->InsertFieldL(20,field,KDummyFieldUid); // pos=20
+		test(ret==KErrNone);
+	ok=UpdateField(20,TheFieldSetOriginal);
+		test(ok);
+	// paste part of original into copy with length greater than required
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,5,0,7); // copyPos,Len,PastePos,PasteLen
+	TFindFieldInfo info;
+	TheFieldSetCopy->FindFields(info,0,5);
+		test(TheFieldSetCopy->CharCount()==5);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==0);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->Reset();
+	// paste part of original into copy with length equal to that required
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,5,0,5); // copyPos,Len,PastePos,PasteLen
+	TheFieldSetCopy->FindFields(info,0,5);
+		test(TheFieldSetCopy->CharCount()==5);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==0);
+		test(info.iFirstFieldLen==3);
+	TheFieldSetCopy->Reset();
+	// paste part of original into copy with length zero
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,10,5,0,0); // copyPos,Len,PastePos,PasteLen
+		test(TheFieldSetCopy->CharCount()==0);
+		test(TheFieldSetCopy->FieldCount()==0);
+	TheFieldSetCopy->Reset();
+	// paste part of original into copy with length st field is chopped
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,10,0,6); // copyPos,Len,PastePos,PasteLen
+	TheFieldSetCopy->FindFields(info,0,6);
+		test(TheFieldSetCopy->CharCount()==6);
+		test(TheFieldSetCopy->FieldCount()==0);
+		test(info.iFieldCountInRange==0);
+	TheFieldSetCopy->Reset();
+	// paste part of original into copy with length st one field is left off, the other pasted in
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,20,0,10); // copyPos,Len,PastePos,PasteLen
+	TheFieldSetCopy->FindFields(info,0,10);
+		test(TheFieldSetCopy->CharCount()==10);
+		test(TheFieldSetCopy->FieldCount()==1);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldPos==5);
+		test(info.iFirstFieldLen==3);
+	// tidy up
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+LOCAL_C void test9()
+// Tests paste into set with no field factory
+// Should convert all pasted fields to text...
+//
+	{
+	test.Next(_L("- testing paste into set with no field factory"));
+	TheFieldSetCopy->SetFieldFactory(NULL);
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDummyFieldUid);
+		test(field!=NULL);
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDummyFieldUid); // pos=10
+		test(ret==KErrNone);
+	TBool ok=UpdateField(10,TheFieldSetOriginal);
+		test(ok);
+	// paste part of original into copy
+	testCopyPaste(TheFieldSetCopy,TheFieldSetOriginal,5,25,0); // copyPos,Len,PastePos
+	TFindFieldInfo info;
+	TheFieldSetCopy->FindFields(info,0,25);
+		test(TheFieldSetCopy->CharCount()==25);
+		test(TheFieldSetCopy->FieldCount()==0);
+	// tidy up
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	TheFieldSetCopy->SetFieldFactory(TheFactory);
+	}
+
+
+LOCAL_C void test10()
+// Streams a field set containing 100 chars & 1 field
+//
+	{
+	test.Next(_L("- streaming CDateTimeField"));
+
+	// insert a block of text into the original
+	TheFieldSetOriginal->NotifyInsertion(0,100); // pos=0, len=100
+	// insert a field into the original
+	CTextField* field=TheFieldSetOriginal->NewFieldL(KDateTimeFieldUid);
+		test(field!=NULL);
+	TBuf<14> buff = _L("%-A%*I%:1%T%+A");
+	((CDateTimeField*)field)->SetFormat(buff); // 01:53pm
+	TInt ret=TheFieldSetOriginal->InsertFieldL(10,field,KDateTimeFieldUid); // pos=10
+		test(ret==KErrNone);
+	ret=UpdateField(10,TheFieldSetOriginal);
+		test(ret);
+	// value before
+	HBufC* miniBuf = HBufC::NewL(5); 
+	CleanupStack::PushL(miniBuf);
+	ret=TheFieldSetOriginal->NewFieldValueL(miniBuf,10); // pos=10
+		test(ret==KErrNone);
+	TPtr buf = miniBuf->Des();
+	test.Printf(_L("  Value before streaming: "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	// test streaming
+	testStoreRestore(TheFieldSetCopy,TheFieldSetOriginal);
+	test(IsEqual(TheFieldSetCopy,TheFieldSetOriginal));
+	// value after
+	ret=TheFieldSetCopy->NewFieldValueL(miniBuf,10); // pos=10
+		test(ret==KErrNone);
+	buf = miniBuf->Des();
+	test.Printf(_L("  Value after streaming:  "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	CleanupStack::PopAndDestroy(); // miniBuf
+	TheFieldSetOriginal->Reset();
+	TheFieldSetCopy->Reset();
+	}
+
+
+void TestStreamingL()
+//
+// Test streaming of PrintSetup info.
+// Stream from one copy to another, then compare
+//
+	{
+	// create the PrintSetups
+	test.Start(_L("Streaming CTextFieldSet"));
+
+	// instantiate the factory and FieldSet
+	TheFactory = new(ELeave) TTestFieldFactory();
+	TheFieldSetOriginal = CTextFieldSet::NewL();
+	TheFieldSetOriginal->SetFieldFactory(TheFactory);
+	TheFieldSetCopy = CTextFieldSet::NewL();
+	TheFieldSetCopy->SetFieldFactory(TheFactory);
+
+	// Use "original" with default settings & test stream
+	test2();
+
+	// change data in original and test stream again
+	test3();
+
+	// Stream a field set into a non-empty target
+	test4();
+
+	// Stream a field set containing an out of date field
+	test5();
+
+	// Test that copy/paste methods exist
+	test6();
+
+	// Test copy/paste methods in detail
+	test7();
+
+	// Test paste with limited target area
+	test8();
+
+	// Test paste into set with no field factory
+	test9();
+
+	// Test streaming of built-in types
+	test10();
+
+	// end
+	delete TheFieldSetOriginal;
+	delete TheFieldSetCopy;
+	delete TheFactory;
+	}
+
+
+LOCAL_C void setupCleanup()
+//
+// Initialise the cleanup stack.
+//
+    {
+
+	TheTrapCleanup=CTrapCleanup::New();
+	TRAPD(r,\
+		{\
+		for (TInt i=KTestCleanupStack;i>0;i--)\
+			CleanupStack::PushL((TAny*)1);\
+		test(r==KErrNone);\
+		CleanupStack::Pop(KTestCleanupStack);\
+		});
+	}
+
+
+LOCAL_C void DeleteDataFile(const TDesC& aFullName)
+	{
+	RFs fsSession;
+	TInt err = fsSession.Connect();
+	if(err == KErrNone)
+		{
+		TEntry entry;
+		if(fsSession.Entry(aFullName, entry) == KErrNone)
+			{
+			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
+			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
+			if(err != KErrNone) 
+				{
+				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
+				}
+			err = fsSession.Delete(aFullName);
+			if(err != KErrNone) 
+				{
+				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
+				}
+			}
+		fsSession.Close();
+		}
+	else
+		{
+		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
+		}
+	}
+
+GLDEF_C TInt E32Main()
+//
+// Test streaming conversions.
+//
+    {
+	test.Title();
+
+	__UHEAP_MARK;
+	setupCleanup();
+
+	TRAPD(r,TestStreamingL());
+	test(r==KErrNone);
+
+	delete TheTrapCleanup;
+
+	__UHEAP_MARKEND;
+	
+	::DeleteDataFile(KTFieldOutputFile);	//deletion of data files must be before call to End() - DEF047652
+	
+	test.End();
+	test.Close();
+
+	return 0;
+    }
+