--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/mediaext/t_nfe.cpp Fri May 14 17:13:29 2010 +0300
@@ -0,0 +1,406 @@
+// Copyright (c) 1995-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:
+// e32test\mediext\t_nfe.cpp
+//
+//
+
+#define __E32TEST_EXTENSION__
+
+#include <e32test.h>
+#include <f32file.h>
+
+
+RTest test(_L("t_nfe"));
+
+#include <d32locd.h>
+#include <e32property.h>
+#include "nfe.h"
+
+
+TBusLocalDrive Drive;
+TBool TheWaitFlag = EFalse; // wait for drive to be encrypted before exiting test
+TBool TheFinaliseDriveFlag = EFalse;
+TBool TheDisplayStatusFlag = EFalse; // display drive status and then exit (i.e. don't encrypt)
+TBool TheEncryptDriveFlag = ETrue;
+
+TInt FindNfeDrive(TInt aDriveNum)
+/**
+Find the next NFE drive
+
+@return Local drive identifier.
+*/
+ {
+ TInt drive = KErrNotFound;
+
+// test.Printf(_L("Searching for NFE drive:\n"));
+
+ for (TInt i = aDriveNum; i < KMaxLocalDrives && drive < 0; ++i)
+ {
+ RLocalDrive d;
+ TBool change = EFalse;
+
+ if(d.Connect(i, change) == KErrNone)
+ {
+// test.Printf(_L("Connected to local drive %d\n"), i);
+ TLocalDriveCapsV4 dc;
+ TPckg<TLocalDriveCapsV4> capsPack(dc);
+ capsPack.FillZ();
+
+ if(d.Caps(capsPack) != KErrNone)
+ continue;
+ if (dc.iType == EMediaNANDFlash || dc.iType == EMediaHardDisk)
+ {
+ TNfeDeviceInfo nfeDeviceInfo;
+ TPtr8 nfeDeviceInfoBuf((TUint8*) &nfeDeviceInfo, sizeof(nfeDeviceInfo));
+ nfeDeviceInfoBuf.FillZ();
+
+ TInt r = d.QueryDevice((RLocalDrive::TQueryDevice) EQueryNfeDeviceInfo, nfeDeviceInfoBuf);
+
+// test.Printf(_L("EQueryNfeDeviceInfo on local drive %d returned %d\n"), i, r);
+ if (r == KErrNone)
+ {
+ test.Printf(_L("\nFound NFE on local drive %d\n"), i);
+ drive = i;
+ }
+ }
+ d.Close();
+ }
+ }
+ return drive;
+ }
+
+
+
+const TDesC* DriveStatus(TNfeDiskStatus aStatus)
+ {
+ _LIT(KNfeUnmounted, "Unmounted");
+ _LIT(KNfeDecrypted, "Decrypted");
+ _LIT(KNfeDecrypting, "Decrypting");
+ _LIT(KNfeEncrypted, "Encrypted");
+ _LIT(KNfeEncrypting, "Encrypting");
+ _LIT(KNfeWiping, "Wiping");
+ _LIT(KNfeCorrupted, "Corrupted");
+ _LIT(KNfeUnrecognised, "Unrecognised");
+
+ switch(aStatus)
+ {
+ case ENfeUnmounted:
+ return &KNfeUnmounted;
+ case ENfeDecrypted:
+ return &KNfeDecrypted;
+ case ENfeDecrypting:
+ return &KNfeDecrypting;
+ case ENfeEncrypted:
+ return &KNfeEncrypted;
+ case ENfeEncrypting:
+ return &KNfeEncrypting;
+ case ENfeWiping:
+ return &KNfeWiping;
+ case ENfeCorrupted:
+ return &KNfeCorrupted;
+ default:
+ return &KNfeUnrecognised;
+
+ }
+ }
+
+TInt DriveStatus(TInt aNfeDrive, TNfeDiskStatus& aStatus, TInt &aProgress)
+ {
+ TInt r = RProperty::Get(
+ KNfeUID,
+ NFE_KEY(aNfeDrive, KNfeStatusToUiKey),
+ *(TInt*) &aStatus);
+ if (r != KErrNone)
+ return r;
+ r = RProperty::Get(
+ KNfeUID,
+ NFE_KEY(aNfeDrive, KNfeProgressToUiKey),
+ *(TInt*) &aProgress);
+ return r;
+ }
+
+void DisplayNfeDeviceInfo(TInt aNfeDrive, TNfeDeviceInfo& aDeviceInfo)
+ {
+ test.Printf(_L("Stats: \n"));
+
+ RLocalDrive d;
+ TBool change = EFalse;
+ TInt r = d.Connect(aNfeDrive, change);
+ test (r == KErrNone);
+
+ TPtr8 nfeDeviceInfoBuf((TUint8*) &aDeviceInfo, sizeof(aDeviceInfo));
+ nfeDeviceInfoBuf.FillZ();
+ r = d.QueryDevice((RLocalDrive::TQueryDevice) EQueryNfeDeviceInfo, nfeDeviceInfoBuf);
+ test (r == KErrNone || r == KErrNotSupported);
+
+ d.Close();
+
+ test.Printf(_L("iDriveCount %d\n"), aDeviceInfo.iDriveCount);
+ test.Printf(_L("iMediaSizeInBytes %lx\n"), aDeviceInfo.iMediaSizeInBytes);
+
+ for (TInt i=0; i<aDeviceInfo.iDriveCount; i++)
+ {
+ TNfeDriveInfo& di = aDeviceInfo.iDrives[i];
+
+ test.Printf(_L("*** drive index %d ***\n"), i);
+ test.Printf(_L("iLocalDriveNum %x\n"), di.iLocalDriveNum);
+ test.Printf(_L("iDriveLetter %c\n"), di.iDriveLetter >= 0 && di.iDriveLetter <= 25 ? di.iDriveLetter +'A' : '?');
+ test.Printf(_L("iState %d\n"), di.Status());
+
+ test.Printf(_L("State = %S\n"), DriveStatus(di.Status()));
+
+ test.Printf(_L("iEncryptStartPos %lx\n"), di.iEncryptStartPos);
+ test.Printf(_L("iEncryptEndPos %lx\n"), di.iEncryptEndPos);
+ test.Printf(_L("iPartitionBaseAddr %lx\n"), di.iEntry.iPartitionBaseAddr);
+ test.Printf(_L("iPartitionLen %lx\n"), di.iEntry.iPartitionLen);
+ test.Printf(_L("iPartitionType %x\n"), di.iEntry.iPartitionType);
+
+ test.Printf(_L("iReadRequestCount %d\n"), di.iReadRequestCount);
+ test.Printf(_L("iWriteRequestCount %d\n"), di.iWriteRequestCount);
+ test.Printf(_L("iCodePagingRequesCount %d\n"), di.iCodePagingRequesCount);
+ test.Printf(_L("iDataPagingReadRequestCount %d\n"), di.iDataPagingReadRequestCount);
+ test.Printf(_L("iDataPagingWriteRequestCount %d\n"), di.iDataPagingWriteRequestCount);
+ test.Printf(_L("iUniqueID %08X\n"), di.iUniqueID);
+ }
+ }
+
+void EncryptDrive(TInt aNfeDrive)
+ {
+ // subscribe to cmd acknowledgement property - KNfeToUiKey
+ RProperty propToUi;
+ test.Printf(_L("Attaching ToUi property"));
+ TInt r = propToUi.Attach(KNfeUID,NFE_KEY(aNfeDrive,KNfeToUiKey));
+ test.Printf(_L("Attaching returned %d"), r);
+ if (r != KErrNone)
+ return;
+
+
+ TRequestStatus status;
+ propToUi.Subscribe( status );
+
+
+ // Issue command
+ test.Printf(_L("Encrypting drive %c...\n"), aNfeDrive+'A');
+ r = RProperty::Set(
+ KNfeUID,
+ NFE_KEY(aNfeDrive, KNfeToThreadKey),
+ ENfeEncryptDisk);
+ test.Printf(_L("Encrypting drive %c, r %d\n"), aNfeDrive+'A', r);
+ test (r == KErrNone);
+
+ // wait for ack
+ User::WaitForRequest( status );
+ r = status.Int();
+ test.Printf(_L("cmd status %d"), r);
+ test (r == KErrNone);
+ }
+
+void DecryptDrive(TInt aNfeDrive)
+ {
+ // subscribe to cmd acknowledgement property - KNfeToUiKey
+ RProperty propToUi;
+ test.Printf(_L("Attaching ToUi property"));
+ TInt r = propToUi.Attach(KNfeUID,NFE_KEY(aNfeDrive,KNfeToUiKey));
+ test.Printf(_L("Attaching returned %d"), r);
+ if (r != KErrNone)
+ return;
+
+
+ TRequestStatus status;
+ propToUi.Subscribe( status );
+
+
+ // Issue command
+ test.Printf(_L("Decrypting drive %c...\n"), aNfeDrive+'A');
+ r = RProperty::Set(
+ KNfeUID,
+ NFE_KEY(aNfeDrive, KNfeToThreadKey),
+ ENfeDecryptDisk);
+ test.Printf(_L("Decrypting drive %c, r %d\n"), aNfeDrive+'A', r);
+ test (r == KErrNone);
+
+ // wait for ack
+ User::WaitForRequest( status );
+ r = status.Int();
+ test.Printf(_L("cmd status %d"), r);
+ test (r == KErrNone);
+ }
+
+void WaitForFinish(TInt aNfeDrive, TBool aEncrypt)
+ {
+ TNfeDiskStatus diskStatus = ENfeCorrupted;
+ TInt progress = 0;
+
+ TInt r = DriveStatus(aNfeDrive, diskStatus, progress);
+ test (r == KErrNone);
+
+ // Poll progress status.
+ while (diskStatus != (aEncrypt ? ENfeEncrypted : ENfeDecrypted ))
+ {
+ r = DriveStatus(aNfeDrive, diskStatus, progress);
+ test (r == KErrNone);
+ test.Printf(_L("Drive %c, r %d progress %3u%% status %S\n"), aNfeDrive+'A', r, progress, DriveStatus((TNfeDiskStatus) diskStatus));
+
+
+ if (TheFinaliseDriveFlag && progress > 10)
+ {
+ TheFinaliseDriveFlag = EFalse;
+ RFs fs;
+ TInt r = fs.Connect();
+ test_KErrNone(r);
+
+ r = fs.FinaliseDrive(aNfeDrive, RFs::EFinal_RW);
+ test_KErrNone(r);
+ return;
+ }
+
+ User::After( 1000 * 500 );
+ }
+ test.Printf( _L("\nFinished\n") );
+ }
+
+//
+// E32Main
+//
+
+TInt ParseCommandArguments()
+ {
+ TInt tokenCount = 0;
+ TChar driveToTest = 'C';;
+
+ TBuf<0x100> cmd;
+ User::CommandLine(cmd);
+ TLex lex(cmd);
+
+ for (TPtrC token=lex.NextToken(); token.Length() != 0;token.Set(lex.NextToken()))
+ {
+ tokenCount++;
+ // Get the drive letter
+ if (tokenCount == 1)
+ {
+ TChar ch = token[0];
+ if (ch.IsAlpha())
+ {
+ if(token.Length() > 0)
+ {
+ driveToTest=token[0];
+ driveToTest.UpperCase();
+ }
+ }
+ RDebug::Print(_L("drive=%C"), (TUint) driveToTest);
+ continue;
+ }
+
+ else if (token.CompareF(_L("-d")) == 0)
+ {
+ TheEncryptDriveFlag = EFalse;
+ }
+ else if (token.CompareF(_L("-e")) == 0)
+ {
+ TheEncryptDriveFlag = ETrue;
+ }
+ else if (token.CompareF(_L("-f")) == 0)
+ {
+ TheFinaliseDriveFlag = ETrue;
+ }
+ else if (token.CompareF(_L("-w")) == 0)
+ {
+ TheWaitFlag = ETrue;
+ }
+ else if (token.CompareF(_L("-s")) == 0)
+ {
+ TheDisplayStatusFlag = ETrue;
+ }
+ }
+
+ return driveToTest;
+ }
+
+TInt E32Main()
+ {
+ test.Title();
+ test.Start(_L("NFE tests"));
+
+ RFs fs;
+
+ TInt r = fs.Connect();
+ test_KErrNone(r);
+
+ TChar driveToTest = ParseCommandArguments();
+
+ TInt drive;
+ r = fs.CharToDrive(driveToTest,drive);
+ test_KErrNone(r);
+
+
+ TVolumeInfo volumeInfo;
+ r = fs.Volume(volumeInfo, drive);
+ test(r == KErrNone);
+
+
+
+ TNfeDiskStatus diskStatus = ENfeCorrupted;
+ TInt progress = 0;
+
+ r = DriveStatus(drive, diskStatus, progress);
+ test.Printf(_L("drive %c diskStatus %S, progress %d r %d\n"), drive+'A', DriveStatus(diskStatus), progress, r);
+
+ if (TheDisplayStatusFlag)
+ {
+ test.Printf(_L("*** press any key ***"));
+ test.Getch();
+ test.End();
+ test.Close();
+ return 0;
+ }
+
+ if (r == KErrNone && diskStatus == ENfeDecrypted && TheEncryptDriveFlag)
+ {
+ test.Next(_L("Encrypting NFE drive"));
+ EncryptDrive(drive);
+ r = DriveStatus(drive, diskStatus, progress);
+ test.Printf(_L("drive %c diskStatus %S, progress %d r %d\n"), drive+'A', DriveStatus(diskStatus), progress, r);
+ }
+
+ if (r == KErrNone && diskStatus == ENfeEncrypted && !TheEncryptDriveFlag)
+ {
+ test.Next(_L("Decrypting NFE drive"));
+ DecryptDrive(drive);
+ r = DriveStatus(drive, diskStatus, progress);
+ test.Printf(_L("drive %c diskStatus %S, progress %d r %d\n"), drive+'A', DriveStatus(diskStatus), progress, r);
+ }
+
+
+ if (r == KErrNone && TheWaitFlag)
+ {
+ test.Next(_L("Waiting for finish"));
+ WaitForFinish(drive, TheEncryptDriveFlag);
+ }
+
+
+ for(TInt nfeDrive = FindNfeDrive(0); nfeDrive != KErrNotFound; nfeDrive = FindNfeDrive(++nfeDrive))
+ {
+ TNfeDeviceInfo deviceInfo;
+ DisplayNfeDeviceInfo(nfeDrive, deviceInfo);
+ }
+
+ fs.Close();
+
+ test.End();
+ test.Close();
+
+ return 0;
+ }
+
+