diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/store/TSTOR/t_storshape.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/store/TSTOR/t_storshape.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,512 @@ +// Copyright (c) 1998-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 +#include + +const TInt KTestCleanupStack=0x20; + +// This is a path specification and should not be used as is +_LIT(KFileLocationSpec, "Z:\\STOR-TST\\T_SHAPE.DAT"); + +class CShape; +enum TShape {ENotAShape,ESquare,ECircle}; +typedef CShape* (*TShapeCtor)(); +class CShape : public CBase + { +public: + static TShapeCtor Ctor(TShape type); +// + virtual void ExternalizeL(RWriteStream& aStream) const=0; + virtual void InternalizeL(RReadStream& aStream)=0; +// + TStreamId StoreL(CStreamStore& aStore) const; + void RestoreL(const CStreamStore& aStore,TStreamId anId); +// + virtual TPtrC Name() const=0; + virtual TSize Extent() const=0; + virtual TPoint Centre() const=0; + }; +class CSquare : public CShape + { +public: + static CShape* New(); + CSquare() {} + CSquare(const TPoint& aCentre,TInt aSide); + void ExternalizeL(RWriteStream& aStream) const; + void InternalizeL(RReadStream& aStream); + TPtrC Name() const; + TSize Extent() const; + TPoint Centre() const; +private: + TRect iRect; + }; +class CCircle : public CShape + { +public: + static CShape* New(); + CCircle() {} + CCircle(const TPoint& aCentre,TInt aRadius); + void ExternalizeL(RWriteStream& aStream) const; + void InternalizeL(RReadStream& aStream); + TPtrC Name() const; + TSize Extent() const; + TPoint Centre() const; +private: + TPoint iCentre; + TInt iRadius; + }; + +class TShapeHolder + { +public: + TShapeHolder(); + TShapeHolder(TShape aType,CShape* aShape); +// + void ExternalizeL(RWriteStream& aStream) const; + void InternalizeL(RReadStream& aStream); + void StoreComponentsL(CStreamStore& aStore,CStoreMap& aMap) const; + void RestoreComponentsL(const CStreamStore& aStore); +// + void ExternalizeSerialL(RWriteStream& aStream) const; + void InternalizeSerialL(RReadStream& aStream); +// + TStreamId StoreL(CStreamStore& aStore) const; + void RestoreL(const CStreamStore& aStore,TStreamId anId); +// + CShape* Shape() const; +private: + TShape iType; + TSwizzle iShape; + }; + +LOCAL_D RTest test(_L("t_storshape")); +LOCAL_D CTrapCleanup* TheTrapCleanup; +LOCAL_D RFs TheFs; +//LOCAL_D CBufStore* TheStore; +LOCAL_D CFileStore* TheStore; +LOCAL_D RStoreWriteStream TheSink; +LOCAL_D RStoreReadStream TheSource; +//LOCAL_D RFileWriteStream TheSink; +//LOCAL_D RFileReadStream TheSource; + +/** +@SYMTestCaseID PDS-STORE-CT-4025 +@SYMTestCaseDesc Basic test for CStoreMap Forget() and Unbind() API +@SYMTestPriority High +@SYMTestActions Unbind stream from Map, forget sgtream from map +@SYMTestExpectedResults map stream ID should be NUll +@SYMDEF DEF135804 +*/ +LOCAL_C void testExtraStoreMapAPIsL() + { + test.Next(_L("@SYMTestCaseID PDS-STORE-CT-4025")); + CShape* shape=new(ELeave) CCircle(TPoint(70,80),40); + CleanupStack::PushL(shape); + CStoreMap* map=CStoreMap::NewLC(*TheStore); + TStreamId id = shape->StoreL(*TheStore); + + map->BindL(shape,id); + test(id == map->At(shape)); + //Unbind the twizzle(shape) and test to make sure it is unbinded + map->Unbind(shape); + test(KNullStreamId == map->At(shape)); + + map->BindL(shape,id); + test(shape == map->Label(id)); + //Forget the stream id and test to make sure it is forgotten + map->Forget(id); + test(shape != map->Label(id)); + CleanupStack::PopAndDestroy(2,shape); + } +/** +@SYMTestCaseID SYSLIB-STORE-CT-1200 +@SYMTestCaseDesc Shape streaming test +@SYMTestPriority High +@SYMTestActions Attempt for streaming of different shapes +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_C void testShapesL() + { + test.Start(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1200 Shape streaming ")); + + TParsePtrC parse(KFileLocationSpec); +// +// TheStore=CDirectFileStore::ReplaceLC(TheFs,KTestFile,EFileRead|EFileWrite); + TheStore=CPermanentFileStore::ReplaceLC(TheFs,parse.NameAndExt(),EFileRead|EFileWrite); + TheStore->SetTypeL(TheStore->Layout()); +// + RStoreWriteStream snk; + TStreamId id=snk.CreateL(*TheStore); + TShapeHolder hldr(ESquare,new(ELeave) CSquare(TPoint(20,30),40)); + hldr.ExternalizeSerialL(snk); + delete hldr.Shape(); + hldr=TShapeHolder(ECircle,new(ELeave) CCircle(TPoint(70,80),40)); + hldr.ExternalizeSerialL(snk); + delete hldr.Shape(); + snk.Close(); + RStoreReadStream src; + src.OpenL(*TheStore,id); + hldr.InternalizeSerialL(src); + delete hldr.Shape(); + hldr.InternalizeSerialL(src); + delete hldr.Shape(); + src.Close(); +// + hldr=TShapeHolder(ESquare,new(ELeave) CSquare(TPoint(20,30),40)); + id=hldr.StoreL(*TheStore); + delete hldr.Shape(); + hldr.RestoreL(*TheStore,id); + delete hldr.Shape(); +// + CShape* shape=new(ELeave) CCircle(TPoint(70,80),40); + CStoreMap* map=CStoreMap::NewL(*TheStore); + TStreamId id2 = shape->StoreL(*TheStore); + + testExtraStoreMapAPIsL(); + + map->BindL(shape,id2); + snk=RStoreWriteStream(*map); + id=snk.CreateL(*TheStore); + snk<>id; + src.Close(); + shape=new(ELeave) CCircle; + shape->RestoreL(*TheStore,id); + delete map; + TRAPD(r,shape->RestoreL(*TheStore,id)); + test(r==KErrNotFound); + delete shape; +// + CleanupStack::PopAndDestroy(); + } + +// +// Prepare the test directory. +// +LOCAL_C void setupTestDirectory() + { + TInt r=TheFs.Connect(); + test(r==KErrNone); +// + TDriveUnit drive(static_cast(RFs::GetSystemDrive())); + TParse parse; + parse.Set(drive.Name(), &KFileLocationSpec, NULL); + + r=TheFs.MkDir(parse.DriveAndPath()); + test(r==KErrNone||r==KErrAlreadyExists); + r=TheFs.SetSessionPath(parse.DriveAndPath()); + test(r==KErrNone); + } + +// +// Initialise the cleanup stack. +// +LOCAL_C void setupCleanup() + { + TheTrapCleanup=CTrapCleanup::New(); + test(TheTrapCleanup!=NULL); + TRAPD(r,\ + {\ + for (TInt i=KTestCleanupStack;i>0;i--)\ + CleanupStack::PushL((TAny*)1);\ + test(r==KErrNone);\ + CleanupStack::Pop(KTestCleanupStack);\ + }); + test(r==KErrNone); + } + +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); + } + } + +// +// Test the streaming framework. +// +GLDEF_C TInt E32Main() + { + test.Title(); + setupTestDirectory(); + setupCleanup(); + __UHEAP_MARK; +// + TRAPD(r,testShapesL()); + test(r==KErrNone); + + //deletion of data files must be before call to .End() - DEF047652 + TDriveUnit drive(static_cast(RFs::GetSystemDrive())); + TParse parse; + parse.Set(drive.Name(), &KFileLocationSpec, NULL); + ::DeleteDataFile(parse.FullName()); + + test.End(); +// + __UHEAP_MARKEND; + + delete TheTrapCleanup; + TheFs.Close(); + test.Close(); + return 0; + } + +TShapeCtor CShape::Ctor(TShape type) + { + switch (type) + { + case ESquare: + return &CSquare::New; + case ECircle: + return &CCircle::New; + default: + return NULL; + } + } + +TStreamId CShape::StoreL(CStreamStore& aStore) const + { + RStoreWriteStream stream; + TStreamId id=stream.CreateLC(aStore); + ExternalizeL(stream); + stream.CommitL(); + CleanupStack::PopAndDestroy(); + return id; + } + +void CShape::RestoreL(const CStreamStore& aStore,TStreamId anId) + { + RStoreReadStream stream; + stream.OpenLC(aStore,anId); + InternalizeL(stream); + CleanupStack::PopAndDestroy(); + } + +CShape* CSquare::New() + { + return new CSquare; + } + +CSquare::CSquare(const TPoint& aCentre,TInt aSide) + { + TInt offset=aSide/2; + iRect.iTl.iX=aCentre.iX-offset; + iRect.iTl.iY=aCentre.iY-offset; + iRect.iBr.iX=iRect.iTl.iX+aSide; + iRect.iBr.iY=iRect.iTl.iY+aSide; + } + +void CSquare::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteUint32L(iRect.iTl.iX); + aStream.WriteUint32L(iRect.iTl.iY); + aStream.WriteUint32L(iRect.iBr.iX); + aStream.WriteUint32L(iRect.iBr.iY); + } + +void CSquare::InternalizeL(RReadStream& aStream) + { + iRect.iTl.iX=aStream.ReadUint32L(); + iRect.iTl.iY=aStream.ReadUint32L(); + iRect.iBr.iX=aStream.ReadUint32L(); + iRect.iBr.iY=aStream.ReadUint32L(); + } + +TPtrC CSquare::Name() const + { + return _L("Square"); + } + +TSize CSquare::Extent() const + { + return (iRect.iBr-iRect.iTl).AsSize(); + } + +TPoint CSquare::Centre() const + { + return TPoint((iRect.iBr.iX-iRect.iTl.iX)/2,(iRect.iBr.iY-iRect.iTl.iY)/2); + } + +CShape* CCircle::New() + { + return new CCircle; + } + +CCircle::CCircle(const TPoint& aCentre,TInt aRadius) + : iCentre(aCentre),iRadius(aRadius) + {} + +void CCircle::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteUint32L(iCentre.iX); + aStream.WriteUint32L(iCentre.iY); + aStream.WriteUint32L(iRadius); + } + +void CCircle::InternalizeL(RReadStream& aStream) + { + iCentre.iX=aStream.ReadUint32L(); + iCentre.iY=aStream.ReadUint32L(); + iRadius=aStream.ReadUint32L(); + } + +TPtrC CCircle::Name() const + { + return _L("Circle"); + } + +TSize CCircle::Extent() const + { + TInt diameter=iRadius*2; + return TSize(diameter,diameter); + } + +TPoint CCircle::Centre() const + { + return iCentre; + } + +TShapeHolder::TShapeHolder() + : iType(ENotAShape),iShape(NULL) + {} + +TShapeHolder::TShapeHolder(TShape aType,CShape* aShape) + : iType(aType),iShape(aShape) + { + __ASSERT_DEBUG((iType==ENotAShape)==(aShape==NULL),User::Panic(_L("gargl"),0)); + } + +void TShapeHolder::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteUint8L(iType); + aStream<>iShape; + iType=type; + } + +void TShapeHolder::StoreComponentsL(CStreamStore& aStore,CStoreMap& aMap) const + { + if (iShape!=NULL) + { + TStreamId id=iShape->StoreL(aStore); + aMap.BindL(iShape,id); + } + } + +void TShapeHolder::RestoreComponentsL(const CStreamStore& aStore) + { + TShapeCtor ctor=CShape::Ctor(iType); + CShape* shape=NULL; + if (ctor!=NULL) + { + User::LeaveIfNull(shape=(*ctor)()); + CleanupStack::PushL(shape); + shape->RestoreL(aStore,iShape.AsId()); + CleanupStack::Pop(); + } + iShape=shape; + } + +void TShapeHolder::ExternalizeSerialL(RWriteStream& aStream) const + { + aStream.WriteUint8L(iType); + if (iShape!=NULL) + aStream<<*iShape; + } + +void TShapeHolder::InternalizeSerialL(RReadStream& aStream) + { + TShape type=TShape(aStream.ReadUint8L()); + TShapeCtor ctor=CShape::Ctor(type); + if ((type==ENotAShape)!=(ctor==NULL)) + User::Leave(1832); // representation violation!!! +// + CShape* shape=NULL; + if (ctor!=NULL) + { + User::LeaveIfNull(shape=(*ctor)()); + CleanupStack::PushL(shape); + aStream>>*shape; + CleanupStack::Pop(); + } + iType=type; + iShape=shape; + } + +TStreamId TShapeHolder::StoreL(CStreamStore& aStore) const + { + CStoreMap* map=CStoreMap::NewLC(aStore); + StoreComponentsL(aStore,*map); +// + RStoreWriteStream stream(*map); + TStreamId id=stream.CreateLC(aStore); + ExternalizeL(stream); + stream.CommitL(); +// + map->Reset(); + CleanupStack::PopAndDestroy(2); + return id; + } + +void TShapeHolder::RestoreL(const CStreamStore& aStore,TStreamId anId) + { + RStoreReadStream stream; + stream.OpenLC(aStore,anId); + InternalizeL(stream); + CleanupStack::PopAndDestroy(); +// + RestoreComponentsL(aStore); + } + +CShape* TShapeHolder::Shape() const + { + return iShape; + } +