sl@0: /*
sl@0: * Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0: * All rights reserved.
sl@0: * This component and the accompanying materials are made available
sl@0: * under the terms of "Eclipse Public License v1.0"
sl@0: * which accompanies this distribution, and is available
sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: *
sl@0: * Initial Contributors:
sl@0: * Nokia Corporation - initial contribution.
sl@0: *
sl@0: * Contributors:
sl@0: *
sl@0: * Description: 
sl@0: *
sl@0: */
sl@0: 
sl@0: 
sl@0: #include <e32std.h>
sl@0: #include <e32base.h>
sl@0: 
sl@0: #include <gdi.h>
sl@0: #include <conpics.h>
sl@0: #include <s32file.h>
sl@0: 
sl@0: #include <txtrich.h>
sl@0: #include <txtfmlyr.h>
sl@0: #include "TXTMRTSR.H"
sl@0: 
sl@0: #include "../incp/T_PMLPAR.H"
sl@0: //#include "../spml/T_PMLPAR.CPP"
sl@0: #include "T_TRAN.h"
sl@0: 
sl@0: LOCAL_D CTestStep *pTestStep = NULL;
sl@0: #define test(cond)											\
sl@0: 	{														\
sl@0: 	TBool __bb = (cond);									\
sl@0: 	pTestStep->TEST(__bb);									\
sl@0: 	if (!__bb)												\
sl@0: 		{													\
sl@0: 		pTestStep->ERR_PRINTF1(_L("ERROR: Test Failed"));	\
sl@0: 		User::Leave(1);										\
sl@0: 		}													\
sl@0: 	}
sl@0: #undef INFO_PRINTF1
sl@0: #undef INFO_PRINTF2
sl@0: // copy from tefexportconst.h
sl@0: #define INFO_PRINTF1(p1)        pTestStep->Logger().LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, (p1))
sl@0: #define INFO_PRINTF2(p1, p2)    pTestStep->Logger().LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo, (p1), (p2))
sl@0: 
sl@0: // included in a namespace, to avoid confliction
sl@0: namespace T_TRAN {
sl@0: /* this fixes a MSVC link warning */
sl@0: #ifdef __VC32__
sl@0: #pragma comment (linker, "/opt:noref") 
sl@0: #endif
sl@0: 
sl@0: #define UNUSED_VAR(a) a = a
sl@0: 
sl@0: const TInt KTestCleanupStack=0x40;
sl@0: 
sl@0: _LIT(KExportFileName1, "c:\\etext\\t_para.txg");
sl@0: _LIT(KExportFileName2, "c:\\etext\\t_para2.txg");
sl@0: 
sl@0: void EnsureFileExists(const TDesC& aName)
sl@0: 	{
sl@0: 	RFs fs;
sl@0: 	fs.Connect();
sl@0: 	fs.MkDirAll(aName);
sl@0: 	RFile file;
sl@0: 	file.Create(fs, aName, EFileRead|EFileWrite);
sl@0: 	file.Close();
sl@0: 	fs.Close();
sl@0: 	}
sl@0: 
sl@0: class CContainer : public CBase, public MRichTextStoreResolver
sl@0: 	{
sl@0: public:
sl@0: 	static CContainer* NewL(TFileName aFileName);
sl@0: 	~CContainer();
sl@0: 	//
sl@0: 	// Mixin
sl@0: 	//
sl@0: 	virtual const CStreamStore& StreamStoreL(TInt aPos)const;
sl@0: 	// Methods
sl@0: 	TStreamId StoreL(CStreamStore& aStore)const;
sl@0: 	void RestoreL(const CStreamStore& aStore,TStreamId aId,MPictureFactory* aFctry);
sl@0: protected:
sl@0: 	CContainer();
sl@0: 	void ConstructL(TFileName aFileName);
sl@0: public:
sl@0: 	CRichText* iText;
sl@0: 	const CParaFormatLayer* iGlobalParaFormatLayer;
sl@0: 	const CCharFormatLayer* iGlobalCharFormatLayer;
sl@0: 	};
sl@0: 
sl@0: LOCAL_D CTrapCleanup* TheTrapCleanup;
sl@0: LOCAL_D RFs TheFs;  // the file server
sl@0: LOCAL_D RFile TheFile;  // the data file
sl@0: LOCAL_D CParser* TheParser;
sl@0: LOCAL_D CContainer* TheContainer;
sl@0: LOCAL_D CStreamStore* TheDeferredPictureStore;
sl@0: 
sl@0: CContainer* CContainer::NewL(TFileName aFileName)
sl@0: // Create new container & set its components.
sl@0: //
sl@0: 	{
sl@0: 	CContainer* self=new(ELeave) CContainer;
sl@0: 	CleanupStack::PushL(self);
sl@0: 	self->ConstructL(aFileName);
sl@0: 	CleanupStack::Pop();
sl@0: 	return self;
sl@0: 	}
sl@0: 
sl@0: 
sl@0: CContainer::CContainer()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: 
sl@0: void CContainer::ConstructL(TFileName aFileName)
sl@0: 	{
sl@0: 	TheParser=CParser::NewL();
sl@0: 	CleanupStack::PushL(TheParser);
sl@0: 	iText=TheParser->ParseL(aFileName);
sl@0: 	CleanupStack::PopAndDestroy();
sl@0: 	iGlobalParaFormatLayer=iText->GlobalParaFormatLayer();
sl@0: 	iGlobalCharFormatLayer=iText->GlobalCharFormatLayer();
sl@0: 	}
sl@0: 
sl@0: 
sl@0: CContainer::~CContainer()
sl@0: 	{
sl@0: 	delete iText;
sl@0: 	delete (CParaFormatLayer*)iGlobalParaFormatLayer;
sl@0: 	delete (CCharFormatLayer*)iGlobalCharFormatLayer;
sl@0: 	}
sl@0: 
sl@0: 
sl@0: const CStreamStore& CContainer::StreamStoreL(TInt /*aPos*/)const
sl@0: // Return the deferred picture store.
sl@0: // In this instance, the deferred picture store does not vary with document position.
sl@0: //
sl@0: 	{return *TheDeferredPictureStore;}
sl@0: 
sl@0: 
sl@0: TStreamId CContainer::StoreL(CStreamStore& aStore)const
sl@0: // Store this component
sl@0: //
sl@0: 	{
sl@0: 	CStoreMap* map=CStoreMap::NewLC(aStore);
sl@0: 	iText->StoreComponentsL(aStore,*map);
sl@0: 	//
sl@0: 	RStoreWriteStream stream(*map);
sl@0: 	TStreamId id=stream.CreateLC(aStore);
sl@0: 	iGlobalParaFormatLayer->ExternalizeL(stream);
sl@0: 	iGlobalCharFormatLayer->ExternalizeL(stream);
sl@0: 	stream<< *iText;
sl@0: 	stream.CommitL();
sl@0: 	//
sl@0: 	map->Reset();
sl@0: 	CleanupStack::PopAndDestroy(2);
sl@0: 	return id;
sl@0: 	}
sl@0: 
sl@0: 
sl@0: void CContainer::RestoreL(const CStreamStore& aStore,TStreamId aId,MPictureFactory* aFactory)
sl@0: // Restore this component
sl@0: //
sl@0: 	{
sl@0: 	RStoreReadStream stream;
sl@0: 	stream.OpenLC(aStore,aId);
sl@0: 	iGlobalParaFormatLayer=CParaFormatLayer::NewL(stream);
sl@0: 	iGlobalCharFormatLayer=CCharFormatLayer::NewL(stream);
sl@0: 	iText=CRichText::NewL(iGlobalParaFormatLayer,iGlobalCharFormatLayer);
sl@0: 	iText->SetPictureFactory(aFactory,this);
sl@0: 	stream>> *iText;
sl@0: 	//
sl@0: 	CleanupStack::PopAndDestroy();
sl@0: 	//
sl@0: 	iText->RestoreComponentsL(aStore);
sl@0: 	}
sl@0: 
sl@0: 
sl@0: /*LOCAL_C void testPictureRestorer(TBool aDeferPictureLoad=ETrue)
sl@0: // Test Picture persistance.
sl@0: //
sl@0:     {
sl@0: 	//
sl@0: 	TheFs.Connect();
sl@0: 	//
sl@0: 	TheStore=CDirectFileStore::ReplaceL(TheFs,_L("c:\\etext\\t_word.doc"),EFileRead|EFileWrite);
sl@0: 	TheDeferredPictureStore=TheStore;
sl@0: 	CleanupStack::PushL(TheStore);
sl@0: 	TheStore->SetTypeL(KDirectFileStoreLayout);
sl@0: 	//
sl@0: 	// Create concrete picture factory.
sl@0: 	MDemPictureFactory* factory=new(ELeave) MDemPictureFactory;
sl@0: 
sl@0: 	TheContainer->iText->Reset();
sl@0: 	TheContainer->iText->InsertL(0,_L("Hello Duncan how"));
sl@0: 
sl@0: 	TheContainer->iText->SetPictureFactory(factory,TheContainer);
sl@0: 	// Create some pictures.
sl@0: 	CXzePicture* pic1=CXzePicture::NewL('x');
sl@0: 		CleanupStack::PushL(pic1);
sl@0: 	CXzePicture* pic2=CXzePicture::NewL('z');
sl@0: 		CleanupStack::PushL(pic2);
sl@0: 	CXzePicture* pic3=CXzePicture::NewL('e');
sl@0: 		CleanupStack::PushL(pic3);
sl@0: 	//
sl@0: 	// Create the picture headers
sl@0: 	TPictureHeader hdr1;
sl@0: 	TPictureHeader hdr2;
sl@0: 	TPictureHeader hdr3;
sl@0: 	//
sl@0: 	TSize size;
sl@0: 	pic1->GetSizeInTwips(size);
sl@0: 	hdr1.iPictureType=KUidXzePictureType;
sl@0: 	hdr1.iPicture=pic1;
sl@0: 	hdr2.iPictureType=KUidXzePictureType;
sl@0: 	hdr2.iPicture=pic2;
sl@0: 	hdr3.iPictureType=KUidXzePictureType;
sl@0: 	hdr3.iPicture=pic3;
sl@0: 	//
sl@0: 	// Insert the pictures into the rich text
sl@0: 	TBool hasMarkupData=TheContainer->iText->HasMarkupData();
sl@0: 	test(!hasMarkupData);
sl@0: 	TheContainer->iText->CancelInsertCharFormat();
sl@0: 	TheContainer->iText->InsertL(0,hdr1);
sl@0: 	TheContainer->iText->InsertL(5,hdr2);
sl@0: 	TheContainer->iText->InsertL(7,hdr3);
sl@0: 	TheContainer->iText->InsertL(0,CEditableText::EParagraphDelimiter);
sl@0: 	TheContainer->iText->CancelInsertCharFormat();
sl@0: 	TheContainer->iText->InsertL(2,CEditableText::EParagraphDelimiter);
sl@0: 	CleanupStack::Pop(3);
sl@0: 	hasMarkupData=TheContainer->iText->HasMarkupData();
sl@0: 	test(hasMarkupData);
sl@0: 	//
sl@0: 	// High level Store context
sl@0: 	TStreamId id=TheContainer->StoreL(*TheStore);
sl@0: //
sl@0: 	delete TheContainer->iText;
sl@0: 	delete (CParaFormatLayer*)TheContainer->iGlobalParaFormatLayer;
sl@0: 	delete (CCharFormatLayer*)TheContainer->iGlobalCharFormatLayer;
sl@0: //
sl@0: //
sl@0: //	Now restore the container with rich text
sl@0: 	TheContainer->RestoreL(*TheStore,id,factory);
sl@0: 	if (!aDeferPictureLoad)
sl@0: 		TheContainer->iText->LoadAllPicturesNowL();
sl@0: 	//
sl@0: 	hasMarkupData=TheContainer->iText->HasMarkupData();
sl@0: 	test(hasMarkupData);
sl@0: 	test(TheContainer->iText->ParagraphCount()==3);
sl@0: 	test(TheContainer->iText->DocumentLength()==21);
sl@0: 	TPtrC view;
sl@0: 	TCharFormat format;
sl@0: 	CPicture* picture;
sl@0: 	//
sl@0: 	// TEST THE PICTURE HEADERS, DEPENDING ON WHETHER DEFERRED LOADING IS SET OR NOT
sl@0: 	TPictureHeader hdrA=TheContainer->iText->PictureHeader(1);
sl@0: 	test(hdrA.iPictureType==KUidXzePictureType);
sl@0: 	if (aDeferPictureLoad)
sl@0: 		{
sl@0: 		test(hdrA.iPicture.IsId());
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		test(hdrA.iPicture!=NULL);
sl@0: 		test(hdrA.iPicture.IsPtr());
sl@0: 		test(((CXzePicture*)hdrA.iPicture.AsPtr())->iLabel=='x');
sl@0: 		}
sl@0: 	TPictureHeader hdrB=TheContainer->iText->PictureHeader(7);
sl@0: 	test(hdrB.iPictureType==KUidXzePictureType);
sl@0: 	if (aDeferPictureLoad)
sl@0: 		{
sl@0: 		test(hdrB.iPicture.IsId());
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		test(hdrB.iPicture!=NULL);
sl@0: 		test(hdrB.iPicture.IsPtr());
sl@0: 		test(((CXzePicture*)hdrB.iPicture.AsPtr())->iLabel=='z');
sl@0: 		}
sl@0: 	TPictureHeader hdrC=TheContainer->iText->PictureHeader(9);
sl@0: 	test(hdrC.iPictureType==KUidXzePictureType);
sl@0: 	if (aDeferPictureLoad)
sl@0: 		{
sl@0: 		test(hdrC.iPicture.IsId());
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		test(hdrC.iPicture!=NULL);
sl@0: 		test(hdrC.iPicture.IsPtr());
sl@0: 		test(((CXzePicture*)hdrC.iPicture.AsPtr())->iLabel=='e');
sl@0: 		}
sl@0: 	TPictureHeader hdrD=TheContainer->iText->PictureHeader(0);  // This is not a picture character
sl@0: 	test(hdrD.iPictureType==KNullUid);
sl@0: 	test(hdrD.iPicture==NULL);
sl@0: 	TSize dummySize;
sl@0: 	test(hdrD.iSize==dummySize);
sl@0: 	//
sl@0: 	TheContainer->iText->GetChars(view,format,1);
sl@0: 	test(view[0]==CEditableText::EPictureCharacter);
sl@0: 	picture=TheContainer->iText->PictureHandleL(1);
sl@0: 	test(((CXzePicture*)picture)->iLabel=='x');
sl@0: 	
sl@0: 	TheContainer->iText->GetChars(view,format,7);
sl@0: 	test(view[0]==CEditableText::EPictureCharacter);
sl@0: 	picture=TheContainer->iText->PictureHandleL(7);
sl@0: 	test(((CXzePicture*)picture)->iLabel=='z');
sl@0: 	
sl@0: 	TheContainer->iText->GetChars(view,format,9);
sl@0: 	test(view[0]==CEditableText::EPictureCharacter);
sl@0: 	picture=TheContainer->iText->PictureHandleL(9);
sl@0: 	test(((CXzePicture*)picture)->iLabel=='e');
sl@0: 
sl@0: 	delete factory;
sl@0: 	CleanupStack::PopAndDestroy();  // TheStore
sl@0: 	TheFs.Close();
sl@0:     }
sl@0: 
sl@0: 
sl@0: LOCAL_C void testPictureRestorer2(TBool aAlwaysFailToLoad=EFalse)
sl@0: // Test Picture persistance.
sl@0: //
sl@0:     {
sl@0: 	//
sl@0: 	TheFs.Connect();
sl@0: 	//
sl@0: 	TheStore=CDirectFileStore::ReplaceL(TheFs,_L("c:\\etext\\t_word1.doc"),EFileRead|EFileWrite);
sl@0: 	TheDeferredPictureStore=TheStore;
sl@0: 	CleanupStack::PushL(TheStore);
sl@0: 	TheStore->SetTypeL(KDirectFileStoreLayout);
sl@0: 	//
sl@0: 	// Create concrete picture factory.
sl@0: 	MDemPictureFactory* factory=new(ELeave) MDemPictureFactory;
sl@0: 
sl@0: 	TheContainer->iText->Reset();
sl@0: 	TheContainer->iText->InsertL(0,_L("Hello Duncan how"));
sl@0: 
sl@0: 	TheContainer->iText->SetPictureFactory(factory,TheContainer);
sl@0: 	// Create some pictures.
sl@0: 	CXzeDoor* pic1=CXzeDoor::NewL('x',aAlwaysFailToLoad);
sl@0: 		CleanupStack::PushL(pic1);
sl@0: 	CXzeDoor* pic2=CXzeDoor::NewL('z',aAlwaysFailToLoad);
sl@0: 		CleanupStack::PushL(pic2);
sl@0: 	CXzePicture* pic3=CXzePicture::NewL('e');  // Control: will always load.
sl@0: 		CleanupStack::PushL(pic3);
sl@0: 	//
sl@0: 	// Create the picture headers
sl@0: 	TPictureHeader hdr1;
sl@0: 	TPictureHeader hdr2;
sl@0: 	TPictureHeader hdr3;
sl@0: 	//
sl@0: 	TSize size;
sl@0: 	pic1->GetSizeInTwips(size);
sl@0: 	hdr1.iPictureType=KUidXzeDoorType;
sl@0: 	hdr1.iPicture=pic1;
sl@0: 	hdr2.iPictureType=KUidXzeDoorType;
sl@0: 	hdr2.iPicture=pic2;
sl@0: 	hdr3.iPictureType=KUidXzePictureType;
sl@0: 	hdr3.iPicture=pic3;
sl@0: 	//
sl@0: 	// Insert the pictures into the rich text
sl@0: 	TBool hasMarkupData=TheContainer->iText->HasMarkupData();
sl@0: 	test(!hasMarkupData);
sl@0: 	TheContainer->iText->CancelInsertCharFormat();
sl@0: 	TheContainer->iText->InsertL(0,hdr1);
sl@0: 	TheContainer->iText->InsertL(5,hdr2);
sl@0: 	TheContainer->iText->InsertL(7,hdr3);
sl@0: 	TheContainer->iText->InsertL(0,CEditableText::EParagraphDelimiter);
sl@0: 	TheContainer->iText->CancelInsertCharFormat();
sl@0: 	TheContainer->iText->InsertL(2,CEditableText::EParagraphDelimiter);
sl@0: 	CleanupStack::Pop(3);  // pic1,2,3 - ownership transferred to rich text
sl@0: 	hasMarkupData=TheContainer->iText->HasMarkupData();
sl@0: 	test(hasMarkupData);
sl@0: 	//
sl@0: 	// High level Store context - all pictures currently in memory
sl@0: 	TStreamId id=TheContainer->StoreL(*TheStore);
sl@0: //
sl@0: 	delete TheContainer->iText;
sl@0: 	delete (CParaFormatLayer*)TheContainer->iGlobalParaFormatLayer;
sl@0: 	delete (CCharFormatLayer*)TheContainer->iGlobalCharFormatLayer;
sl@0: //
sl@0: //
sl@0: //	Now restore the container with rich text
sl@0: 	TheContainer->RestoreL(*TheStore,id,factory);
sl@0: //
sl@0: //
sl@0: //  Now store the stuff again
sl@0: 	TInt error=TheContainer->iText->LoadAllPicturesNowL();
sl@0: 	if (error==KErrNotFound)
sl@0: 		INFO_PRINTF1(_L("   SIMULATION: Some picture data has been removed as no app could be found."));
sl@0: //	if (aAlwaysFailToLoad)
sl@0: //		test(error==KErrNotFound);
sl@0: //	else
sl@0: //		test(error==KErrNone);
sl@0: 	id=KNullStreamId;
sl@0: 	TRAP(error,
sl@0: 	id=TheContainer->StoreL(*TheStore));
sl@0: 	test(error==KErrNone);
sl@0: //
sl@0: // ...and restore it to check what we have got.
sl@0: 	delete TheContainer->iText;
sl@0: 	delete (CParaFormatLayer*)TheContainer->iGlobalParaFormatLayer;
sl@0: 	delete (CCharFormatLayer*)TheContainer->iGlobalCharFormatLayer;
sl@0:     TheContainer->RestoreL(*TheStore,id,factory);
sl@0: 	TInt pictureCount=TheContainer->iText->PictureCount();
sl@0: 	if (aAlwaysFailToLoad)
sl@0: 		test(pictureCount==1);
sl@0: 	else
sl@0: 		test(pictureCount==3);
sl@0: //
sl@0: 	delete factory;
sl@0: 	CleanupStack::PopAndDestroy();  // TheStore
sl@0: 	TheFs.Close();
sl@0:     }*/
sl@0: 
sl@0: 
sl@0: LOCAL_C void CompareRichTextL(CRichText *aDoc1,CRichText *aDoc2)
sl@0: //
sl@0: 	{
sl@0: 	INFO_PRINTF1(_L("Comparing Documents"));
sl@0: 	TInt length;
sl@0: 	TInt num1,num2;
sl@0:  	TInt ii=0,len1,len2,pos1,pos2,oldPos;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Document Length"));
sl@0: 	length=aDoc1->LdDocumentLength();
sl@0: 	num2=aDoc2->LdDocumentLength();
sl@0: 	test(length==num2);
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Paragraph Count"));
sl@0: 	num1=aDoc1->ParagraphCount();
sl@0: 	num2=aDoc2->ParagraphCount();
sl@0: 	test(num1==num2);
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Paragraph Lengths"));
sl@0: 	pos1=-1;
sl@0: 	oldPos=-2;
sl@0: 	while (pos1>oldPos)
sl@0: 		{
sl@0: 		oldPos=pos1;
sl@0: 		pos1=aDoc1->CharPosOfParagraph(len1,ii);
sl@0: 		pos2=aDoc2->CharPosOfParagraph(len2,ii);
sl@0: 		test(len1==len2);
sl@0: 		test(pos1==pos2);
sl@0: 		ii++;
sl@0: 		}
sl@0:  
sl@0: 	INFO_PRINTF1(_L("Word Count"));
sl@0: 	num1=aDoc1->WordCount();
sl@0: 	num2=aDoc2->WordCount();
sl@0: 	test(num1==num2);
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Characters"));
sl@0: 	TCharFormat format1,format2;
sl@0: 	TPtrC chars1,chars2;
sl@0: 	len1=1;
sl@0: 	ii=0;
sl@0: 	while (ii<=length)
sl@0: 		{
sl@0: 		aDoc1->GetChars(chars1,format1,ii);
sl@0: 		aDoc2->GetChars(chars2,format2,ii);
sl@0: 		len1=Min(chars1.Length(),chars2.Length());
sl@0: 		test(chars1.Left(len1)==chars2.Left(len1));
sl@0: 		test(format1.IsEqual(format2));
sl@0: 		test(format2.IsEqual(format1));
sl@0: 		ii+=len1;
sl@0: 		}
sl@0: 	
sl@0: 	
sl@0: 	}
sl@0: 
sl@0: 
sl@0: LOCAL_C  void GoL()
sl@0: // Run the tests
sl@0: //
sl@0: 	{
sl@0: 	CParaFormatLayer* pLayer=CParaFormatLayer::NewL();
sl@0: 	CCharFormatLayer* cLayer=CCharFormatLayer::NewL();
sl@0: 	CRichText *document=CRichText::NewL(pLayer,cLayer);
sl@0: 	TInt err;
sl@0: 	
sl@0: 	INFO_PRINTF1(_L("Document with single Paragraph"));
sl@0: 	INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-TTEXT-LEGACY-T_TRAN-0001 "));
sl@0: 	{	
sl@0: 	TheContainer=CContainer::NewL(_L("z:\\test\\app-framework\\etext\\t_para.pml"));
sl@0: 	INFO_PRINTF1(_L("Exporting a file by Para"));
sl@0: 	TFileName exportFile=KExportFileName1();
sl@0: 	EnsureFileExists(exportFile);
sl@0: 	TRAP(err,TheContainer->iText->ExportAsTextL(exportFile,CPlainText::EOrganiseByParagraph,0));
sl@0: 	test(err==KErrNone);
sl@0: 	INFO_PRINTF1(_L("Importing a file by Para"));
sl@0: 	document->Reset();
sl@0: 	TInt charsImported=document->ImportTextFileL(0,exportFile,CPlainText::EOrganiseByParagraph);
sl@0: 	test(charsImported>0);
sl@0: 	INFO_PRINTF1(_L("Comparing Result"));
sl@0: 	TRAP(err,CompareRichTextL(TheContainer->iText,document));
sl@0:  	test(err==KErrNone);
sl@0: 	delete TheContainer;
sl@0: 	}
sl@0: 	
sl@0: 	{
sl@0: 	TheContainer=CContainer::NewL(_L("z:\\test\\app-framework\\etext\\t_para.pml"));
sl@0: 	INFO_PRINTF1(_L("Exporting and Importing a file by Line"));
sl@0: 	INFO_PRINTF1(_L("Line Lengths 25,30,...,95"));
sl@0: 	TFileName exportFile=KExportFileName1();
sl@0: 	TInt ii;
sl@0: 	for(ii=25;ii<100;ii+=5)
sl@0: 		{
sl@0: 		INFO_PRINTF1(_L("With next line length"));
sl@0: 		EnsureFileExists(exportFile);
sl@0: 		TRAP(err,TheContainer->iText->ExportAsTextL(exportFile,CPlainText::EOrganiseByLine,ii));
sl@0: 		test(err==KErrNone);
sl@0: 		document->Reset();
sl@0: 		TInt charsImported=document->ImportTextFileL(0,exportFile,CPlainText::EOrganiseByLine);
sl@0: 		test(charsImported>0);
sl@0: 		TRAP(err,CompareRichTextL(TheContainer->iText,document));
sl@0:  		test(err==KErrNone);
sl@0: 		}
sl@0: 	delete TheContainer;
sl@0: 	
sl@0: 	}
sl@0: 
sl@0: 	
sl@0: 	INFO_PRINTF1(_L("Document with two Paragraphs"));
sl@0: 	
sl@0: 	{	
sl@0: 	TheContainer=CContainer::NewL(_L("z:\\test\\app-framework\\etext\\t_para2.pml"));
sl@0: 	INFO_PRINTF1(_L("Exporting a file by Para"));
sl@0: 	TFileName exportFile=KExportFileName2();
sl@0: 	EnsureFileExists(exportFile);
sl@0: 	TRAP(err,TheContainer->iText->ExportAsTextL(exportFile,CPlainText::EOrganiseByParagraph,0));
sl@0: 	test(err==KErrNone);
sl@0: 	INFO_PRINTF1(_L("Importing a file by Para"));
sl@0: 	document->Reset();
sl@0: 	TInt charsImported=document->ImportTextFileL(0,exportFile,CPlainText::EOrganiseByParagraph);
sl@0: 	test(charsImported>0);
sl@0: 	INFO_PRINTF1(_L("Comparing Result"));
sl@0: 	TRAP(err,CompareRichTextL(TheContainer->iText,document));
sl@0:  	test(err==KErrNone);
sl@0: 	delete TheContainer;
sl@0: 	}
sl@0: 	
sl@0: 	{
sl@0: 	TheContainer=CContainer::NewL(_L("z:\\test\\app-framework\\etext\\t_para.pml"));
sl@0: 	INFO_PRINTF1(_L("Exporting and Importing a file by Line"));
sl@0: 	INFO_PRINTF1(_L("Line Lengths 30,40,...,100"));
sl@0: 	TFileName exportFile=KExportFileName1();
sl@0: 	TInt ii;
sl@0: 	for(ii=30;ii<105;ii+=10)
sl@0: 		{
sl@0: 		INFO_PRINTF1(_L("With next line length"));
sl@0: 		EnsureFileExists(exportFile);
sl@0: 		TRAP(err,TheContainer->iText->ExportAsTextL(exportFile,CPlainText::EOrganiseByLine,ii));
sl@0: 		test(err==KErrNone);
sl@0: 		document->Reset();
sl@0: 		TInt charsImported=document->ImportTextFileL(0,exportFile,CPlainText::EOrganiseByLine);
sl@0: 		test(charsImported>0);
sl@0: 		TRAP(err,CompareRichTextL(TheContainer->iText,document));
sl@0:  		test(err==KErrNone);
sl@0: 		}
sl@0: 	delete TheContainer;
sl@0: 	
sl@0: 	}
sl@0: 
sl@0: 	delete document;
sl@0: 	delete cLayer;
sl@0: 	delete pLayer;
sl@0: 
sl@0: 	
sl@0: 	}
sl@0: 
sl@0: 
sl@0: LOCAL_C void setupCleanup()
sl@0: //
sl@0: // Initialise the cleanup stack.
sl@0: //
sl@0:     {
sl@0: 
sl@0: 	TheTrapCleanup=CTrapCleanup::New();
sl@0: 	TRAPD(r,\
sl@0: 		{\
sl@0: 		for (TInt i=KTestCleanupStack;i>0;i--)\
sl@0: 			CleanupStack::PushL((TAny*)1);\
sl@0: 		test(r==KErrNone);\
sl@0: 		CleanupStack::Pop(KTestCleanupStack);\
sl@0: 		});
sl@0: 	}
sl@0: 
sl@0: 
sl@0: LOCAL_C void DeleteDataFile(const TDesC& aFullName)
sl@0: 	{
sl@0: 	RFs fsSession;
sl@0: 	TInt err = fsSession.Connect();
sl@0: 	if(err == KErrNone)
sl@0: 		{
sl@0: 		TEntry entry;
sl@0: 		if(fsSession.Entry(aFullName, entry) == KErrNone)
sl@0: 			{
sl@0: 			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
sl@0: 			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
sl@0: 			if(err != KErrNone) 
sl@0: 				{
sl@0: 				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
sl@0: 				}
sl@0: 			err = fsSession.Delete(aFullName);
sl@0: 			if(err != KErrNone) 
sl@0: 				{
sl@0: 				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
sl@0: 				}
sl@0: 			}
sl@0: 		fsSession.Close();
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
sl@0: 		}
sl@0: 	}
sl@0: }
sl@0: 
sl@0: CT_TRAN::CT_TRAN()
sl@0:     {
sl@0:     SetTestStepName(KTestStep_T_TRAN);
sl@0:     pTestStep = this;
sl@0:     }
sl@0: 
sl@0: TVerdict CT_TRAN::doTestStepL()
sl@0:     {
sl@0:     SetTestStepResult(EFail);
sl@0: 
sl@0:     INFO_PRINTF1(_L("Testing Picture Restorer mechanism"));
sl@0:     
sl@0:     __UHEAP_MARK;
sl@0:     T_TRAN::setupCleanup();
sl@0:     TRAPD(r, T_TRAN::GoL());
sl@0: 
sl@0:     delete T_TRAN::TheTrapCleanup;
sl@0:     
sl@0:     __UHEAP_MARKEND;
sl@0:     
sl@0:     T_TRAN::DeleteDataFile(T_TRAN::KExportFileName1);     //deletion of data files must be before call to End() - DEF047652
sl@0:     T_TRAN::DeleteDataFile(T_TRAN::KExportFileName2); 
sl@0:     
sl@0:     if (r == KErrNone)
sl@0:         {
sl@0:         SetTestStepResult(EPass);
sl@0:         }
sl@0: 
sl@0:     return TestStepResult();
sl@0:     }