Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.
// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
//
#ifndef __TF_WRITE_H__
#define __TF_WRITE_H__
#include <e32std.h>
enum TPanicNo
{
EPanicGetDesOverflow,
EPanicGetDesInitialOverflow,
EPanicCheckOverflow,
EPanicCompareDescOverflow,
EPanicEraseBlockOOR,
EPanicEraseBlockNeg,
EPanicJoinMaths
};
GLREF_C void Panic( TPanicNo aPanic );
class CWriteTest;
class MGeneralizedWrite
//
// Provides an generic interface to a write function which
// can be either the simple of thread version. Used to hide which
// version of the write function a test is using
//
{
public:
virtual void Write(TInt aPos,const TDesC8& aSrc) = 0;
virtual void CheckedWrite(TInt aPos,const TDesC8& aSrc) = 0;
};
class TWriteBase: public MGeneralizedWrite
{
public:
TWriteBase( CWriteTest& aOwner );
virtual void CheckedWrite(TInt aPos,const TDesC8& aSrc);
protected:
CWriteTest& iOwner;
};
class TSimpleWrite : public TWriteBase
//
// Simple implementation of write function
//
{
public:
TSimpleWrite( CWriteTest& aOwner );
virtual void Write( TInt aPos, const TDesC8& aSrc );
private:
TBusLocalDrive& iDrive;
};
class TThreadWrite : public TWriteBase
//
// Thread implementation of write function
//
{
public:
TThreadWrite( CWriteTest& aOwner );
virtual void Write(TInt aPos,const TDesC8& aSrc);
// Thread functions with offset, added by this class
void CheckedThreadWrite(TInt aPos, TInt aLength, const TDesC8& aSrc, TInt aDescOffset );
void CurrentThreadCheckedThreadWrite(TInt aPos, TInt aLength, const TDesC8& aSrc, TInt aDescOffset );
private:
TBusLocalDrive& iDrive;
const TInt iThreadHandle;
};
class CBlockManager : public CBase
//
// class used to control erasing and allocation of blocks
//
{
public:
CBlockManager( TBusLocalDrive& iDrive, CWriteTest& aOwner );
~CBlockManager();
void CreateL();
void EraseBlock( TInt aBlockNumber );
void EraseAllBlocks();
void VerifyErased( TInt aBlockNumber );
void InitialiseSequentialBlockAllocator();
TInt NextErasedBlock();
void InitialiseDataChunkAllocator();
TUint NextErasedDataChunk( TInt aRequiredLength, TInt aMultiple=4 );
inline TInt BlockCount() const;
inline TInt BlockSize() const;
inline TInt FlashSize() const;
inline TUint BlockAddress( TInt aBlockNumber ) const;
private:
TBusLocalDrive& iDrive;
TBuf8<512> iReadBuffer;
CWriteTest& iOwner;
TInt iBlockCount;
TInt iBlockSize;
enum TEraseStatus
{
EErased,
ENotErased
};
TEraseStatus* iEraseArray;
TInt iNextBlock;
TInt iDataBlock;
TInt iDataOffset;
};
class CWriteTest : public CBase
{
public:
~CWriteTest();
void CreateL();
void DoTests();
TBool CompareAgainstFlash( TInt aFlashOffset, const TDesC8& aDes );
TBool CompareAgainstFlash( TInt aFlashOffset, TInt aLength, const TDesC8& aDes, TInt aDescOffset );
inline const TUint8* ChunkBase() const;
inline TBusLocalDrive& Drive();
inline TInt DummyThreadHandle() const;
private:
static TInt DummyThread( TAny* aParam );
void CreateRandomData( TDes8& aDestBuf, TInt aLength );
TBool CheckOnes( TUint aFlashOffset, TInt aLength );
void CreateTestData( TInt aBlockNumber, TBool aEndOfBlock );
void SimpleWriteTest();
void SimpleThreadWriteTest();
void DoSimpleWriteTest( MGeneralizedWrite& aWriter );
void AlignedWriteTest();
void AlignedThreadWriteTest();
void DoAlignedWriteTest( MGeneralizedWrite& aWriter );
void UnalignedWriteTest();
void UnalignedThreadWriteTest();
void DoUnalignedWriteTest( MGeneralizedWrite& aWriter );
void OffsetDescriptorAlignedWriteTest();
void OffsetDescriptorUnalignedWriteTest();
void OffsetDescriptorCurrentThreadAlignedWriteTest();
void OffsetDescriptorCurrentThreadUnalignedWriteTest();
void JoinedWriteTest();
void JoinedThreadWriteTest();
void SingleBitOverwriteTest();
void TwoBitOverwriteTest();
void RunSimulationTest();
private:
TBusLocalDrive iDrive;
TBool iDriveOpened;
TBuf8<512> iReadBuffer;
CBlockManager* iBlocks;
TRandomGenerator iRandom;
TSimpleWrite* iSimpleWriter;
TThreadWrite* iThreadWriter;
RThread iDummyThread;
};
inline TBusLocalDrive& CWriteTest::Drive()
{
return iDrive;
}
inline TInt CWriteTest::DummyThreadHandle() const
{
return iDummyThread.Handle();
}
#endif