userlibandfileserver/fileserver/sfat/inc/sl_std.h
changeset 43 96e5fb8b040d
equal deleted inserted replaced
-1:000000000000 43:96e5fb8b040d
       
     1 // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // f32\sfat\inc\sl_std.h
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file
       
    20  @internalTechnology
       
    21 */
       
    22 
       
    23 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
    24 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
    25 //!!
       
    26 //!! WARNING!! DO NOT edit this file !! '\sfat' component is obsolete and is not being used. '\sfat32'replaces it
       
    27 //!!
       
    28 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
    29 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
    30 
       
    31 
       
    32 #ifndef SL_STD_H
       
    33 #define SL_STD_H
       
    34 
       
    35 //
       
    36 // #define _DEBUG_RELEASE
       
    37 //
       
    38 
       
    39 #include "common.h"
       
    40 #include <f32ver.h>
       
    41 #include <e32svr.h>
       
    42 #include <kernel/localise.h>
       
    43 #include "filesystem_fat.h"
       
    44 
       
    45 #include "common_constants.h"
       
    46 #include "sl_bpb.h"
       
    47 #include "fat_config.h"
       
    48 #include "fat_dir_entry.h"
       
    49 
       
    50 using namespace FileSystem_FAT;
       
    51 
       
    52 #ifdef _DEBUG
       
    53 _LIT(KThisFsyName,"EFAT.FSY"); ///< This FSY name
       
    54 #endif
       
    55 
       
    56 class CFatMountCB;
       
    57 class CFatFileSystem;
       
    58 
       
    59 /**
       
    60 Represents the position of a directory entery in terms of a cluster and off set into it
       
    61 */
       
    62 class TEntryPos
       
    63     {
       
    64 public:
       
    65     TEntryPos() {}
       
    66     TEntryPos(TInt aCluster,TUint aPos) : iCluster(aCluster), iPos(aPos) {}
       
    67 
       
    68     inline TUint32 Cluster() const;
       
    69     inline TUint32 Pos() const;
       
    70     inline TBool operator==(const TEntryPos& aRhs) const;
       
    71 
       
    72 public:
       
    73     TInt iCluster;
       
    74     TUint iPos;
       
    75     };
       
    76 
       
    77 
       
    78 /**
       
    79     Interface class between the file system and the local drive media interface,
       
    80     handles incomplete writes to media with the ability to notify the user.
       
    81     This class can't be instantinated by user; only CFatMountCB can do this; see CFatMountCB::DriveInterface()
       
    82 
       
    83 */
       
    84 class TFatDriveInterface
       
    85     {
       
    86 public:
       
    87     enum TAction {ERetry=1};
       
    88 
       
    89 public:
       
    90 
       
    91     //-- public interface to the local drive. Provides media driver's error handling (critical and non-critical user notifiers)
       
    92     //-- and thread-safety if required.
       
    93     TInt ReadNonCritical(TInt64 aPos,TInt aLength,const TAny* aTrg,const RMessagePtr2 &aMessage,TInt anOffset) const;
       
    94     TInt ReadNonCritical(TInt64 aPos,TInt aLength,TDes8& aTrg) const;
       
    95     TInt ReadCritical(TInt64 aPos,TInt aLength,TDes8& aTrg) const;
       
    96     
       
    97     TInt WriteCritical(TInt64 aPos,const TDesC8& aSrc);
       
    98     TInt WriteNonCritical(TInt64 aPos,TInt aLength,const TAny* aSrc,const RMessagePtr2 &aMessage,TInt anOffset);
       
    99     
       
   100     TInt GetLastErrorInfo(TDes8& aErrorInfo) const;
       
   101 
       
   102     //-- lock the mutex guarding CProxyDrive interface in order to be sure that no other thread can access it.
       
   103     //-- The thread that calls this method may be suspended until another signals the mutex, i.e. leaves the critical section.
       
   104     inline void AcquireLock() const {} //-- dummy
       
   105     
       
   106     //-- release the mutex guarding CProxyDrive.
       
   107     inline void ReleaseLock() const {} //-- dummy
       
   108 
       
   109 
       
   110 protected:
       
   111     TFatDriveInterface();
       
   112     TFatDriveInterface(const TFatDriveInterface&);
       
   113     TFatDriveInterface& operator=(const TFatDriveInterface&);
       
   114 
       
   115     TBool Init(CFatMountCB* aMount);
       
   116     void Close(); 
       
   117 
       
   118     inline TBool NotifyUser() const;
       
   119     TInt HandleRecoverableError(TInt aRes) const;
       
   120     TInt HandleCriticalError(TInt aRes) const;
       
   121     TInt UnlockAndReMount() const;
       
   122     TBool IsDriveWriteProtected() const;
       
   123     TBool IsRecoverableRemount() const;
       
   124 
       
   125 private:
       
   126     
       
   127     /** 
       
   128         An internal class that represents a thread-safe wrapper around raw interface to the CProxyDrive 
       
   129         and restricts access to it.
       
   130     */
       
   131     class XProxyDriveWrapper
       
   132         {
       
   133         public:
       
   134        
       
   135         XProxyDriveWrapper();
       
   136        ~XProxyDriveWrapper();
       
   137 
       
   138         TBool Init(CProxyDrive* aProxyDrive);
       
   139             
       
   140         inline void EnterCriticalSection() const {} //-- dummy
       
   141         inline void LeaveCriticalSection() const {} //-- dummy
       
   142 
       
   143         //-- methods' wrappers that are used by TFatDriveInterface
       
   144         TInt Read(TInt64 aPos,TInt aLength,const TAny* aTrg,const RMessagePtr2 &aMessage,TInt anOffset) const;
       
   145         TInt Read(TInt64 aPos,TInt aLength,TDes8& aTrg) const;
       
   146         TInt Write(TInt64 aPos,TInt aLength,const TAny* aSrc,const RMessagePtr2 &aMessage,TInt anOffset);
       
   147         TInt Write(TInt64 aPos, const TDesC8& aSrc);
       
   148         TInt GetLastErrorInfo(TDes8& aErrorInfo) const;
       
   149         TInt Caps(TDes8& anInfo) const;
       
   150 
       
   151         private:
       
   152         
       
   153         CProxyDrive*    iLocalDrive; ///< raw interface to the media operations
       
   154         mutable RMutex  iLock;       ///< used for sorting out multithreaded access to the iLocalDrive
       
   155         };
       
   156     
       
   157     CFatMountCB*        iMount;      ///< Pointer to the owning file system mount
       
   158     XProxyDriveWrapper  iProxyDrive; ///< wrapper around raw interface to the media operations
       
   159     
       
   160     };
       
   161 
       
   162 
       
   163 
       
   164 /**
       
   165     Class providing FAT table interface and basic functionality.
       
   166 */  
       
   167 class CFatTable : public CBase
       
   168     {
       
   169 public:
       
   170     static CFatTable* NewL(CFatMountCB& aOwner, const TLocalDriveCaps& aLocDrvCaps);
       
   171 
       
   172     virtual ~CFatTable();
       
   173 
       
   174     /** Empty and deallocate the cache*/
       
   175     virtual void Dismount(TBool /*aDiscardDirtyData*/) {}
       
   176     
       
   177     /** Flush data cahed data to the media */
       
   178     virtual void FlushL() {};
       
   179     
       
   180     /**
       
   181     Invalidate specified region of the FAT cache
       
   182     Depending of cache type this may just mark part of the cache invalid with reading on demand later
       
   183     or re-read whole cache from the media.
       
   184 
       
   185     @param aPos absolute media position where the region being invalidated starts.
       
   186     @param aLength length in bytes of region to invalidate / refresh
       
   187     */
       
   188     virtual void InvalidateCacheL(TInt64 /*aPos*/,TUint32 /*aLength*/) {};
       
   189 
       
   190     
       
   191     /**
       
   192     Invalidate whole FAT cache.
       
   193     Depending of cache type this may just mark cache invalid with reading on demand or re-read whole cache from the media
       
   194     */
       
   195     virtual void InvalidateCacheL() {};
       
   196     
       
   197 
       
   198     /**
       
   199     Gets the next cluster in a cluster chain
       
   200 
       
   201     @param aCluster Cluster number to start lookup. On return contains number of the next cluster.
       
   202     @return EFalse if cluster is at the end of a cluster chain
       
   203     */
       
   204     virtual TBool GetNextClusterL(TInt& aCluster) const;
       
   205     
       
   206     /**
       
   207     Writes end of cluster chain
       
   208     @param aFatIndex index in Fat table where EOF will be written to.
       
   209     */
       
   210     virtual void WriteFatEntryEofL(TUint32 aFatIndex);
       
   211 
       
   212     /** 
       
   213     Read an entry from the FAT.
       
   214 
       
   215     @param aFatIndex aFatIndex index in Fat table
       
   216     @return value of the FAT entry number aFatIndex
       
   217     */
       
   218     virtual TUint32 ReadL(TUint32 aFatIndex) const = 0;
       
   219     
       
   220     /**
       
   221     Write FAT entry to FAT by its index.
       
   222 
       
   223     @param aFatIndex index in FAT
       
   224     @param aValue value to write
       
   225     */
       
   226     virtual void WriteL(TUint32 aFatIndex, TUint32 aValue) = 0;
       
   227     
       
   228     /**
       
   229     return the byte position of a cluster in the fat table
       
   230 
       
   231     @param aCluster cluster to find position of
       
   232     @return byte position of the cluster
       
   233     */
       
   234     virtual TInt64 DataPositionInBytes(TUint32 aCluster) const = 0;
       
   235 
       
   236     virtual void FreeClusterListL(TUint32 aCluster);
       
   237     virtual void ExtendClusterListL(TUint32 aNumber,TInt& aCluster);
       
   238     virtual TUint32 AllocateSingleClusterL(TUint32 aNearestCluster);
       
   239     virtual TUint32 AllocateClusterListL(TUint32 aNumber,TUint32 aNearestCluster);
       
   240     virtual void CountFreeClustersL();
       
   241 
       
   242     virtual void RequestRawWriteAccess(TInt64 /*aPos*/, TUint32 /*aLen*/) const {};
       
   243     
       
   244 
       
   245 public:
       
   246 
       
   247     void MarkAsBadClusterL(TUint32 aCluster);
       
   248     TInt CountContiguousClustersL(TUint32 aStartCluster,TInt& anEndCluster, TUint32 aMaxCount) const;
       
   249 
       
   250     virtual TUint32 FreeClusterHint() const;
       
   251     virtual void SetFreeClusterHint(TUint32 aCluster);
       
   252     
       
   253     virtual TUint32 NumberOfFreeClusters(TBool aSyncOperation=EFalse) const;
       
   254     virtual void SetFreeClusters(TUint32 aFreeClusters);
       
   255 
       
   256     virtual TBool RequestFreeClusters(TUint32 aClustersRequired) const; 
       
   257     
       
   258     inline TUint32 MaxEntries() const;
       
   259     virtual void InitializeL();
       
   260     virtual TBool ConsistentState() const {return ETrue;} //-- dummy
       
   261 
       
   262 protected:
       
   263     CFatTable(CFatMountCB& aOwner);
       
   264     
       
   265     //-- outlawed
       
   266     CFatTable(); 
       
   267     CFatTable(const CFatTable&); 
       
   268     CFatTable& operator=(const CFatTable&);
       
   269 
       
   270     
       
   271 
       
   272     void DecrementFreeClusterCount(TUint32 aCount); 
       
   273     void IncrementFreeClusterCount(TUint32 aCount);
       
   274 
       
   275     inline TUint32 FreeClusters() const;
       
   276 
       
   277     inline TBool IsEof16Bit(TInt aCluster) const;
       
   278     inline TBool IsEof12Bit(TInt aCluster) const;
       
   279     inline TInt SectorSizeLog2() const;
       
   280     inline TFatType FatType() const;
       
   281 
       
   282     TUint32 PosInBytes(TUint32 aFatIndex) const;
       
   283     TUint32 FindClosestFreeClusterL(TUint32 aCluster);
       
   284 
       
   285     inline TBool IsFat12() const;
       
   286     inline TBool IsFat16() const;
       
   287 
       
   288     inline TBool ClusterNumberValid(TUint32 aClusterNo) const;
       
   289 
       
   290     typedef RArray<TUint> RClusterArray;
       
   291     void DoFreedClustersNotify(RClusterArray &aFreedClusters);
       
   292 
       
   293 
       
   294 protected:
       
   295     
       
   296     CFatMountCB* iOwner;            ///< Owning file system mount
       
   297     TUint        iMediaAtt;         ///< Cached copy of TLocalDriveCaps::iMediaAtt
       
   298 
       
   299 private:   
       
   300 
       
   301     TUint32  iFreeClusters;     ///< Number of free cluster in the fat table
       
   302     TUint32  iFreeClusterHint;  ///< Next free custer in the fat table, just for use in TFsInfo; This is just a hint, not required to contain exact information.
       
   303     TFatType iFatType;          ///< FAT type 12/16/32, cached from the iOwner
       
   304     TUint32  iMaxEntries;       ///< maximal number of FAT entries in the table. This value is taken from the CFatMount that calculates it
       
   305     
       
   306     };
       
   307 
       
   308 
       
   309 class MWTCacheInterface;
       
   310 
       
   311 
       
   312 //---------------------------------------------------------------------------------------------------------------------------------
       
   313 
       
   314 /**
       
   315 Base class abstraction of a raw media disk
       
   316 */
       
   317 class CRawDisk : public CBase
       
   318     {
       
   319 public:
       
   320 
       
   321     static CRawDisk* NewL(CFatMountCB& aOwner, const TLocalDriveCaps& aLocDrvCaps);
       
   322 
       
   323     virtual void InitializeL();
       
   324     
       
   325     virtual TInt GetLastErrorInfo(TDes8& aErrorInfo) const;
       
   326 public:
       
   327     
       
   328     /**
       
   329     Read data from the media via simple WT data cache if it is present. Some media types, like RAM do not have caches.
       
   330     This method is mostly used to read UIDs of executable modules and store them in the cache.
       
   331 
       
   332     @param aPos     Media position in bytes
       
   333     @param aLength  Length in bytes of read
       
   334     @param aDes     Data from read
       
   335     */
       
   336     virtual void ReadCachedL(TInt64 aPos,TInt aLength,TDes8& aDes) const = 0;
       
   337     
       
   338     /**
       
   339     Write data to the media via simple WT data cache if it is present. Some media types, like RAM do not have caches.
       
   340     @param aPos     Media position in bytes
       
   341     @param aDes     Data to write
       
   342     */
       
   343     virtual void WriteCachedL(TInt64 aPos,const TDesC8& aDes) = 0;
       
   344     
       
   345     virtual void InvalidateUidCache() {}
       
   346     virtual void InvalidateUidCachePage(TUint64 /*aPos*/) {}
       
   347     
       
   348 
       
   349     /**
       
   350     Disk read function
       
   351     
       
   352     @param aPos     Media position in bytes
       
   353     @param aLength  Length in bytes of read
       
   354     @param aTrg     Pointer to the data descriptor, i.e. (const TAny*)(&TDes8)
       
   355     @param aMessage Refrence to server message from request
       
   356     @param anOffset Offset into read data to write
       
   357     */
       
   358     virtual void ReadL(TInt64 aPos,TInt aLength,const TAny* aTrg,const RMessagePtr2 &aMessage,TInt anOffset) const = 0;
       
   359 
       
   360     /**
       
   361     Disk write function
       
   362 
       
   363     @param aPos     Media position in bytes
       
   364     @param aLength  Length in bytes of write
       
   365     @param aTrg     Pointer to the data descriptor, i.e. (const TAny*)(&TDes8)
       
   366     @param aMessage Refrence to server message from request, contains data
       
   367     @param anOffset Offset into write data to use in write
       
   368     */
       
   369     virtual void WriteL(TInt64 aPos,TInt aLength,const TAny* aSrc,const RMessagePtr2 &aMessage,TInt anOffset) = 0;
       
   370 
       
   371     
       
   372     virtual inline MWTCacheInterface* DirCacheInterface();
       
   373 
       
   374 
       
   375 
       
   376 
       
   377 protected:
       
   378 
       
   379     CRawDisk(CFatMountCB& aOwner);
       
   380 
       
   381     //-- outlawed
       
   382     CRawDisk(); 
       
   383     CRawDisk(const CRawDisk&); 
       
   384     CRawDisk& operator=(const CRawDisk&);
       
   385 
       
   386 
       
   387 protected:
       
   388 
       
   389     CFatMountCB* iFatMount; ///< Owning file system mount
       
   390     
       
   391     
       
   392 
       
   393     };
       
   394 
       
   395 class CFatFileCB;
       
   396 class RBitVector;
       
   397 
       
   398 /** 
       
   399     A helper class. Holds the FAT volume parameters, which in turn are obtained from the Boot Sector
       
   400 */
       
   401 class TFatVolParam
       
   402     {
       
   403     public:   
       
   404     
       
   405     TFatVolParam();
       
   406     void Populate(const TFatBootSector& aBootSector);
       
   407     TBool operator==(const TFatVolParam& aRhs) const;
       
   408 
       
   409     //-- simple getters
       
   410     TUint32 ClusterSizeLog2() const     {return iClusterSizeLog2;    }        
       
   411     TUint32 SectorSizeLog2() const      {return iSectorSizeLog2;     }        
       
   412     TUint32 RootDirEnd() const          {return iRootDirEnd;         }        
       
   413     TUint32 SectorsPerCluster() const   {return iSectorsPerCluster;  }        
       
   414     TUint32 RootDirectorySector() const {return iRootDirectorySector;}        
       
   415     TUint32 FirstFatSector() const      {return iFirstFatSector;     }        
       
   416     TUint32 TotalSectors() const        {return iTotalSectors;       }        
       
   417     TUint32 NumberOfFats() const        {return iNumberOfFats;       }        
       
   418     TUint32 FatSizeInBytes() const      {return iFatSizeInBytes;     }        
       
   419     TUint32 RootClusterNum() const      {return iRootClusterNum;     }        
       
   420     TUint32 FSInfoSectorNum() const     {return iFSInfoSectorNum;    }        
       
   421     TUint32 BkFSInfoSectorNum() const   {return iBkFSInfoSectorNum;  }        
       
   422     
       
   423     protected:
       
   424      TUint32 iClusterSizeLog2;      ///< Log2 of fat file system cluster size
       
   425      TUint32 iSectorSizeLog2;       ///< Log2 of media sector size
       
   426      TUint32 iRootDirEnd;           ///< End position of the root directory for Fat12/16
       
   427      TUint32 iSectorsPerCluster;    ///< Sector per cluster ratio for mounted Fat file system volume 
       
   428      TUint32 iRootDirectorySector;  ///< Start sector of the root directory for Fat12/16
       
   429      TUint32 iFirstFatSector;       ///< Start sector of the first Fat table in volume
       
   430      TUint32 iTotalSectors;         ///< Total sectors on media partition
       
   431      TUint32 iNumberOfFats;         ///< Number of Fats the volume has
       
   432      TUint32 iFatSizeInBytes;       ///< Size of a single Fat table in volume
       
   433      TUint32 iRootClusterNum;       ///< Cluster number for Root directory, for Fat32
       
   434      TUint32 iFSInfoSectorNum;      ///< FSInfo Sector number. If 0, this means that corresponding value isn't set in BPB
       
   435      TUint32 iBkFSInfoSectorNum;    ///< backup FSInfo Sector number
       
   436     };
       
   437 
       
   438 TUint32 CalculatePageOffsetInCluster(TUint32 aPos, TUint aPageSzLog2);
       
   439 class CLruCache;
       
   440 class TLeafDirData;
       
   441 class CLeafDirCache;
       
   442 /**
       
   443 Fat file system mount implmentation, provides all that is required of a plug in
       
   444 file system mount as well as Fat mount specific functionality
       
   445 */
       
   446 class CFatMountCB : public CLocDrvMountCB, 
       
   447                     public MFileSystemSubType,
       
   448                     public MFileSystemClusterSize,
       
   449                     public CMountCB::MFileAccessor
       
   450     {
       
   451 public:
       
   452     static CFatMountCB* NewL();
       
   453     ~CFatMountCB();
       
   454     void ConstructL();
       
   455 
       
   456 public:
       
   457     
       
   458     //-- overrides from the abstract CMountCB
       
   459     void MountL(TBool aForceMount);
       
   460     TInt ReMount();
       
   461     void Dismounted();
       
   462     void VolumeL(TVolumeInfo& aVolume) const;
       
   463     void SetVolumeL(TDes& aName);
       
   464     void MkDirL(const TDesC& aName);
       
   465     void RmDirL(const TDesC& aName);
       
   466     void DeleteL(const TDesC& aName);
       
   467     void RenameL(const TDesC& anOldName,const TDesC& anNewName);
       
   468     void ReplaceL(const TDesC& anOldName,const TDesC& anNewName);
       
   469     void EntryL(const TDesC& aName,TEntry& anEntry) const;
       
   470     void SetEntryL(const TDesC& aName,const TTime& aTime,TUint aMask,TUint aVal);
       
   471     void FileOpenL(const TDesC& aName,TUint aMode,TFileOpen anOpen,CFileCB* aFile);
       
   472     void DirOpenL(const TDesC& aName,CDirCB* aDir);
       
   473     void RawReadL(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt anOffset,const RMessagePtr2& aMessage) const;
       
   474     void RawWriteL(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt anOffset,const RMessagePtr2& aMessage);
       
   475     void GetShortNameL(const TDesC& aLongName,TDes& aShortName);
       
   476     void GetLongNameL(const TDesC& aShortName,TDes& aLongName);
       
   477     void ReadSectionL(const TDesC& aName,TInt aPos,TAny* aTrg,TInt aLength,const RMessagePtr2& aMessage);
       
   478     TInt CheckDisk();
       
   479     TInt ScanDrive();
       
   480     TInt ControlIO(const RMessagePtr2& aMessage,TInt aCommand,TAny* aParam1,TAny* aParam2);
       
   481     TInt Lock(TMediaPassword& aOld,TMediaPassword& aNew,TBool aStore);
       
   482     TInt Unlock(TMediaPassword& aPassword,TBool aStore);
       
   483     TInt ClearPassword(TMediaPassword& aPassword);
       
   484     TInt ErasePassword();
       
   485     TInt ForceRemountDrive(const TDesC8* aMountInfo,TInt aMountInfoMessageHandle,TUint aFlags);
       
   486 
       
   487     void FinaliseMountL();
       
   488     void FinaliseMountL(TInt aOperation, TAny* aParam1=NULL, TAny* aParam2=NULL);
       
   489     TInt MountControl(TInt aLevel, TInt aOption, TAny* aParam);
       
   490     TTimeIntervalSeconds TimeOffset() const;
       
   491 
       
   492 protected:
       
   493 
       
   494     /** CFatMountCB states */
       
   495     enum  TFatMntState
       
   496         {
       
   497         ENotMounted = 0, ///< 0, initial state, not mounted     (mount state is inconsistent)
       
   498         EMounting,       ///< 1, Mounting started               (mount state is inconsistent)
       
   499         EInit_R,         ///< 2, Initialised and not written    (mount state is Consistent)
       
   500         EInit_W,         ///< 3, Initialised and written        (mount state is Consistent)
       
   501         EFinalised,      ///< 4, Finalised                      (mount state is Consistent)
       
   502         EDismounted,     ///< 5, Dismounted                     (mount state is inconsistent)
       
   503         EInit_Forced,    ///< 6, forcedly mounted, special case (mount state is inconsistent)
       
   504         };
       
   505 
       
   506     inline TFatMntState State() const;
       
   507     inline void SetState(TFatMntState aState); 
       
   508     TInt OpenMountForWrite();
       
   509     TInt IsFinalised(TBool& aFinalised);
       
   510 
       
   511     /** 
       
   512         A wrapper around TFatDriveInterface providing its instantination and destruction.
       
   513         You must not create objects of this class, use DriveInterface() instead.
       
   514     */
       
   515     class XDriveInterface: public TFatDriveInterface
       
   516         {
       
   517         public:
       
   518         XDriveInterface() : TFatDriveInterface() {}
       
   519         ~XDriveInterface() {Close();}
       
   520         TBool Init(CFatMountCB* aMount) {return TFatDriveInterface::Init(aMount);}
       
   521         };
       
   522 
       
   523 public:
       
   524 
       
   525     enum TRenMode {EModeReplace,EModeRename};
       
   526 
       
   527     TBool ConsistentState() const; 
       
   528     void CheckWritableL() const;
       
   529     void CheckStateConsistentL() const;
       
   530 
       
   531     inline TBool ReadOnly(void) const;
       
   532     inline void  SetReadOnly(TBool aReadOnlyMode);
       
   533     inline TInt StartCluster(const TFatDirEntry & anEntry) const;
       
   534     inline CRawDisk& RawDisk() const;
       
   535     inline CFatFileSystem& FatFileSystem() const;
       
   536     inline CFatTable& FAT() const;
       
   537     inline TInt ClusterSizeLog2() const;
       
   538     inline TInt SectorSizeLog2() const;
       
   539     inline TInt TotalSectors() const;
       
   540     inline TInt SectorsPerCluster() const;
       
   541     inline TInt ClusterBasePosition() const;
       
   542     inline TInt RootDirectorySector() const;
       
   543     inline TUint RootDirEnd() const;
       
   544     inline TUint32 RootClusterNum() const;
       
   545     
       
   546     inline TFatType FatType() const;
       
   547     inline TBool Is16BitFat() const;
       
   548     inline TBool Is32BitFat() const {return EFalse;} //-- dummy
       
   549 
       
   550     inline TUint32 MaxClusterNumber() const;
       
   551     inline TInt StartOfFatInBytes() const;
       
   552     inline TUint32 FirstFatSector() const;
       
   553 
       
   554     inline TInt NumberOfFats() const;
       
   555     inline TInt FatSizeInBytes() const;
       
   556     inline TInt ClusterRelativePos(TInt aPos) const;
       
   557     inline TUint StartOfRootDirInBytes() const;
       
   558     inline TUint32 UsableClusters() const;
       
   559     inline TBool IsBadCluster(TInt aCluster) const;
       
   560     inline TBool IsRuggedFSys() const;
       
   561     inline void SetRuggedFSys(TBool aVal);
       
   562     
       
   563     inline TInt RootIndicator() const;
       
   564     
       
   565     inline TBool IsRootDir(const TEntryPos &aEntry) const;
       
   566     inline CAsyncNotifier* Notifier() const;
       
   567     inline TFatDriveInterface& DriveInterface() const;
       
   568     
       
   569     void ReadUidL(TInt aCluster,TEntry& anEntry) const;
       
   570     
       
   571     void ReadDirEntryL(const TEntryPos& aPos,TFatDirEntry& aDirEntry) const;
       
   572     void WriteDirEntryL(const TEntryPos& aPos,const TFatDirEntry& aDirEntry);
       
   573     
       
   574     void DirReadL(const TEntryPos& aPos,TInt aLength,TDes8& aDes) const;
       
   575     void DirWriteL(const TEntryPos& aPos,const TDesC8& aDes);
       
   576 
       
   577     void ReadFromClusterListL(TEntryPos& aPos,TInt aLength,const TAny* aTrg,const RMessagePtr2& aMessage,TInt anOffset) const;
       
   578     void WriteToClusterListL(TEntryPos& aPos,TInt aLength,const TAny* aSrc,const RMessagePtr2& aMessage,TInt anOffset, TInt& aBadcluster, TInt& aGoodcluster);
       
   579     void MoveToNextEntryL(TEntryPos& aPos) const;
       
   580     void MoveToDosEntryL(TEntryPos& aPos,TFatDirEntry& anEntry) const;
       
   581     void EnlargeL(TInt aSize);
       
   582     void ReduceSizeL(TInt aPos,TInt aLength);
       
   583     void DoDismount();
       
   584 
       
   585     
       
   586     
       
   587     void CheckIndirectionTableL(TInt& anEndCluster) const;
       
   588     void DoRenameOrReplaceL(const TDesC& anOldName,const TDesC& aNewName,TRenMode aMode,TEntryPos& aNewPos);
       
   589     void FindDosNameL(const TDesC& aName,TUint anAtt,TEntryPos& aDosEntryPos,TFatDirEntry& aDosEntry,TDes& aFileName,TInt anError) const;
       
   590     
       
   591     void Dismount();
       
   592     TBool IsEndOfClusterCh(TInt aCluster) const;
       
   593     void SetEndOfClusterCh(TInt &aCluster) const; 
       
   594     void InitializeRootEntry(TFatDirEntry & anEntry) const;
       
   595 
       
   596     TInt64 MakeLinAddrL(const TEntryPos& aPos) const;
       
   597     
       
   598     inline const TFatConfig& FatConfig() const;
       
   599     TBool CheckVolumeTheSame();
       
   600     
       
   601     void InvalidateLeafDirCache();
       
   602     
       
   603     void BlockMapReadFromClusterListL(TEntryPos& aPos, TInt aLength, SBlockMapInfo& aInfo);
       
   604     virtual TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
       
   605     virtual TInt GetFileUniqueId(const TDesC& aName, TInt64& aUniqueId);
       
   606     virtual TInt Spare3(TInt aVal, TAny* aPtr1, TAny* aPtr2);
       
   607     virtual TInt Spare2(TInt aVal, TAny* aPtr1, TAny* aPtr2);
       
   608     virtual TInt Spare1(TInt aVal, TAny* aPtr1, TAny* aPtr2);
       
   609 
       
   610 public:
       
   611     
       
   612     // interface extension implementation
       
   613     virtual TInt SubType(TDes& aName) const;
       
   614     virtual TInt ClusterSize() const;
       
   615 
       
   616 private:
       
   617 
       
   618         /** An ad hoc internal helper object for using in DoFindL() method and its derivatives */
       
   619         class TFindHelper
       
   620         {
       
   621         public:
       
   622             TFindHelper() {isInitialised = EFalse;}
       
   623             void  InitialiseL(const TDesC&  aTargetName);
       
   624             TBool MatchDosEntryName(const TUint8* apDosEntryName) const;
       
   625             TBool TrgtNameIsLegalDos() const {ASSERT (isInitialised) ;return isLegalDosName;}   
       
   626 
       
   627         private:
       
   628             TFindHelper(const TFindHelper&);
       
   629             TFindHelper& operator=(const TFindHelper&);
       
   630         public:
       
   631             TPtrC       iTargetName;        ///< pointer to the aTargetName, used in DoRummageDirCacheL() as a parameter
       
   632         private:
       
   633             TBool       isInitialised  :1;  ///< ETrue if the object is initialised. It can be done only once.
       
   634             TBool       isLegalDosName :1;  ///< ETrue if iTargetName is a legal DOS name
       
   635             TShortName  iShortName;         ///< a short DOS name in XXXXXXXXYYY format generated from aTargetName
       
   636         };
       
   637 
       
   638 
       
   639         /** 
       
   640         An ad hoc internal helper object for entry creations  
       
   641         */
       
   642         class XFileCreationHelper
       
   643         {
       
   644         public:
       
   645             XFileCreationHelper();
       
   646             ~XFileCreationHelper();
       
   647             void Close();
       
   648             void InitialiseL(const TDesC&  aTargetName);
       
   649             TInt GetValidatedShortName(TShortName& aShortName) const;
       
   650             void CheckShortNameCandidates(const TUint8* apDosEntryName);
       
   651     
       
   652             // inline functions for sets and gets
       
   653             //  note all the get functions have been checked against initialisation status
       
   654             inline TBool    IsInitialised() const;
       
   655             inline TUint16  NumOfAddingEntries() const;
       
   656             inline TEntryPos EntryAddingPos()const;
       
   657             inline TBool    IsNewEntryPosFound() const;
       
   658             inline TBool    IsTrgNameLegalDosName() const;
       
   659     
       
   660             inline void SetEntryAddingPos(const TEntryPos& aEntryPos);
       
   661             inline void SetIsNewEntryPosFound(TBool aFound);
       
   662     
       
   663         private:
       
   664             XFileCreationHelper(const XFileCreationHelper&);
       
   665             XFileCreationHelper& operator=(const TFindHelper&);
       
   666     
       
   667         private:
       
   668             TPtrC       iTargetName;        ///< pointer to hold the long file name of the target file
       
   669             TUint16     iNumOfAddingEntries;///< calculated number of entries to add
       
   670             TEntryPos   iEntryAddingPos;    ///< contains new entry position for adding if found any
       
   671             TBool       isNewEntryPosFound; ///< flags whether the position for new entries is found
       
   672             TBool       isInitialised   :1; ///< flags whether the object is initialised
       
   673             TBool       isTrgNameLegalDosName   :1; ///< flags whether the target file name is a valid Dos name
       
   674             /**
       
   675             an array that holds short name candidates, prepared on initialisation.
       
   676             */
       
   677             RArray<TShortName>  iShortNameCandidates;
       
   678         };
       
   679 
       
   680 
       
   681     TBool DoRummageDirCacheL(TUint anAtt,TEntryPos& aStartEntryPos,TFatDirEntry& aStartEntry,TEntryPos& aDosEntryPos,TFatDirEntry& aDosEntry,TDes& aFileName, const TFindHelper& aAuxParam, XFileCreationHelper* aFileCreationHelper, const TLeafDirData& aLeafDirData) const;
       
   682     TBool DoFindL(const TDesC& aName,TUint anAtt,TEntryPos& aStartEntryPos,TFatDirEntry& aStartEntry,TEntryPos& aDosEntryPos,TFatDirEntry& aDosEntry,TDes& aFileName,TInt anError, XFileCreationHelper* aFileCreationHelper, const TLeafDirData& aLeafDirData) const;
       
   683     void FindEntryStartL(const TDesC& aName,TUint anAtt,TFatDirEntry& anEntry,TEntryPos& aPos, XFileCreationHelper* aFileCreationHelper) const;
       
   684 
       
   685     void FindEntryStartL(const TDesC& aName,TUint anAtt,TFatDirEntry& anEntry,TEntryPos& aPos) const;
       
   686 
       
   687     void CheckFatForLoopsL(const TFatDirEntry& anEntry) const;
       
   688     void DoCheckFatForLoopsL(TInt aCluster,TInt& aPreviousCluster,TInt& aChangePreviousCluster,TInt& aCount) const;
       
   689     void InitializeL(const TLocalDriveCaps& aLocDrvCaps, TBool aIgnoreFSInfo=EFalse);
       
   690     void DoReadFromClusterListL(TEntryPos& aPos,TInt aLength,const TAny* aTrg,const RMessagePtr2& aMessage,TInt anOffset) const;
       
   691     void DoWriteToClusterListL(TEntryPos& aPos,TInt aLength,const TAny* aSrc,const RMessagePtr2& aMessage,TInt anOffset, TInt aLastcluster, TInt& aBadcluster, TInt& aGoodcluster);
       
   692     TBool IsUniqueNameL(const TShortName& aName,TInt aDirCluster);
       
   693     TBool FindShortNameL(const TShortName& aName,TEntryPos& anEntryPos);
       
   694     void ReplaceClashingNameL(const TShortName& aNewName,const TEntryPos& anEntryPos);
       
   695     TBool GenerateShortNameL(TInt aDirCluster,const TDesC& aLongName,TShortName& aShortName, TBool aForceRandomize=EFalse);
       
   696     TInt FindLeafDirL(const TDesC& aName, TLeafDirData& aLeafDir) const;
       
   697     
       
   698     TInt GetDirEntry(TEntryPos& aPos,TFatDirEntry& aDosEntry,TFatDirEntry& aStartEntry,TDes& aLongFileName) const;
       
   699     TBool DoGetDirEntryL(TEntryPos& aPos,TFatDirEntry& aDosEntry,TFatDirEntry& aStartEntry,TDes& aLongFileName) const;
       
   700 
       
   701     void WriteDirEntryL(TEntryPos& aPos,const TFatDirEntry& aFatDirEntry,const TDesC& aLongFileName);
       
   702     void EraseDirEntryL(TEntryPos aPos,const TFatDirEntry& anEntry);
       
   703     void EraseDirEntryL(const TEntryPos& aPos);
       
   704     void InitializeFirstDirClusterL(TInt aCluster,TInt aParentCluster);
       
   705     void AddDirEntryL(TEntryPos& aPos,TInt aNameLength);
       
   706     void ZeroDirClusterL(TInt aCluster);
       
   707     
       
   708     TInt DoWriteBootSector(TInt64 aMediaPos, const TFatBootSector& aBootSector) const;
       
   709     TInt DoReadBootSector(TInt64 aMediaPos, TFatBootSector& aBootSector) const;
       
   710     TInt ReadBootSector(TFatBootSector& aBootSector, TBool aDoNotReadBkBootSec=EFalse);
       
   711 
       
   712     TBool IsDirectoryEmptyL(TInt aCluster);
       
   713     void ExtendClusterListZeroedL(TInt aNumber,TInt& aCluster);
       
   714     void WritePasswordData();
       
   715     
       
   716     void WriteVolumeLabelL(const TDesC8& aVolumeLabel) const;
       
   717     TInt ReadVolumeLabelFile(TDes8& aLabel);
       
   718     void WriteVolumeLabelFileL(const TDesC8& aNewName);
       
   719     void FindVolumeLabelFileL(TDes8& aLabel, TEntryPos& aDosEntryPos, TFatDirEntry& aDosEntry);
       
   720     void GetVolumeLabelFromDiskL(const TFatBootSector& aBootSector);
       
   721     void TrimVolumeLabel(TDes8& aLabel) const;
       
   722 
       
   723     TInt    DoRunScanDrive();
       
   724     TBool   VolumeCleanL();
       
   725     void    SetVolumeCleanL(TBool aClean);
       
   726     TBool   VolCleanFlagSupported() const;
       
   727 
       
   728     void    DoUpdateFSInfoSectorsL(TBool) {return;} //-- dummy, only FAT32 has FSInfo sector
       
   729     void    UnFinaliseMountL();
       
   730     void    DoReMountL();
       
   731 
       
   732 private:
       
   733     
       
   734     TBool ValidClusterNumber(TUint32 aCluster) const;
       
   735     void  CheckUnvisitedClustersL(const RBitVector& aFatBitVec) const;
       
   736     TInt  WalkClusterListL(RBitVector& aFatBitVec, TInt aCluster);
       
   737     void  ChkEntryL(RBitVector& aFatBitVec, const TFatDirEntry& anEntry);
       
   738     void  ChkDirL(RBitVector& aFatBitVec, TInt aDirCluster);
       
   739 
       
   740     CFatMountCB();
       
   741 
       
   742     TInt GetDosEntryFromNameL(const TDesC& aName, TEntryPos& aDosEntryPos, TFatDirEntry& aDosEntry);
       
   743     
       
   744     TInt MntCtl_DoCheckFileSystemMountable();
       
   745 
       
   746 private:
       
   747 
       
   748     TBool iReadOnly : 1;        ///< if true, the drive is in read-only mode 
       
   749     TBool iRamDrive : 1;        ///< true if this is a RAM drive    
       
   750 
       
   751     TFatMntState iState;        ///< this mounnt internal state
       
   752     TFatType iFatType;          ///< FAT type, FAT12,16 or 32
       
   753 
       
   754     CLeafDirCache* iLeafDirCache;   ///< A cache for most recently visited directories, only valid when limit is set bigger than 1
       
   755     HBufC* iLastLeafDir;            ///< The last visited directory, only valid when limit of iLeafDirCache is less than 1 
       
   756     TInt iLastLeafDirCluster;       ///< Cluster number of the last visited cluster, only valid when limit of iLeafDirCache is less than 1
       
   757 
       
   758     TFatVolParam iVolParam;     ///< FAT volume parameters, populated form the boot sector values.
       
   759     
       
   760     TInt iFirstFreeByte;        ///< First free byte in media (start of the data area on the volume)
       
   761     TUint32 iUsableClusters;    ///< Number of usable cluster on the volume 
       
   762 
       
   763     CFatTable* iFatTable;       ///< Pointer to the volume Fat 
       
   764     CRawDisk* iRawDisk;         ///< Pointer to the raw data interface class
       
   765     
       
   766     CAsyncNotifier* iNotifier;  ///< Async notifier for notifying user of Fat error conditions 
       
   767     CLruCache*      iLruUidCache;   ///< LRU Data cache used for dealing with executable files' UIDs
       
   768 
       
   769     XDriveInterface iDriverInterface; ///< the object representing interface to the drive, provides read/write access and notifiers
       
   770     TInt            iChkDiscRecLevel; ///< Check disk recursion level counter. A temporary measure. 
       
   771     TFatConfig      iFatConfig;       ///< FAT parametrers from estart.txt
       
   772 
       
   773     XFileCreationHelper iFileCreationHelper;
       
   774 
       
   775 #ifdef  _DEBUG
       
   776     private:
       
   777     //-- debug odds and ends
       
   778     inline TBool IsWriteFail()const;
       
   779     inline void SetWriteFail(TBool aIsWriteFail);
       
   780     inline TInt WriteFailCount()const;
       
   781     inline void SetWriteFailCount(TInt aFailCount);
       
   782     inline void DecWriteFailCount();
       
   783     inline TInt WriteFailError()const;
       
   784     inline void SetWriteFailError(TInt aErrorValue);
       
   785 
       
   786 
       
   787     TBool   iIsWriteFail : 1; ///< Flag to indicate if write failed used for debugging
       
   788     TBool   iCBRecFlag   : 1; ///< in debug mode used for checking unwanted recursion
       
   789 
       
   790     TInt    iWriteFailCount;  ///< Write fail count for debug
       
   791     TInt    iWriteFailError;  ///< Write fail error to use for debug
       
   792 
       
   793 #endif
       
   794 
       
   795 friend class CFatFormatCB;
       
   796 friend class CScanDrive;
       
   797 friend class TFatDriveInterface;
       
   798     };
       
   799 
       
   800 
       
   801 
       
   802 
       
   803 /**
       
   804 Fat file system file subsession implmentation, provides all that is required of a plug in
       
   805 file system file as well as Fat specific functionality
       
   806 */
       
   807 class CFatFileCB : public CFileCB, public CFileCB::MBlockMapInterface, public CFileCB::MExtendedFileInterface
       
   808     {
       
   809 public:
       
   810     CFatFileCB();
       
   811     ~CFatFileCB();
       
   812 public:
       
   813     void RenameL(const TDesC& aNewName);
       
   814     void ReadL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
       
   815     void WriteL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
       
   816     void SetSizeL(TInt aSize);
       
   817     void SetEntryL(const TTime& aTime,TUint aMask,TUint aVal);
       
   818     void FlushDataL();
       
   819     void FlushAllL();
       
   820 public:
       
   821     void CheckPosL(TUint aPos);
       
   822     void SetL(const TFatDirEntry& aFatDirEntry,TShare aShare,const TEntryPos& aPos);
       
   823     void CreateSeekIndex();
       
   824     
       
   825     inline TBool IsSeekIndex() const;
       
   826 
       
   827     // from MBlockMapInterface
       
   828     TInt BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos);
       
   829     
       
   830     // from CFileCB
       
   831     virtual TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
       
   832 
       
   833     // from CFileCB::MExtendedFileInterface
       
   834     virtual void ReadL(TInt64 aPos,TInt& aLength,TDes8* aDes,const RMessagePtr2& aMessage, TInt aOffset);
       
   835     virtual void WriteL(TInt64 aPos,TInt& aLength,const TDesC8* aDes,const RMessagePtr2& aMessage, TInt aOffset);
       
   836     virtual void SetSizeL(TInt64 aSize);
       
   837 
       
   838 private:
       
   839     inline CFatMountCB& FatMount() const;
       
   840     inline CFatTable& FAT();
       
   841     inline TInt ClusterSizeLog2();
       
   842     inline TInt ClusterRelativePos(TInt aPos);
       
   843 
       
   844 
       
   845     void FlushStartClusterL();
       
   846     TInt SeekToPosition(TInt aNewCluster,TInt aClusterOffset);
       
   847     void SetSeekIndexValueL(TInt aFileCluster,TInt aStoredCluster);
       
   848     void ResizeIndex(TInt aNewMult,TUint aNewSize);
       
   849     TInt CalcSeekIndexSize(TUint aSize);
       
   850     TBool IsSeekBackwards(TUint aPos);
       
   851     void ClearIndex(TUint aNewSize);
       
   852     void DoSetSizeL(TUint aSize,TBool aIsSizeWrite);
       
   853     void WriteFileSizeL(TUint aSize);
       
   854 
       
   855 private:
       
   856 
       
   857     TUint32* iSeekIndex;    ///< Seek index into file
       
   858     TInt iSeekIndexSize;    ///< size of seek index
       
   859     TBool iAttPending;      
       
   860     TInt iStartCluster;     ///< Start cluster number of file
       
   861     TEntryPos iCurrentPos;  ///< Current position in file data
       
   862     TEntryPos iFileDirPos;  ///< File directory entry position
       
   863     TBool iFileSizeModified; 
       
   864     };
       
   865 //
       
   866 
       
   867 /**
       
   868 Fat file system directory subsession implmentation, provides all that is required of a plug in
       
   869 file system directory as well as Fat specific functionality
       
   870 */
       
   871 class CFatDirCB : public CDirCB
       
   872     {
       
   873 public:
       
   874     static CFatDirCB* NewL();
       
   875     ~CFatDirCB();
       
   876 public:
       
   877     void ReadL(TEntry& anEntry);
       
   878     void StoreLongEntryNameL(const TDesC& aName);
       
   879 public:
       
   880     void SetDirL(const TFatDirEntry& anEntry,const TDesC& aMatchName);
       
   881     inline CFatMountCB& FatMount();
       
   882 private:
       
   883     CFatDirCB();
       
   884 private:
       
   885     TFatDirEntry iEntry;       ///< Current directory entry in this directory
       
   886     TEntryPos    iCurrentPos;  ///< Current position in directory
       
   887     HBufC*       iMatch;       ///< Current name being searched in directory (Dos Name)
       
   888     HBufC*       iLongNameBuf; ///< Long name storage   
       
   889     TBool        iMatchUid;    ///< Flag to indicate if UID matches
       
   890     };
       
   891 
       
   892 /**
       
   893 Fat file system Format subsession implmentation, provides all that is required of a plug in
       
   894 file system format as well as Fat specific functionality
       
   895 */
       
   896 class CFatFormatCB : public CFormatCB
       
   897     {
       
   898 public:
       
   899     CFatFormatCB();
       
   900     ~CFatFormatCB();
       
   901 public:
       
   902     
       
   903     //-- overrides from CFormatCB
       
   904     void DoFormatStepL();
       
   905 
       
   906 private:
       
   907     //-- overrides from CFormatCB
       
   908     TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
       
   909 
       
   910 private:    
       
   911     
       
   912     TInt DoProcessTVolFormatParam(const TVolFormatParam_FAT* apVolFormatParam);
       
   913 
       
   914     void CreateBootSectorL();
       
   915     void InitializeFormatDataL();
       
   916     void DoZeroFillMediaL(TInt64 aStartPos, TInt64 aEndPos);
       
   917      
       
   918     TInt InitFormatDataForVariableSizeDisk(TInt aDiskSizeInSectors);
       
   919     TInt InitFormatDataForFixedSizeDiskNormal(TInt aDiskSizeInSectors, const TLocalDriveCapsV6& aCaps);
       
   920     TInt InitFormatDataForFixedSizeDiskCustom(const TLDFormatInfo& aFormatInfo);
       
   921     TInt InitFormatDataForFixedSizeDiskUser(TInt aDiskSizeInSectors);
       
   922     void AdjustClusterSize(TInt aRecommendedSectorsPerCluster);
       
   923     TInt AdjustFirstDataSectorAlignment(TInt aBlockSize);
       
   924     TInt FirstDataSector() const;
       
   925     
       
   926     TInt HandleCorrupt(TInt aError);
       
   927     TInt BadSectorToCluster();
       
   928     void TranslateL();
       
   929     TInt DoTranslate(TPtr8& aBuf, RArray<TInt>& aArray);
       
   930     void RecordOldInfoL();
       
   931     TInt MaxFat12Sectors() const;
       
   932     TInt MaxFat16Sectors() const;
       
   933     inline TBool Is16BitFat() const;
       
   934     inline CFatMountCB& FatMount();
       
   935     inline CProxyDrive* LocalDrive();
       
   936     TFatType SuggestFatType() const;
       
   937 
       
   938 private:
       
   939     
       
   940     TBool   iVariableSize;      ///< Flag to indicat if we are dealing with a variable size volume
       
   941     TInt    iBytesPerSector;    ///< Byte per sector of media
       
   942     TInt    iSectorSizeLog2;    ///< Sector size in log2
       
   943     TInt    iNumberOfFats;      ///< Number of Fats the volume will contain
       
   944     TInt    iReservedSectors;   ///< Number of reserved sectors in the volume
       
   945     TInt    iRootDirEntries;    ///< Nummer of root directory entries the root dir will have, specific to Fat12/16 volumes
       
   946     TInt    iSectorsPerCluster; ///< Sector per cluster ration the volume will be formatted with
       
   947     TInt    iSectorsPerFat;     ///< Number of sectors the Fat uses
       
   948     TInt    iMaxDiskSectors;       ///< number of sectors the volume has
       
   949     TFormatInfo iFormatInfo;    ///< format information for a custom format
       
   950     TBuf8<16>   iFileSystemName;///< Buffer to contain the volume name 
       
   951     TInt    iHiddenSectors;     ///< Number of hidden sectors in the volume
       
   952     TInt    iNumberOfHeads;     ///< Number of heads the media device has, not used so far as only used on solid state media.
       
   953     TInt    iSectorsPerTrack;   ///< Number of sectors the media device has, not used so far as only used on solid state media.
       
   954     RArray<TInt> iBadClusters;  ///< Array of bad cluster numbers
       
   955     RArray<TInt> iBadSectors;   ///< Array of bad sector numbers
       
   956     TBool iDiskCorrupt;         ///< Disk is corrupt when format or not
       
   957     TInt iOldFirstFreeSector;
       
   958     TInt iOldSectorsPerCluster;
       
   959     };
       
   960 
       
   961 
       
   962 /**
       
   963 Required file system class used by file server to create the file system objects
       
   964 */
       
   965 class CFatFileSystem : public CFileSystem
       
   966     {
       
   967 public:
       
   968     static CFatFileSystem* New();
       
   969     ~CFatFileSystem();
       
   970 public:
       
   971     TInt Install();
       
   972     CMountCB* NewMountL() const;
       
   973     CFileCB* NewFileL() const;
       
   974     CDirCB* NewDirL() const;
       
   975     CFormatCB* NewFormatL() const;
       
   976     void DriveInfo(TDriveInfo& anInfo,TInt aDriveNumber) const;
       
   977     TInt DefaultPath(TDes& aPath) const;
       
   978     TBool IsExtensionSupported() const;
       
   979     TBool GetUseLocalTime() const;
       
   980     void SetUseLocalTime(TBool aFlag);
       
   981     TInt GetInterface(TInt aInterfaceId, TAny*& aInterface,TAny* aInput);
       
   982 protected:
       
   983     CFatFileSystem();
       
   984     /**
       
   985     If true, then local time will be used when writing timestamps to FS. When reading,
       
   986     timestamps will be assumed local and converted back to UTC.
       
   987     At present, this behaviour will also be conditional upon a particular drive being logically removable.
       
   988     */
       
   989     TBool iUseLocalTimeIfRemovable;
       
   990     };
       
   991 
       
   992 
       
   993 
       
   994 /**
       
   995 Locale utilities allows the file system to call into a specific locale for tasks
       
   996 such as Dos name to unicode conversions and testing the legality of characters for
       
   997 any given locale.
       
   998 */
       
   999 class LocaleUtils
       
  1000 
       
  1001     {
       
  1002 public:
       
  1003     static void ConvertFromUnicodeL(TDes8& aForeign, const TDesC16& aUnicode, TFatUtilityFunctions::TOverflowAction aOverflowAction=TFatUtilityFunctions::EOverflowActionTruncate);
       
  1004     static void ConvertToUnicodeL(TDes16& aUnicode, const TDesC8& aForeign, TFatUtilityFunctions::TOverflowAction aOverflowAction=TFatUtilityFunctions::EOverflowActionTruncate);
       
  1005     static TBool IsLegalShortNameCharacter(TUint aCharacter,TBool aUseExtendedChars=EFalse);
       
  1006     };
       
  1007 
       
  1008 //
       
  1009 
       
  1010 TPtrC RemoveTrailingDots(const TDesC& aName);
       
  1011 
       
  1012 /**
       
  1013 Indicates if a number passed in is a power of two
       
  1014 @return ETrue if aVal is a power of 2 
       
  1015 */
       
  1016 inline TBool IsPowerOf2(TUint32 aVal);
       
  1017 
       
  1018 /**
       
  1019 Calculates the log2 of a number
       
  1020 
       
  1021 @param aNum Number to calulate the log two of
       
  1022 @return The log two of the number passed in
       
  1023 */
       
  1024 TUint32 Log2(TUint32 aVal);
       
  1025 
       
  1026 /** @return 2^aVal*/
       
  1027 inline TUint32 Pow2(TUint32 aVal);
       
  1028 
       
  1029 
       
  1030 /**
       
  1031 Converts Dos time (from a directory entry) to TTime format
       
  1032 
       
  1033 @param aDosTime Dos format time
       
  1034 @param aDosDate Dos format Date
       
  1035 @return TTime format of Dos time passed in 
       
  1036 */
       
  1037 TTime DosTimeToTTime(TInt aDosTime,TInt aDosDate);
       
  1038 /**
       
  1039 Converts TTime format to Dos time format
       
  1040 
       
  1041 @param aTime TTime to convert to Dos time
       
  1042 @return Dos time format
       
  1043 */
       
  1044 TInt DosTimeFromTTime(const TTime& aTime);
       
  1045 /**
       
  1046 Converts TTime format to Dos time format
       
  1047 
       
  1048 @param aTime TTime to convert to Dos Date
       
  1049 @return Dos Date format
       
  1050 */
       
  1051 TInt DosDateFromTTime(const TTime& aTime);
       
  1052 /**
       
  1053 Converts Dos Directory entry format to 8.3 format
       
  1054 
       
  1055 @param aDosName Directory entry format with space delimeter
       
  1056 @return 8.3 Dos filename format
       
  1057 */
       
  1058 TBuf8<12> DosNameToStdFormat(const TDesC8& aDosName);
       
  1059 /**
       
  1060 Converts 8.3 format to Dos Directory entry format 
       
  1061 
       
  1062 @param aStdFormatName 8.3 Dos filename format
       
  1063 @return Directory entry format with space delimeter
       
  1064 */
       
  1065 TBuf8<12> DosNameFromStdFormat(const TDesC8& aStdFormatName);
       
  1066 /**
       
  1067 Fault function calls user panic with a fault reason
       
  1068 
       
  1069 @param Enumerated fault reason
       
  1070 */
       
  1071 void Fault(TFault aFault);
       
  1072 /**
       
  1073 calculates the number of VFat directory entries for a given file/directory name length
       
  1074 
       
  1075 @param the length in characters of the name
       
  1076 @return the number of VFat entries required
       
  1077 */
       
  1078 TInt NumberOfVFatEntries(TInt aNameLength);
       
  1079 /**
       
  1080 Calculates the check sum for a standard directory entry
       
  1081 
       
  1082 @param the Dos name for the directory entry
       
  1083 @return the checksum
       
  1084 */
       
  1085 TUint8 CalculateShortNameCheckSum(const TDesC8& aShortName);
       
  1086 
       
  1087 
       
  1088 TBool IsLegalDosName(const TDesC&  aName,TBool anAllowWildCards,TBool aUseExtendedChars, TBool aInScanDrive, TBool aAllowLowerCase, TBool aIsForFileCreation);
       
  1089 TBool IsLegalDOSNameChar(TChar aCharacter, TBool aUseExtendedChars);
       
  1090 
       
  1091 
       
  1092 
       
  1093 //-----------------------------------------------------------------------------
       
  1094 
       
  1095 /**
       
  1096     This class represents a bit vector i.e. an array of bits. Vector size can be 1..2^32 bits.
       
  1097 */
       
  1098 class RBitVector
       
  1099     {
       
  1100  public:
       
  1101     
       
  1102     RBitVector(); //-- Creates an empty vector. see Create() methods for memory allocation
       
  1103    ~RBitVector(); 
       
  1104     
       
  1105     void Close(); 
       
  1106     
       
  1107     TInt Create(TUint32 aNumBits);
       
  1108     void CreateL(TUint32 aNumBits);
       
  1109 
       
  1110     inline TUint32 Size() const;
       
  1111 
       
  1112     //-- single bit manipulation methods
       
  1113     inline TBool operator[](TUint32 aIndex) const;
       
  1114     inline void SetBit(TUint32 aIndex);
       
  1115     inline void ResetBit(TUint32 aIndex);
       
  1116     inline void InvertBit(TUint32 aIndex);
       
  1117     inline void SetBitVal(TUint32 aIndex, TBool aVal);
       
  1118     
       
  1119     void Fill(TBool aVal);
       
  1120     void Fill(TUint32 aIndexFrom, TUint32 aIndexTo, TBool aVal);
       
  1121     void Invert();
       
  1122    
       
  1123     TBool operator==(const RBitVector& aRhs) const; 
       
  1124     TBool operator!=(const RBitVector& aRhs) const;
       
  1125 
       
  1126     //-- logical operations between 2 vectors. 
       
  1127     void And(const RBitVector& aRhs);
       
  1128     void Or (const RBitVector& aRhs);
       
  1129     void Xor(const RBitVector& aRhs);
       
  1130 
       
  1131     TBool Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const;
       
  1132 
       
  1133     /** Bit search specifiers */
       
  1134     enum TFindDirection
       
  1135         {
       
  1136         ELeft,      ///< Search from the given position to the left (towards lower index)
       
  1137         ERight,     ///< Search from the given position to the right (towards higher index)
       
  1138         ENearestL,  ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the left
       
  1139         ENearestR   ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the right
       
  1140 
       
  1141         //-- N.B the current position the search starts with isn't included to the search.
       
  1142         };
       
  1143 
       
  1144     TBool Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const;
       
  1145 
       
  1146     /** panic codes */
       
  1147     enum TPanicCode
       
  1148         {
       
  1149         EIndexOutOfRange,       ///< index out of range
       
  1150         EWrondFindDirection,    ///< a value doesn't belong to TFindDirection
       
  1151         ESizeMismatch,          ///< Size mismatch for binary operators
       
  1152         ENotInitialised,        ///< No memory allocated for the array
       
  1153         ENotImplemented,        ///< functionality isn't implemented
       
  1154         };
       
  1155 
       
  1156  protected:
       
  1157     
       
  1158     //-- these are outlawed. Can't use them because memory allocator can leave and we don't have conthrol on it  in these methods. 
       
  1159     RBitVector(const RBitVector& aRhs);            
       
  1160     RBitVector& operator=(const RBitVector& aRhs); 
       
  1161   
       
  1162     void Panic(TPanicCode aPanicCode) const;
       
  1163 
       
  1164     inline TUint32 WordNum(TUint32 aBitPos) const;
       
  1165     inline TUint32 BitInWord(TUint32 aBitPos) const;
       
  1166 
       
  1167  private:
       
  1168     TBool FindToRight(TUint32& aStartPos, TBool aBitVal) const;
       
  1169     TBool FindToLeft (TUint32& aStartPos, TBool aBitVal) const;
       
  1170     TBool FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const;
       
  1171    
       
  1172     inline TUint32 MaskLastWord(TUint32 aVal) const; 
       
  1173     inline TBool ItrLeft(TUint32& aIdx) const;
       
  1174     inline TBool ItrRight(TUint32& aIdx) const;
       
  1175 
       
  1176 
       
  1177  protected:
       
  1178 
       
  1179     TUint32   iNumBits; ///< number of bits in the vector
       
  1180     TUint32*  ipData;   ///< pointer to the data 
       
  1181     TUint32   iNumWords;///< number of 32-bit words that store bits
       
  1182     };
       
  1183 
       
  1184 
       
  1185 //-----------------------------------------------------------------------------
       
  1186 
       
  1187 
       
  1188 #include "sl_std.inl"
       
  1189 #include "sl_bpb.inl"
       
  1190 #include "fat_dir_entry.inl"
       
  1191 
       
  1192 #endif //SL_STD_H