userlibandfileserver/fileserver/sfat/fat_dir_entry.inl
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
child 15 4122176ea935
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// f32\sfat\inc\fat_dir_entry.inl
// 
//

/**
 @file
 @internalTechnology
*/

#if !defined(FAT_DIR_ENTRY_INL)
#define FAT_DIR_ENTRY_INL

//-------------------------------------------------------------------------------------------------------------------


/**
Defined cast of Fat directory entry data read to structure allowing access to data
*/
#define pDir ((SFatDirEntry*)&iData[0])


inline TFatDirEntry::TFatDirEntry() 
    {
    InitZ();
    }       

/** zero-fill the entry contents  */
inline void TFatDirEntry::InitZ() 
    {
    Mem::FillZ(iData, KSizeOfFatDirEntry);
    }

/**
Return the Dos name of a directory entry

@return A descriptor containing the Dos name of a directory entry
*/
inline const TPtrC8 TFatDirEntry::Name() const
    {return TPtrC8((TUint8*)&(pDir->iName),KFatDirNameSize);}
/**
@return The attributes for the Directory entry
*/
inline TInt TFatDirEntry::Attributes() const
    {return pDir->iAttributes;}
/**
@param aOffset This offset will be subtracted from the returned time.
@return Time of file modification
*/
inline TTime TFatDirEntry::Time(TTimeIntervalSeconds aOffset) const
    {
    TTime time=DosTimeToTTime(pDir->iTime,pDir->iDate);
    return time-=aOffset;
    }
/**
@return The Start cluster for the file or directory for this entry 
*/
inline TInt TFatDirEntry::StartCluster() const      
    {
    const TUint16 KStClustMaskHi = 0x0FFF;  
    return ((pDir->iStartClusterHi & KStClustMaskHi) << 16) | pDir->iStartClusterLo;
    }

/**
@return The size of file or directory for this entry 
*/
inline TUint32 TFatDirEntry::Size() const
    {return pDir->iSize;}
/**
@return True if the entry is erased
*/
inline TBool TFatDirEntry::IsErased() const
    {return (TBool)(iData[0]==KEntryErasedMarker);}
/**
@return True if the entry refers to the current directory
*/
inline TBool TFatDirEntry::IsCurrentDirectory() const
    {return (TBool)(iData[0]==KDotEntryByte && iData[1]==KBlankSpace);}
/**
@return True if the Entry refers to the parent directory
*/
inline TBool TFatDirEntry::IsParentDirectory() const
    {return (TBool)(iData[0]==KDotEntryByte && iData[1]==KDotEntryByte);}
/**
@return True if end of directory
*/
inline TBool TFatDirEntry::IsEndOfDirectory() const
    {return (TBool)(iData[0]==0x00);}
/**
Set the Dos name of a directory entry

@param aDes A descriptor containg the name
*/
inline void TFatDirEntry::SetName(const TDesC8& aDes)
    {
    __ASSERT_DEBUG(aDes.Length()<=KFatDirNameSize,Fault(EFatBadDirEntryParameter));
    TPtr8 name(pDir->iName,KFatDirNameSize);
    name=aDes;
    }
/**
Set the file or directory attributes for this entry

@param anAtts The file or directory attributes
*/
inline void TFatDirEntry::SetAttributes(TInt anAtts)
    {
    __ASSERT_DEBUG(!(anAtts&~KMaxTUint8),Fault(EFatBadDirEntryParameter));
    pDir->iAttributes=(TUint8)anAtts;
    }
/**
Set the modification time and date of the directory entry

@param aTime Modification time of the file or directory
@aOffset aOffset This offset will be added to the time. 
*/
inline void TFatDirEntry::SetTime(TTime aTime, TTimeIntervalSeconds aOffset)
    {
    aTime+=aOffset;
    pDir->iTime=(TUint16)DosTimeFromTTime(aTime);
    pDir->iDate=(TUint16)DosDateFromTTime(aTime);
    }

inline void TFatDirEntry::SetCreateTime(TTime aTime, TTimeIntervalSeconds aOffset)
    {
    aTime+=aOffset;
    pDir->iTimeC=(TUint16)DosTimeFromTTime(aTime);
    pDir->iDateC=(TUint16)DosDateFromTTime(aTime);
    }

/**
Set the start cluster number of the file or directory refered to by the entry

@param aStartCluster The start cluster number
*/
inline void TFatDirEntry::SetStartCluster(TInt aStartCluster)
    {
    pDir->iStartClusterLo=(TUint16)(aStartCluster);
    pDir->iStartClusterHi=(TUint16)(aStartCluster >> 16);
    }
/**
Set the size of the file or directory refered to by the entry

@param aFileSize Size of the file
*/
inline void TFatDirEntry::SetSize(TUint32 aFileSize)
    {pDir->iSize=aFileSize;}
/**
Set the directory entry as erased
*/
inline void TFatDirEntry::SetErased()
    {iData[0]=KEntryErasedMarker;}
/**
Set the current entry to refer to the current directory
*/
inline void TFatDirEntry::SetCurrentDirectory()
    {
    iData[0]='.';
    Mem::Fill(&iData[1],KFatDirNameSize-1,' ');
    }
/**
Set the current entry to refer to the parent directory
*/
inline void TFatDirEntry::SetParentDirectory()
    {
    iData[0]='.';iData[1]='.';
    Mem::Fill(&iData[2],KFatDirNameSize-2,' ');
    }
/**
Set the current entry to be the end of directory marker
*/
inline void TFatDirEntry::SetEndOfDirectory()
    {Mem::FillZ(&iData[0],KFatDirNameSize);}

/**
    Get VFAT entry ID. Uset by Rugged FAT and Scan Drive to fix broken entries
    Uses 1 byte from "Last Access Date" field, offset 19. Hack.
*/
TUint TFatDirEntry::RuggedFatEntryId() const
    {
    return pDir->iReserved2;
    }

/**
    Set VFAT entry ID. Uset by Rugged FAT and Scan Drive to fix broken entries
    Uses 1 byte from "Last Access Date" field, offset 19. Hack.
*/
void  TFatDirEntry::SetRuggedFatEntryId(TUint16 aId) 
    {
    pDir->iReserved2 = aId;
    }


/**
@return True if the entry is the start of a long name set of entries
*/
inline TBool TFatDirEntry::IsLongNameStart() const
    {return (TBool)((iData[0]&0x40) != 0);}
/**
@return True is the Entry is a VFat entry
*/
inline TBool TFatDirEntry::IsVFatEntry() const
    {return (TBool)(Attributes()==KVFatEntryAttribute && IsEndOfDirectory()==EFalse);}
/**
@return The number of following VFat entries
*/
inline TInt TFatDirEntry::NumFollowing() const
    {return (iData[0]&0x3F);}


inline TUint8 TFatDirEntry::CheckSum() const
    {
        ASSERT(IsVFatEntry());
        return iData[13];
    }



/**
@return  ETrue if the Directory entry contains garbage data
*/
inline TBool TFatDirEntry::IsGarbage() const
    {
    return (iData[0]==0xFF);
    }



#endif //FAT_DIR_ENTRY_INL