/*++ Copyright (c) 1990 Microsoft Corporation Module Name: filedir.hxx Abstract: This class is an implementation of FATDIR for all FAT directories that are implemented as files. In other words all FAT directories besides the root directory. Author: Norbert P. Kusters (norbertk) 4-Dec-90 --*/ #if !defined(FILEDIR_DEFN) #define FILEDIR_DEFN #include "cluster.hxx" #include "drive.hxx" #include "fatdir.hxx" #include "mem.hxx" #if defined ( _AUTOCHECK_ ) #define UFAT_EXPORT #elif defined ( _UFAT_MEMBER_ ) #define UFAT_EXPORT __declspec(dllexport) #else #define UFAT_EXPORT __declspec(dllimport) #endif // // Forward references // DECLARE_CLASS( FAT ); DECLARE_CLASS( FAT_SA ); DECLARE_CLASS( FILEDIR ); DECLARE_CLASS( LOG_IO_DP_DRIVE ); class FILEDIR : public FATDIR { public: UFAT_EXPORT DECLARE_CONSTRUCTOR( FILEDIR ); VIRTUAL UFAT_EXPORT ~FILEDIR( ); NONVIRTUAL UFAT_EXPORT BOOLEAN Initialize( IN OUT PMEM Mem, IN OUT PLOG_IO_DP_DRIVE Drive, IN PFAT_SA FatSuperArea, IN PCFAT Fat, IN ULONG StartingCluster ); NONVIRTUAL BOOLEAN Read( ); NONVIRTUAL BOOLEAN Write( ); NONVIRTUAL PVOID GetDirEntry( IN LONG EntryNumber ); NONVIRTUAL ULONG QueryLength( ) CONST; NONVIRTUAL ULONG QueryStartingCluster( ); NONVIRTUAL LONG QueryNumberOfEntries( ); private: NONVIRTUAL VOID Construct ( ); NONVIRTUAL VOID Destroy( ); CLUSTER_CHAIN _cluster; LONG _number_of_entries; ULONG _starting_cluster; }; INLINE BOOLEAN FILEDIR::Read( ) /*++ Routine Description: This routine reads the directory in from disk. Arguments: None. Return Value: FALSE - Failure. TRUE - Success. --*/ { return _cluster.Read(); } INLINE BOOLEAN FILEDIR::Write( ) /*++ Routine Description: This routine writes the directory to disk. Arguments: None. Return Value: FALSE - Failure. TRUE - Success. --*/ { return _cluster.Write(); } INLINE PVOID FILEDIR::GetDirEntry( IN LONG EntryNumber ) /*++ Routine Description: This routine returns a pointer to the beginning of the requested directory entry. The data may then be interpreted with a fat directory entry object. The return value will be NULL if a request for a directory entry is beyond the size of the directory. Arguments: EntryNumber - The desired entry number. The entries will be numbered 0, 1, 2, ... , n-1. Return Value: A pointer to the beginning of a directory entry or NULL. --*/ { return (EntryNumber < _number_of_entries) ? (PCHAR) _cluster.GetBuf() + BytesPerDirent*EntryNumber : NULL; } INLINE ULONG FILEDIR::QueryLength( ) CONST /*++ Routine Description: This routine returns the number of clusters in the underlying cluster chain. Arguments: None. Return Value: The number of clusters in the cluster chain. --*/ { return _cluster.QueryLength(); } INLINE ULONG FILEDIR::QueryStartingCluster( ) /*++ Routine Description: This routine returns the starting cluster of the directory. Arguments: None. Return Value: The starting cluster of the directory. --*/ { return _starting_cluster; } INLINE LONG FILEDIR::QueryNumberOfEntries( ) /*++ Routine Description: This routine returns the number of entries in the directory. Arguments: None. Return Value: The number of entries in the directory. --*/ { return _number_of_entries; } #endif // FILEDIR_DEFN