kerneltest/f32test/ext/t_testext.cpp
changeset 0 a41df078684a
--- /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 <e32math.h>
+#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<TBool>(ETrue));
+            else
+                r = aMessage.Write(3, TPckgBuf<TBool>(EFalse));
+            break;
+        case EDiskSize:
+            r = aMessage.Write(2, TPckgBuf<TInt64>(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<TErrorInfo> 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);
+    }