/*++

Copyright (c) 1990 Microsoft Corporation

Module Name:

    rootdir.hxx

Abstract:

    This class is an implementation of FATDIR for the FAT root directory.

--*/

#if !defined(ROOTDIR_DEFN)

#define ROOTDIR_DEFN

#include "drive.hxx"
#include "fatdir.hxx"
#include "mem.hxx"
#include "secrun.hxx"

#if defined ( _AUTOCHECK_ ) || defined( _EFICHECK_ )
#define UFAT_EXPORT
#elif defined ( _UFAT_MEMBER_ )
#define UFAT_EXPORT    __declspec(dllexport)
#else
#define UFAT_EXPORT    __declspec(dllimport)
#endif

DECLARE_CLASS( ROOTDIR );


class ROOTDIR : public FATDIR {

        public:

        UFAT_EXPORT
        DECLARE_CONSTRUCTOR( ROOTDIR );

        UFAT_EXPORT
        VIRTUAL
        ~ROOTDIR(
                );

        NONVIRTUAL
        UFAT_EXPORT
        BOOLEAN
        Initialize(
            IN      PMEM                Mem,
            IN OUT  PLOG_IO_DP_DRIVE    Drive,
            IN      LBN                 StartingSector,
            IN      LONG                NumberOfEntries
            );

        NONVIRTUAL
        BOOLEAN
        Read(
            );

        NONVIRTUAL
        BOOLEAN
        Write(
            );

        NONVIRTUAL
        PVOID
        GetDirEntry(
            IN  LONG    EntryNumber
            );
        
        NONVIRTUAL
        LONG
        QueryNumberOfEntries(
            );

        private:

                VOID
                Construct (
                        );

        NONVIRTUAL
        VOID
        Destroy(
            );

        SECRUN  _secrun;
        LONG    _number_of_entries;

};

INLINE
BOOLEAN
ROOTDIR::Read(
    )
/*++

Routine Description:

    This routine reads the directory in from the disk.

Arguments:

    None.

Return Value:

    FALSE   - Failure.
    TRUE    - Success.

--*/
{
    return _secrun.Read();
}


INLINE
BOOLEAN
ROOTDIR::Write(
    )
/*++

Routine Description:

    This routine writes the drirectory to the disk.

Arguments:

    None.

Return Value:

    FALSE   - Failure.
    TRUE    - Success.

--*/
{
    return _secrun.Write();
}


INLINE
PVOID
ROOTDIR::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) _secrun.GetBuf() + BytesPerDirent*EntryNumber : NULL;
}

INLINE
LONG
ROOTDIR::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 // ROOTDIR_DEFN