#include "Precomp.h"

#include "ReiserFileSystem.h"

#include "reiserfs.h"


ReiserFileSystem::ReiserFileSystem(const DWORD disk, const LONGLONG startingOffset, const LONGLONG length)
    :   m_Disk(disk, startingOffset, length)
{
    m_Partition = NULL;
}

ReiserFileSystem::~ReiserFileSystem()
{
    delete m_Partition;
}

HANDLE ReiserFileSystem::OpenFile(LPCTSTR szFilename) const
{
    // STUPID FUCKIN CONST SHIT MAN!

    ((ReiserFileSystem*)this)->MakeSurePartitionIsOpen();

    TRACE(("OpenFile '%s'\n", szFilename ))

    LPRFS_FILE_DATA h = m_Partition->GetFile(szFilename);
    if( h )
    {
        return (HANDLE) h;
    } 
    return INVALID_HANDLE_VALUE;
}

void ReiserFileSystem::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD NumberOfBytesToRead, DWORD& NumberOfBytesRead) const
{
    LPRFS_FILE_DATA h = (LPRFS_FILE_DATA) hFile;
    NumberOfBytesRead = 0;
    if( h->dwReadPos < h->dwSize )
    {
        if( ( NumberOfBytesToRead + h->dwReadPos ) > h->dwSize )
        {
            NumberOfBytesToRead = h->dwSize - h->dwReadPos;
        }
        CopyMemory((LPBYTE)lpBuffer, h->bMemory+h->dwReadPos, NumberOfBytesToRead );
        h->dwReadPos += NumberOfBytesToRead;
        NumberOfBytesRead = NumberOfBytesToRead;
    }
    throw "DONE";

}

void ReiserFileSystem::CloseFile(HANDLE hFile) const
{
    if( hFile && (hFile != INVALID_HANDLE_VALUE) )
        delete (LPRFS_FILE_DATA) hFile;
}

void ReiserFileSystem::MakeSurePartitionIsOpen()
{
    if( m_Partition == NULL )
    {
        m_Partition = new ReiserFsPartition(&m_Disk);
        if( !m_Partition->Open() )
        {
            delete m_Partition;
            m_Partition = NULL;
        }
    }
}

HANDLE ReiserFileSystem::FindFirstFile(LPCTSTR szPath) const
{
    // STUPID FUCKIN CONST SHIT MAN!

    ((ReiserFileSystem*)this)->MakeSurePartitionIsOpen();

    TRACE(("FindFirstFile '%s'\n", szPath ))

    PList* h = new PList;
    if( h )
    {
        if( m_Partition->ListDir(h,szPath) )
        {
            return (HANDLE) h;
        } 
        delete h;
    }
    return INVALID_HANDLE_VALUE;
}

bool ReiserFileSystem::FindNextFile(HANDLE hFind, UNIX_FILEINFO& FileInfo) const
{
    PList* h = (PList*) hFind;
    ReiserFsFileInfo* fi = (ReiserFsFileInfo*) h->m_pHead;
    if( fi )
    {
	    FileInfo.i_mode = fi->m_stat.sd_mode;		/* File mode (permissions)*/
	    FileInfo.i_uid = fi->m_stat.sd_uid;		/* Low 16 bits of Owner Uid */
	    FileInfo.i_gid = fi->m_stat.sd_gid;		/* Low 16 bits of Group Id */
	    FileInfo.i_size = fi->m_stat.sd_size;		/* Size in bytes */
	    FileInfo.i_atime = fi->m_stat.sd_atime;	/* Access time */
	    FileInfo.i_ctime = fi->m_stat.sd_mtime;	/* Creation time */
	    FileInfo.i_mtime = fi->m_stat.sd_ctime;	/* Modification time */
        strncpy( FileInfo.szFileName, fi->m_strName, UNIX_FILENAME_LENGTH );
        h->Delete(fi);
        return true;
    }
    return false;
}

void ReiserFileSystem::CloseFind(HANDLE hFind) const
{
    if( hFind && (hFind != INVALID_HANDLE_VALUE) )
        delete (PList*) hFind;
}


syntax highlighted by Code2HTML, v. 0.9.1