diff -r 000000000000 -r a41df078684a kerneltest/f32test/fileutils/src/t_chlffs.cpp --- /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 +#include +#include +#include + +// 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 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