textrendering/texthandling/ttext/T_CONVS1.CPP
changeset 0 1fb32624e06b
child 16 748ec5531811
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/ttext/T_CONVS1.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* 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 <txtglobl.h>
+#include <txtfmlyr.h>
+#include <s32mem.h>
+#include <s32file.h>
+#include <e32test.h>
+#include <flddef.h>
+#include <fldbltin.h>
+
+const TInt KTestCleanupStack=0x20;
+
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+LOCAL_D RTest test(_L("T_CONVS1 - GlobalText Persistence"));
+
+LOCAL_D	TPtrC bigBuf(_L("This is a very big buffer indeed, containing text and special characters,\
+ big enough to fill a segment of an editable text component that employs segmented storage"));
+
+////////////////////////////////////////////////////////////////////////////////////////////
+class TTestFieldFactory : public MTextFieldFactory
+	{
+public:
+	// from MTextFieldFactory
+	virtual CTextField* NewFieldL(TUid aFieldType); 
+	// Creates a field of the type specified
+	// Returns NULL if it does not recognise/support the field type
+	};
+
+CTextField* TTestFieldFactory::NewFieldL(TUid aFieldType)
+// Creates a field (in aHeader) of the type specified in aHeader
+// 
+	{
+	CTextField* field=NULL;
+	if (aFieldType==KDateTimeFieldUid)
+		field = (CTextField*)new(ELeave) CDateTimeField();
+	return field;
+	}
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+_LIT(KOutputFile, "c:\\etext\\t_convs1.tst");
+template <class T>
+void testStoreRestoreL(T& aCopy,const T& aOriginal)
+// Test document persistance.
+//
+    {
+	// set up the store
+	RFs	theFs;
+	theFs.Connect();
+	//
+	theFs.Delete(KOutputFile);
+	theFs.MkDirAll(KOutputFile);
+	CFileStore* theStore=CDirectFileStore::CreateL(theFs,KOutputFile,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();
+    }
+
+LOCAL_C TInt IsEqual(const CPlainText* aCopy,const CPlainText* aOriginal)
+//
+// Tests for equality of plain text components.
+// Takes account of multiple segments of a segmented text component.
+//
+	{
+	TInt lengthOfOriginal=aOriginal->DocumentLength();
+	TInt lengthOfCopy=aCopy->DocumentLength();
+	test(lengthOfOriginal==lengthOfCopy);
+//
+	TPtrC copy,orig;
+//
+	TInt lengthRead=0;
+	while(lengthRead<=lengthOfOriginal)
+		{
+		copy.Set((aCopy->Read(lengthRead)));
+		orig.Set((aOriginal->Read(lengthRead)));
+		for (TInt offset=0; offset<orig.Length(); offset++)
+			test(copy[offset]==orig[offset]);
+		lengthRead+=orig.Length();
+		}
+	test(lengthRead==lengthOfOriginal+1);
+	test.Next(_L("Restored plain text component matches original"));
+	TInt copyFieldCount=aCopy->FieldCount();
+	TInt origFieldCount=aOriginal->FieldCount();
+	test(copyFieldCount==origFieldCount);
+	return 1;
+	}
+
+
+LOCAL_C TInt DocsEqual(const CGlobalText* aCopy,const CGlobalText* aOrig)
+//
+//
+//
+	{
+	test(IsEqual(aCopy,aOrig));
+	return 1;
+	}
+
+
+void GenerateGlobalTextL()
+//
+// Create a global text documnet.
+//
+	{
+//	Set up the character format layer.
+	CCharFormatLayer* cl1=CCharFormatLayer::NewL();
+	TCharFormat charFormat;	TCharFormatMask charMask;
+	charMask.ClearAll();
+	charFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);	charMask.SetAttrib(EAttFontStrokeWeight);
+	charFormat.iFontSpec.iFontStyle.SetPosture(EPostureItalic);	charMask.SetAttrib(EAttFontPosture);
+	charFormat.iFontPresentation.iUnderline=EUnderlineOn;	charMask.SetAttrib(EAttFontUnderline);
+	cl1->SetL(charFormat,charMask);
+	charMask.ClearAll();
+//	Set up the paragraph format layer.
+	CParaFormatLayer* l1=CParaFormatLayer::NewL();
+	CParaFormat* paraFormat=CParaFormat::NewL();	TParaFormatMask paraMask;
+	paraMask.ClearAll();
+	TTabStop tab1,tab2;
+	tab1.iTwipsPosition=5000;	tab2.iTwipsPosition=5001;
+	tab1.iType=TTabStop::ERightTab;	tab2.iType=TTabStop::ECenteredTab;
+	paraFormat->StoreTabL(tab1);
+	paraFormat->StoreTabL(tab2);
+	paraMask.SetAttrib(EAttTabStop);
+	paraFormat->iLeftMarginInTwips=666; paraMask.SetAttrib(EAttLeftMargin);
+	l1->SetL(paraFormat,paraMask);
+	paraMask.ClearAll();
+//	Now create the global text component.
+	CGlobalText* globalDoc=CGlobalText::NewL(l1,cl1,CEditableText::ESegmentedStorage);
+	globalDoc->InsertL(0,bigBuf);
+//	Now create the global text that will be the restored one.
+	CCharFormatLayer* cr1=CCharFormatLayer::NewL();
+	TCharFormat ff;TCharFormatMask mm;cr1->SetL(ff,mm);
+	CParaFormatLayer* r1=CParaFormatLayer::NewL();
+	TParaFormatMask nn; r1->SetL((CParaFormat*)NULL,nn);
+	CGlobalText* restoredDoc=CGlobalText::NewL(r1,cr1,CEditableText::ESegmentedStorage);
+//	Store a text field in the global text.
+	TTestFieldFactory factory;
+	globalDoc->SetFieldFactory(&factory);
+	restoredDoc->SetFieldFactory(&factory);
+	CTextField* field=NULL;
+	TRAPD(ret,
+	field=factory.NewFieldL(KDateTimeFieldUid));
+ 	test(ret==KErrNone);
+	TRAP(ret,
+	globalDoc->InsertFieldL(0,field,KDateTimeFieldUid));
+	test(ret==KErrNone);
+//	And do the streaming/restore.
+	test.Start(_L("Storing global text with field record"));
+	test.Next(_L("Restoring global text"));
+	testStoreRestoreL(*restoredDoc,*globalDoc);
+	test(DocsEqual(restoredDoc,globalDoc));
+	test.End();
+//	Now clean up.
+	TInt restoredCharChain=cr1->ChainCount();
+	TInt restoredParaChain=r1->ChainCount();
+	CCharFormatLayer* chCurrent=cr1;
+	CCharFormatLayer* chNext=(CCharFormatLayer*)cr1->SenseBase();
+	delete chCurrent;
+	for (TInt loop=0;loop<restoredCharChain-1;loop++)	
+		{
+		chCurrent=chNext;
+		chNext=(CCharFormatLayer*)chCurrent->SenseBase();
+		delete chCurrent;
+		}
+	CParaFormatLayer* paCurrent=r1;
+	CParaFormatLayer* paNext=(CParaFormatLayer*)r1->SenseBase();
+	delete paCurrent ;
+	for (TInt ploop=0;ploop<restoredParaChain-1;ploop++)	
+		{
+		paCurrent=paNext;
+		paNext=(CParaFormatLayer*)paCurrent->SenseBase();
+		delete paCurrent;
+		}
+	delete l1;
+	delete cl1;
+	delete paraFormat;
+	delete restoredDoc;
+	delete globalDoc;
+	}
+
+
+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.
+//
+    {
+	setupCleanup();
+	test.Title();
+	__UHEAP_MARK;
+
+	test.Start(_L("Generate global text"));
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-ETEXT-LEGACY-T_CONVS1-0001 "));
+	TRAPD(r,GenerateGlobalTextL());
+	test(r==KErrNone);
+	
+	__UHEAP_MARKEND;
+	
+	::DeleteDataFile(KOutputFile);	//deletion of data files must be before call to End() - DEF047652
+	test.End();
+	test.Close();
+	delete TheTrapCleanup;
+
+	
+
+	return 0;
+    }
+