diff -r 000000000000 -r a41df078684a kerneltest/f32test/ext/t_testext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/ext/t_testext.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,199 @@ +// Copyright (c) 2005-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: +// f32test\ext\t_testext.cpp +// +// + +#include +#include "t_testext.h" + +CTestProxyDrive::CTestProxyDrive(CProxyDrive* aProxyDrive, CMountCB* aMount) + : CBaseExtProxyDrive(aProxyDrive,aMount), iMount(aMount) + { + __PRINT(_L("CTestProxyDrive::CTestProxyDrive")); + } + +CTestProxyDrive::~CTestProxyDrive() + { + __PRINT(_L("CTestProxyDrive::~CTestProxyDrive")); + delete[] iMap; + } + +void CTestProxyDrive::InitL() + { + __PRINT(_L("CTestProxyDrive::Init")); + + DoInitL(); + + // Allocate bad sector bit map + TInt size = (iTotalSectors+7) >> 3; // round up by byte + iMap = new(ELeave) TUint8[size]; + Mem::FillZ(iMap, size); + + iMountInitialised = ETrue; + } + +TInt CTestProxyDrive::ControlIO(const RMessagePtr2& aMessage,TInt aCommand,TAny* aParam1,TAny* aParam2) + { + __PRINT(_L("CTestProxyDrive::ControlIO")); + + TInt r = KErrNone; + + if (!iMountInitialised) + return KErrNotReady; + + switch(aCommand+EExtCustom) + { + case ESetEvent: + r = SetEvent((TInt)aParam1, (TInt)aParam2); + break; + + case EMark: + //-- mark given sector as bad + __PRINT1(_L("CTestProxyDrive: marking sector:%d as bad"), (TInt)aParam1); + r = Mark((TInt)aParam1); + break; + + case EUnmark: + //-- mark given sector as good + __PRINT1(_L("CTestProxyDrive: Unmarking sector:%d"), (TInt)aParam1); + r = Unmark((TInt)aParam1); + break; + + case EUnmarkAll: + r = UnmarkAll(); + break; + + case EIsMarked: + if (IsMarked((TInt)aParam1)) + r = aMessage.Write(3, TPckgBuf(ETrue)); + else + r = aMessage.Write(3, TPckgBuf(EFalse)); + break; + case EDiskSize: + r = aMessage.Write(2, TPckgBuf(iMount->Size())); + break; + default: + r = DoControlIO(aMessage,aCommand,aParam1,aParam2); + __PRINT2(_L("Get unknown command %d error %d"), aCommand, r); + } + return r; + } + +TInt CTestProxyDrive::GetLastErrorInfo(TDes8 &aErrorInfo) + { + __PRINT(_L("CTestProxyDrive::GetLastErrorInfo")); + TPckgBuf errInfoBuf; + errInfoBuf().iReasonCode = iLastErrorReason; + errInfoBuf().iErrorPos = iSuccessBytes; + aErrorInfo = errInfoBuf; + + return KErrNone; + } + +TInt CTestProxyDrive::SetEvent(TInt aType, TInt aValue) + { + __PRINT(_L("CTestProxyDrive::SetEvent")); + + switch (aType) + { + case ENone: + break; + case ENext: + iEventType = aType; + break; + case ERandom: + Mark((TInt)(Math::Random() / (TReal64)KMaxTUint) * iTotalSectors); + break; + case EDeterministic: + iEventType = aType; + if (aValue <= 0) + return KErrArgument; + iCount = aValue; + break; + default: + return KErrArgument; + } + return KErrNone; + } + + +/** + mark aSector as a bad sector by adding it to the bad sectors map + @param aSector sector number to mark as bad +*/ +TInt CTestProxyDrive::Mark(TInt aSector) + { + __PRINT1(_L("CTestProxyDrive::Mark %d"), aSector); + + if (aSector >= iTotalSectors) + return KErrNone; + if (aSector < 0) + return KErrArgument; + iMap[aSector>>3] = (TUint8)(iMap[aSector>>3] | (1<<(aSector & 7))); + return KErrNone; + } + +TInt CTestProxyDrive::Unmark(TInt aSector) +// +// Remove bad cluster aValue from list. +// + { + __PRINT1(_L("CTestProxyDrive::Unmark %d"), aSector); + + if (aSector>=iTotalSectors || aSector<0) + return KErrArgument; + iMap[aSector>>3] = (TUint8)(iMap[aSector>>3] & ~(1<<(aSector & 7))); + return KErrNone; + } + +TInt CTestProxyDrive::UnmarkAll() +// +// Clear all bad cluster marks. +// + { + __PRINT(_L("CTestProxyDrive::UnmarkAll")); + + Mem::FillZ(iMap, (iTotalSectors+7)>>3); + return KErrNone; + } + +TBool CTestProxyDrive::IsMarked(TInt aSector) const +// +// Check if cluster number is in bad cluster list. +// + { + + + if (aSector>=iTotalSectors || aSector<0) + return EFalse; + + const TBool bMarked = iMap[aSector>>3] & (1<<(aSector & 7)); + if(bMarked) + { + __PRINT1(_L("CTestProxyDrive::IsMarked %d"), aSector); + } + + return bMarked ; + } + +TBool CTestProxyDrive::CheckEvent(TInt64 aPos, TInt aLength) + { + //__PRINT(_L("CTestProxyDrive::CheckEvent")); + + if (!iMountInitialised) + return EFalse; + + return DoCheckEvent(aPos, aLength); + }