diff -r f6d3d9676ee4 -r d63d727ee0a6 userlibandfileserver/fileserver/sfat/sl_mnt16.cpp --- a/userlibandfileserver/fileserver/sfat/sl_mnt16.cpp Tue Dec 08 08:11:42 2009 +0100 +++ b/userlibandfileserver/fileserver/sfat/sl_mnt16.cpp Mon Jan 04 12:25:19 2010 +0100 @@ -20,6 +20,15 @@ @file */ +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//!! +//!! WARNING!! DO NOT edit this file !! '\sfat' component is obsolete and is not being used. '\sfat32'replaces it +//!! +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + #include "sl_std.h" #include "sl_cache.h" #include "sl_leafdir_cache.h" @@ -82,14 +91,14 @@ { __PRINT2(_L("CFatMountCB::DoReadBootSector() failed! drv:%d, code:%d"),Drive().DriveNumber(),r); - //-- fiddling with the error code; taken from MountL() + //-- fiddling with the error code; taken from MountL() if (r==KErrNotSupported) - return KErrNotReady; + return KErrNotReady; #if defined(_LOCKABLE_MEDIA) - else if(r==KErrLocked) - return KErrLocked; + else if(r==KErrLocked) + return KErrLocked; #endif - else if (r!=KErrNoMemory && r!=KErrNotReady && r!=KErrCorrupt && r!=KErrUnknown) + else if (r!=KErrNoMemory && r!=KErrNotReady && r!=KErrCorrupt && r!=KErrUnknown) return KErrCorrupt; return r; @@ -157,18 +166,18 @@ @leave */ void CFatMountCB::WriteVolumeLabelL(const TDesC8& aVolumeLabel) const - { + { if(aVolumeLabel.Length() > KVolumeLabelSize) User::Leave(KErrArgument); - User::LeaveIfError(LocalDrive()->Write(KFat16VolumeLabelPos,aVolumeLabel)); + User::LeaveIfError(LocalDrive()->Write(KFat16VolumeLabelPos,aVolumeLabel)); } //------------------------------------------------------------------------------------------------------------------- -const TUint16 KFat16CleanShutDownMask = 0x08000; ///< Mask used to indicate test clean/dirty bit for Fat16 +const TUint16 KFat16CleanShutDownMask = 0x08000; ///< Mask used to indicate test clean/dirty bit for Fat16 /** Set or reset "VolumeClean" (ClnShutBitmask) flag. @@ -178,7 +187,7 @@ */ void CFatMountCB::SetVolumeCleanL(TBool aClean) { - //-- The volume can't be set clean if there are objects opened on it. This precondition must be checked before calling this function + //-- The volume can't be set clean if there are objects opened on it. This precondition must be checked before calling this function if(aClean && LockStatus()!=0) { __PRINT1(_L("#- CFatMountCB::SetVolumeCleanL drive:%d isn't free!"),DriveNumber()); @@ -189,9 +198,9 @@ if(FatType() == EFat12) {//-- Fat12 doesn't support this feature; do nothing other than notify the underlying drive - // (ignoring any error for now as there's nothing we can do with it) - (void)LocalDrive()->Finalise(aClean); - return; + // (ignoring any error for now as there's nothing we can do with it) + (void)LocalDrive()->Finalise(aClean); + return; } //-- further read and write will be directly from the CProxyDrive, bypassing FAT cache. @@ -225,10 +234,10 @@ User::LeaveIfError(LocalDrive()->Write(pos, ptrFatEntry)); //write FAT16[1] entry } } - - //-- Notify the underlying media that the mount is consistent - // (ignoring any error for now as there's nothing we can do with it) - (void)LocalDrive()->Finalise(aClean); + + //-- Notify the underlying media that the mount is consistent + // (ignoring any error for now as there's nothing we can do with it) + (void)LocalDrive()->Finalise(aClean); __PRINT2(_L("#- CFatMountCB::SetVolumeCleanL() entry: %x->%x"), tmp, fatEntry); @@ -284,7 +293,7 @@ @leave KErrNoMemory,KErrNotReady,KErrCorrupt,KErrUnknown. */ void CFatMountCB::MountL(TBool aForceMount) - { + { const TInt driveNo = Drive().DriveNumber(); __PRINT2(_L("CFatMountCB::MountL() drv:%d, forceMount=%d\n"),driveNo,aForceMount); @@ -294,7 +303,7 @@ SetReadOnly(EFalse); - User::LeaveIfError(CreateDrive(Drive().DriveNumber())); + User::LeaveIfError(CreateDrive(Drive().DriveNumber())); //-- read FAT configuration parameters from estart.txt iFatConfig.ReadConfig(driveNo); @@ -304,23 +313,23 @@ if(!iDriverInterface.Init(this)) User::LeaveIfError(KErrNoMemory); - //-- get drive capabilities + //-- get drive capabilities TLocalDriveCapsV2Buf capsBuf; - User::LeaveIfError(LocalDrive()->Caps(capsBuf)); - + User::LeaveIfError(LocalDrive()->Caps(capsBuf)); + iSize=capsBuf().iSize; iRamDrive = EFalse; if(capsBuf().iMediaAtt & KMediaAttVariableSize) {//-- this is a RAM drive - UserSvr::UnlockRamDrive(); + UserSvr::UnlockRamDrive(); iRamDrive = ETrue; - } + } - if(aForceMount) - {//-- the state is "forcedly mounted", special case. This is an inconsistent state. + if(aForceMount) + {//-- the state is "forcedly mounted", special case. This is an inconsistent state. SetState(EInit_Forced); - return; + return; } //-- read and validate boot sector (sector 0) @@ -330,7 +339,7 @@ //-- print out boot sector debug information bootSector.PrintDebugInfo(); - //-- determine FAT type by data from boot sector. This is done by counting number of clusters, not by BPB_RootEntCnt + //-- determine FAT type by data from boot sector. This is done by counting number of clusters, not by BPB_RootEntCnt iFatType=bootSector.FatType(); ASSERT(iFatType != EInvalid); //-- this shall be checked in ReadBootSector() @@ -347,8 +356,8 @@ GetVolumeLabelFromDiskL(bootSector); - __PRINT2(_L("CFatMountCB::MountL() Completed, drv: %d, state:%d"), DriveNumber(), State()); - } + __PRINT2(_L("CFatMountCB::MountL() Completed, drv: %d, state:%d"), DriveNumber(), State()); + } @@ -361,28 +370,28 @@ @leave KErrNoMemory,KErrNotReady,KErrCorrupt,KErrUnknown. */ void CFatMountCB::InitializeL(const TLocalDriveCaps& aLocDrvCaps, TBool /*aIgnoreFSInfo=EFalse*/) - { + { __PRINT1(_L("CFatMountCB::InitializeL() drv:%d"), DriveNumber()); ASSERT(State() == EMounting); //-- we must get here only from MountL() //========== Find out number of clusters on the volume - if(iRamDrive && SectorsPerCluster()!=1) - {// Align iFirstFreeByte to cluster boundary if internal ram drive - const TInt sectorsPerClusterLog2=ClusterSizeLog2()-SectorSizeLog2(); - const TInt rootDirEndSector=RootDirEnd()>>SectorSizeLog2(); - const TInt alignedSector=((rootDirEndSector+SectorsPerCluster()-1)>>sectorsPerClusterLog2)<>SectorSizeLog2(); + const TInt alignedSector=((rootDirEndSector+SectorsPerCluster()-1)>>sectorsPerClusterLog2)<>SectorSizeLog2()); - iUsableClusters=usableSectors>>(ClusterSizeLog2()-SectorSizeLog2()); + {//-- check if volume geometry looks valid + const TInt usableSectors=TotalSectors()-(iFirstFreeByte>>SectorSizeLog2()); + iUsableClusters=usableSectors>>(ClusterSizeLog2()-SectorSizeLog2()); const TUint32 KMinClusters = 32; //-- absolute minimum number of clusters on the volume const TUint32 KMaxClusters =(TotalSectors()-FirstFatSector()-NumberOfFats()*(FatSizeInBytes()>>SectorSizeLog2())) >> (ClusterSizeLog2()-SectorSizeLog2()); @@ -395,30 +404,30 @@ } - //========== initialise RawDisk interface - //-- CFatMountCB parameters might have changed, e.g. after formatting. Reconstruct directory cache with new parameters - + //========== initialise RawDisk interface + //-- CFatMountCB parameters might have changed, e.g. after formatting. Reconstruct directory cache with new parameters + delete iRawDisk; - iRawDisk=CRawDisk::NewL(*this, aLocDrvCaps); + iRawDisk=CRawDisk::NewL(*this, aLocDrvCaps); iRawDisk->InitializeL(); //========== create FAT table object - delete iFatTable; - iFatTable=CFatTable::NewL(*this, aLocDrvCaps); + delete iFatTable; + iFatTable=CFatTable::NewL(*this, aLocDrvCaps); //========== create and setup leaf direcotry cache if cache limit is set bigger than one - const TUint32 cacheLimit = iFatConfig.LeafDirCacheSize(); - if (cacheLimit > 1) - { - // destroy the old leaf dir cache to avoid memory leak. - delete iLeafDirCache; - iLeafDirCache = CLeafDirCache::NewL(cacheLimit); - } - else - { - iLeafDirCache = NULL; - } + const TUint32 cacheLimit = iFatConfig.LeafDirCacheSize(); + if (cacheLimit > 1) + { + // destroy the old leaf dir cache to avoid memory leak. + delete iLeafDirCache; + iLeafDirCache = CLeafDirCache::NewL(cacheLimit); + } + else + { + iLeafDirCache = NULL; + } //========== find out free clusters number on the volume FAT().CountFreeClustersL(); @@ -430,7 +439,7 @@ SetDiskSpaceChange(freeSpace); __PRINT3(_L("#- CFatMountCB::InitializeL() done. drv:%d, Free clusters:%d, 1st Free cluster:%d"),DriveNumber(), FAT().NumberOfFreeClusters(), FAT().FreeClusterHint()); - } + } //------------------------------------------------------------------------------------------------------------------- @@ -443,12 +452,12 @@ @return Result of test */ TBool CFatMountCB::IsEndOfClusterCh(TInt aCluster) const - { - if(Is16BitFat()) - return(aCluster>=0xFFF8 && aCluster<=0xFFFF); - else - return(aCluster>=0xFF8 && aCluster<=0xFFF); - } + { + if(Is16BitFat()) + return(aCluster>=0xFFF8 && aCluster<=0xFFFF); + else + return(aCluster>=0xFF8 && aCluster<=0xFFF); + } /** Set a cluster to the end of cluster chain marker @@ -456,12 +465,12 @@ @param aCluster cluster to set to end of chain marker */ void CFatMountCB::SetEndOfClusterCh(TInt &aCluster) const - { - if(Is16BitFat()) - aCluster=0xFFF8; - else - aCluster=0xFF8; - } + { + if(Is16BitFat()) + aCluster=0xFFF8; + else + aCluster=0xFF8; + } /** Initialize data to represent the root directory @@ -469,11 +478,11 @@ @param anEntry Entry to initialise */ void CFatMountCB::InitializeRootEntry(TFatDirEntry & anEntry) const - { - anEntry.SetName(_L8("ROOT")); - anEntry.SetAttributes(KEntryAttDir); - anEntry.SetStartCluster(0); - } + { + anEntry.SetName(_L8("ROOT")); + anEntry.SetAttributes(KEntryAttDir); + anEntry.SetStartCluster(0); + } /** @@ -482,32 +491,32 @@ @param aName Name of the sub type of Fat file system @return KErrNone if successful; KErrArgument if aName is not long enough; KErrNotReady if - the mount is not ready. + the mount is not ready. @see CMountCB::FileSystemSubType() */ TInt CFatMountCB::SubType(TDes& aName) const - { - if(aName.MaxLength() < 5) - return KErrArgument; - - switch (iFatType) - { - case EFat12: - { - aName = KFSSubType_FAT12; - return KErrNone; - } - case EFat16: - { - aName = KFSSubType_FAT16; - return KErrNone; - } - default: - // case EInvalidFatType - return KErrNotReady; - } - } + { + if(aName.MaxLength() < 5) + return KErrArgument; + + switch (iFatType) + { + case EFat12: + { + aName = KFSSubType_FAT12; + return KErrNone; + } + case EFat16: + { + aName = KFSSubType_FAT16; + return KErrNone; + } + default: + // case EInvalidFatType + return KErrNotReady; + } + } //------------------------------------------------------------------------------------------------------------------- /** @@ -585,9 +594,9 @@ else return LocalDrive()->LocalBufferSupport(); - case EGetProxyDrive: - ((CProxyDrive*&)aInterface) = LocalDrive(); - return KErrNone; + case EGetProxyDrive: + ((CProxyDrive*&)aInterface) = LocalDrive(); + return KErrNone; default: return(CMountCB::GetInterface(aInterfaceId, aInterface, aInput));