--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/fileutils/src/t_chlffs.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,355 @@
+// Copyright (c) 1998-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\server\t_chlffs.cpp
+//
+//
+
+#define __E32TEST_EXTENSION__
+#include <f32file.h>
+#include <e32test.h>
+#include <e32hal.h>
+#include <hal.h>
+
+// Now non-t_main programs need to chk if they are running on lffs,
+#include "t_server.h"
+#include "t_chlffs.h"
+
+
+const TInt KInvalidDriveLetter=-1;
+
+LOCAL_D TInt LFFSdriveNumber=KInvalidDriveLetter;
+LOCAL_D TBool LFFSTesting=EFalse;
+_LIT(KLFFSName,"Lffs");
+
+
+LOCAL_C void FormatLFFS(RFs &anFsSession,TDes &aDrive)
+//
+// Format the LFFS drive
+//
+ {
+ RFormat format;
+ TInt count;
+ TInt r;
+
+ test.Printf(_L("Format LFFS drive %S\r\n"), &aDrive);
+ r=format.Open(anFsSession,aDrive,EHighDensity,count);
+ test.Printf(_L("Format open done. Count = %d\r\n"), count);
+ test(r==KErrNone);
+
+ while (count)
+ {
+ TInt r=format.Next(count);
+ test.Printf(_L("Format next done. Count = %d\r\n"), count);
+ test(r==KErrNone);
+ }
+
+ format.Close();
+ }
+
+GLDEF_C TBool IsFileSystemLFFS(RFs &aFsSession,TInt aDrive)
+//
+// return true if lffs on aDrive
+//
+ {
+ TFileName f;
+ TInt r=aFsSession.FileSystemName(f,aDrive);
+ test(r==KErrNone || r==KErrNotFound);
+ return (f.CompareF(KLFFSName)==0);
+ }
+
+GLDEF_C TInt CheckLFFSDriveForPlatform()
+//
+// Check the LFFS drive number for the current platform
+//
+ {
+ TInt lffsDrvNum;
+
+ TInt uid;
+ TInt r=HAL::Get(HAL::EMachineUid,uid);
+ test(r==KErrNone);
+
+ if (uid==HAL::EMachineUid_Brutus)
+ {
+ lffsDrvNum=EDriveK;
+ test.Printf(_L("Test is running on BRUTUS\r\n"));
+ }
+ else if (uid==HAL::EMachineUid_Win32Emulator)
+ {
+ lffsDrvNum=EDriveW;
+ test.Printf(_L("Test is running on WINS Pc\r\n"));
+ }
+ else if (uid == HAL::EMachineUid_Integrator)
+ {
+ lffsDrvNum=EDriveK;
+ test.Printf(_L("Test is running on INTEGRATOR\r\n"));
+ }
+ else if (uid == HAL::EMachineUid_Assabet)
+ {
+ lffsDrvNum=EDriveK;
+ test.Printf(_L("Test is running on Assabet\r\n"));
+ }
+ else
+ lffsDrvNum=KInvalidDriveLetter;
+ return(lffsDrvNum);
+ }
+
+GLDEF_C TBool CheckMountLFFS(RFs &anFsSession,TChar aDriveLetter)
+//
+// Check if test to be performed on LFFS drive. Mount the ELFFS.FSY if
+// necessary
+//
+ {
+
+ test.Next(_L("Check if LFFS drive (Mount LFFS if required)"));
+
+ TInt r,drvNum;
+ TBuf<4> lffsDriveLetter=_L("?:\\");
+
+ // first check if the lffs is mounted on the drive
+ r=anFsSession.CharToDrive(aDriveLetter,drvNum);
+ test(r==KErrNone);
+ if (IsFileSystemLFFS(anFsSession,drvNum))
+ {
+ lffsDriveLetter[0]=(TText)aDriveLetter;
+ test.Printf(_L("Testing an LFFS drive (%S)"), &lffsDriveLetter);
+ test.Printf(_L("LFFS already mounted on drive %S\r\n"), &lffsDriveLetter);
+ LFFSdriveNumber=drvNum;
+ LFFSTesting=ETrue;
+ return(ETrue);
+ }
+
+ // check if platform expects lffs to be mounted on specified drive
+ TInt lffsDrvNum=CheckLFFSDriveForPlatform();
+ if (drvNum!=lffsDrvNum)
+ {
+ test.Printf(_L("Not testing an LFFS drive\n"));
+ return(EFalse);
+ }
+
+ lffsDriveLetter[0]=(TText)aDriveLetter;
+ test.Printf(_L("Testing an LFFS drive (%S)"), &lffsDriveLetter);
+ LFFSdriveNumber=lffsDrvNum;
+ LFFSTesting=ETrue;
+
+ test.Next(_L("Load device driver: MEDLFS"));
+ r=User::LoadPhysicalDevice(_L("MEDLFS"));
+ test(r==KErrNone || r==KErrAlreadyExists);
+
+ test.Next(_L("Add file system: ELFFS"));
+ r=anFsSession.AddFileSystem(_L("ELFFS"));
+ test(r==KErrNone || r==KErrAlreadyExists);
+
+ TFullName name;
+ r=anFsSession.FileSystemName(name,LFFSdriveNumber);
+ test(r==KErrNone || r==KErrNotFound);
+
+ if (name.MatchF(_L("Lffs")) != 0)
+ {
+ // Some other file system is at the "Lffs" drive.
+ if (name.Length() != 0)
+ {
+ // Not allowed to dismount the file system from the drive associated
+ // with the default path - so temporarily change the default path.
+ test.Printf(_L("Dismounting %S on drive %S\r\n"), &name, &lffsDriveLetter);
+ r=anFsSession.DismountFileSystem(name,LFFSdriveNumber);
+ test(r==KErrNone);
+
+ }
+
+ test.Printf(_L("Mount LFFS on drive %S\r\n"),&lffsDriveLetter);
+ r=anFsSession.MountFileSystem(_L("Lffs"), LFFSdriveNumber);
+ test.Printf(_L(" Mount result %d\r\n"), r);
+ test(r==KErrNone || r==KErrCorrupt || r==KErrNotReady);
+
+ if (r==KErrCorrupt)
+ {
+ test.Printf(_L("The volume was corrupt. Formatting...\r\n"));
+ FormatLFFS(anFsSession,lffsDriveLetter);
+ }
+ else if(r==KErrNotReady)
+ {
+ test.Printf(_L("The mount was not ready. Formatting...\r\n"));
+ FormatLFFS(anFsSession,lffsDriveLetter);
+ }
+ else
+ {
+ test.Printf(_L("The volume was mounted OK. Formatting...\r\n"));
+ FormatLFFS(anFsSession,lffsDriveLetter); // ???
+ }
+ }
+ else
+ {
+ test.Printf(_L("LFFS already mounted on drive %S\r\n"), &lffsDriveLetter);
+ }
+
+ return(ETrue);
+ }
+
+GLDEF_C TBool IsTestingLFFS()
+//
+// Return ETrue if testing LFFS
+//
+ {
+ return(LFFSTesting);
+ }
+
+GLDEF_C void TestingLFFS(TBool aSetting)
+//
+// Set whether testing LFFS or not
+//
+ {
+ LFFSTesting=aSetting;
+ }
+
+GLDEF_C TInt GetDriveLFFS()
+//
+// Return the LFFS drive number
+//
+ {
+ return(LFFSdriveNumber);
+ }
+
+GLDEF_C TBool IsSessionDriveLFFS(RFs& aFs,TChar& aDriveLetter)
+ {
+//
+// Quick method of testing if session drive is LFFS
+//
+ TBool isLffs;
+ TFileName path;
+ TInt r=aFs.SessionPath(path);
+ test(r==KErrNone);
+ TInt drv;
+ r=RFs::CharToDrive(path[0],drv);
+ test(r==KErrNone);
+
+ aDriveLetter=path[0];
+ isLffs=IsFileSystemLFFS(aFs,drv);
+ if(isLffs)
+ return(ETrue);
+
+ // check if platform expects lffs to be mounted on default drive
+ TInt lffsDrv = CheckLFFSDriveForPlatform();
+ if (lffsDrv == KInvalidDriveLetter)
+ {
+ test.Printf(_L("IsSessionDriveLFFS: platform does not support lffs.\r\n"));
+ isLffs = EFalse;
+ }
+ else
+ {
+ TChar curCh=path[0];
+ curCh.LowerCase();
+
+ TChar lffsCh; // lffs drv ltr
+ test((r = RFs::DriveToChar(lffsDrv, lffsCh)) == KErrNone);
+ lffsCh.LowerCase();
+
+ test.Printf(_L("IsSessionDriveLFFS: cur drv = \'%c\', lffs drv = \'%c\'.\n"), (TText) curCh, (TText) lffsCh);
+ isLffs = ((TText) curCh) == ((TText) lffsCh);
+ }
+
+ return(isLffs);
+ }
+
+GLDEF_C TBool IsDefaultDriveLFFS()
+//
+// Quick method of testing if running on LFFS for non t_main based tests.
+//
+ {
+ // check if lffs mounted on default drive
+ TBool isLffs;
+ RFs fs;
+ TInt r=fs.Connect();
+ test(r==KErrNone);
+ TFileName path;
+ r=fs.SessionPath(path);
+ test(r==KErrNone);
+ TInt drv;
+ r=TheFs.CharToDrive(path[0],drv);
+ test(r==KErrNone);
+
+ isLffs=IsFileSystemLFFS(fs,drv);
+ fs.Close();
+ if(isLffs)
+ return(ETrue);
+
+ // check if platform expects lffs to be mounted on default drive
+ TInt lffsDrv = CheckLFFSDriveForPlatform();
+ if (lffsDrv == KInvalidDriveLetter)
+ {
+ test.Printf(_L("IsCurrentDriveLFFS: platform does not support lffs.\r\n"));
+ isLffs = EFalse;
+ }
+ else
+ {
+ TChar curCh=path[0];
+ curCh.LowerCase();
+
+ TChar lffsCh; // lffs drv ltr
+ test((r = RFs::DriveToChar(lffsDrv, lffsCh)) == KErrNone);
+ lffsCh.LowerCase();
+
+ test.Printf(_L("IsCurrentDriveLFFS: cur drv = \'%c\', lffs drv = \'%c\'.\n"), (TText) curCh, (TText) lffsCh);
+ isLffs = ((TText) curCh) == ((TText) lffsCh);
+ }
+
+ return(isLffs);
+ }
+
+GLDEF_C TBool IsNamedDriveLFFS(RFs &aFsSession,TText aDrv)
+//
+// Quick method of testing if running on LFFS for non t_main based tests.
+//
+ {
+ TInt d;
+ TInt r=RFs::CharToDrive(aDrv,d);
+ test(r==KErrNone);
+ return(IsFileSystemLFFS(aFsSession,d));
+ }
+
+GLDEF_C TInt GetLFFSControlModeSize()
+//
+// For LFFS, the media may not exhibit a contiguous data region. This is the case if the
+// Control Mode Size is non-zero.
+//
+ {
+ TLocalDriveCapsV7 caps; // V7 to allow for devices exhibiting Control Mode
+ TPckg<TLocalDriveCapsV7> capsPckg(caps);
+ TBusLocalDrive localDrive;
+ TBool lffsMediaFound = EFalse;
+ TBool dumBool = EFalse; // Arbitrary if LFFS is mounted on non-removable media
+ // Loop to find the local drive for LFFS - this is always of type EMediaFlash
+ for(TInt drvNum=0; drvNum<KMaxLocalDrives; drvNum++)
+ {
+ TInt r=localDrive.Connect(drvNum,dumBool);
+ if(r==KErrNotSupported)
+ continue; // Local drive not present
+ test_KErrNone(r);
+ r=localDrive.Caps(capsPckg);
+ localDrive.Disconnect();
+ if(r==KErrNotSupported||r==KErrNotReady)
+ continue; // Local drive not available
+ test_KErrNone(r);
+ if(capsPckg().iType==EMediaFlash)
+ {
+ lffsMediaFound=ETrue;
+ break;
+ }
+ }
+ if(!lffsMediaFound)
+ {
+ test.Printf(_L("GetLFFSControlModeSize: LFFS media not found !\n"));
+ return KErrGeneral;
+ }
+ return (capsPckg().iControlModeSize);
+ }