diff -r a179b74831c9 -r c1f20ce4abcf kerneltest/e32test/pccd/t_medch.cpp --- a/kerneltest/e32test/pccd/t_medch.cpp Thu Aug 19 11:14:22 2010 +0300 +++ b/kerneltest/e32test/pccd/t_medch.cpp Tue Aug 31 16:34:26 2010 +0300 @@ -50,6 +50,9 @@ const TInt KPowerUpTimeOut = 5000000; // Give the card 5 seconds to power up +const TUint KDriveAttMask = KDriveAttLocal | KDriveAttRom | KDriveAttRemote; +const TUint KMediaAttMask = KMediaAttVariableSize | KMediaAttDualDensity | KMediaAttLockable | KMediaAttLocked | KMediaAttHasPassword | KMediaAttReadWhileWrite; + LOCAL_D RTest test(_L("Media change test")); LOCAL_D TBusLocalDrive TheDrive; @@ -57,6 +60,129 @@ LOCAL_D TRequestStatus TheMediaStatus; LOCAL_D TBool TheChangedFlag; +LOCAL_C TInt FindDataPagingDrive() +/** +Find the drive containing the swap partition. + +@return Local drive identifier or KErrNotFound if not found +*/ + { + TInt drive = KErrNotFound; + + RLocalDrive d; + TBool change = EFalse; + TLocalDriveCapsV5 driveCaps; + TPckg capsPack(driveCaps); + + for(TInt i = 0; i < KMaxLocalDrives && drive < 0; ++i) + { + if(d.Connect(i, change) == KErrNone) + { + if(d.Caps(capsPack) == KErrNone) + { + if ((driveCaps.iMediaAtt & KMediaAttPageable) && + (driveCaps.iPartitionType == KPartitionTypePagedData)) + { + drive = i; + } + } + d.Close(); + } + } + + if(drive == KErrNotFound) + { + test.Printf(_L("No data paging drive found\n")); + } + + return drive; + } + +LOCAL_C TInt DataPagingMediaCaps(TLocalDriveCapsV5 &aCaps) +/** +Return the caps of the media containing a swap partition. + +@return Error code, on success aCaps contains the capabilities of the paging drive +*/ + { + TInt dataPagingDrive = FindDataPagingDrive(); + + if (dataPagingDrive == KErrNotFound) + { + return KErrNotFound; + } + + RLocalDrive dpDrive; + TBool change = EFalse; + + TInt r = dpDrive.Connect(dataPagingDrive, change); + test(r == KErrNone); + + TLocalDriveCapsV5 dpDriveCaps; + TPckg capsPack(dpDriveCaps); + r = dpDrive.Caps(capsPack); + test(r == KErrNone); + + if((dpDriveCaps.iDriveAtt & KDriveAttHidden) == 0) + { + test.Printf(_L("Paging partition is not hidden! Assuming it is correct anyway!\n")); + } + + aCaps = dpDriveCaps; + + return KErrNone; + } + +LOCAL_C TBool IsDriveOnPagingMedia(TInt aDrive, TLocalDriveCapsV5 &aPagingMediaCaps) +/** +Determines whether a drive is on the same media as the paging media by comparing +media characteristics + +@return ETrue if (likely) to be on the same media, EFalse if not. +*/ { + RLocalDrive drive; + TBool change = EFalse; + + TInt r = drive.Connect(aDrive, change); + test(r == KErrNone); + + TLocalDriveCapsV5 driveCaps; + TPckg capsPack(driveCaps); + r = drive.Caps(capsPack); + test(r == KErrNone); + + // Check media serial number + if(aPagingMediaCaps.iSerialNumLength > 0) + { + if((driveCaps.iSerialNumLength > 0) && + ((memcompare(driveCaps.iSerialNum, driveCaps.iSerialNumLength, + aPagingMediaCaps.iSerialNum, aPagingMediaCaps.iSerialNumLength)) == 0)) + { + // serial numbers equal, so drive in question is on same media as paging drive + test.Printf(_L("Based on serial number match, drive %d shares the same media as paging drive\n"), aDrive); + return ETrue; + } + } + else + { + // Turn off bits which may be different + aPagingMediaCaps.iDriveAtt &= KDriveAttMask; + aPagingMediaCaps.iMediaAtt &= KMediaAttMask; + driveCaps.iDriveAtt &= KDriveAttMask; + driveCaps.iMediaAtt &= KMediaAttMask; + + if ((driveCaps.iType == aPagingMediaCaps.iType) && + (driveCaps.iDriveAtt == aPagingMediaCaps.iDriveAtt) && + (driveCaps.iMediaAtt == aPagingMediaCaps.iMediaAtt)) + { + test.Printf(_L("Based on media characteristics match, drive %d shares the same media as paging drive\n"), aDrive); + return ETrue; + } + } + + return EFalse; + } + LOCAL_C TBool SetupDrivesForPlatform(TInt& aDrive, TInt& aSocket) /** @@ -75,11 +201,30 @@ aDrive = -1; aSocket = -1; + TLocalDriveCapsV5 pagingMediaCaps; + TBool pagingMediaCheck = EFalse; + if(DataPagingMediaCaps(pagingMediaCaps) == KErrNone) + { + pagingMediaCheck = ETrue; + } + for(aDrive=0; aDrive < di.iTotalSupportedDrives; aDrive++) { test.Printf(_L(" Drive %d - %S\r\n"), aDrive, &di.iDriveName[aDrive]); if(di.iDriveName[aDrive].MatchF(_L("MultiMediaCard0")) == KErrNone) - break; + { + if(pagingMediaCheck) + { + if( ! IsDriveOnPagingMedia(aDrive, pagingMediaCaps)) + { + break; + } + } + else + { + break; + } + } } if(aDrive == di.iTotalSupportedDrives) @@ -172,14 +317,14 @@ */ { test.Console()->SetPos(20, 25); - test.Printf(_L("%S [%d cycles]"), &aTitle, aCycles); + test.Printf(_L("%S [%d cycles]\n"), &aTitle, aCycles); #ifdef __MANUAL_TEST__ test.Console()->SetPos(20, 27); - test.Printf(_L("")); + test.Printf(_L("\n")); test.Getch(); #endif } - + GLDEF_C TInt E32Main() /** * Test Entry Point for T_MEDCH. @@ -213,6 +358,7 @@ */ TInt drive; TInt socket; + if(SetupDrivesForPlatform(drive, socket)) { b.Format(_L("Connect to local drive %d"), drive);