kerneltest/e32test/mediaext/t_nfe.cpp
branchRCL_3
changeset 42 a179b74831c9
child 43 c1f20ce4abcf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/mediaext/t_nfe.cpp	Thu Aug 19 11:14:22 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;
+	}
+
+