Subversion Repositories spk

Rev

Rev 4 | Blame | Compare with Previous | Last modification | View Log | RSS feed


#include <malloc.h>
#include "clsFile.h"

clsFILE::clsFILE()
{
        InitVars();
}

clsFILE::~clsFILE()
{
        // Cleanup
        Destroy();
}


//
// Open a file in the specified mode
//
BOOL clsFILE::GetFileHandle(char *szFilePath, DWORD dwMode)
{
        DWORD  dwFlags, dwAccess, dwShare;

        // destroy if sth is already loaded
        Destroy();

        // save path
        strcpy(cFilePath, szFilePath);

        // handle flags
        switch(dwMode)
        {
        case F_OPENEXISTING_R:
                bReadOnly = TRUE;
                dwFlags = OPEN_EXISTING;
                dwAccess = GENERIC_READ;
                dwShare = FILE_SHARE_READ;
                break;

        case F_OPENEXISTING_RW:
                bReadOnly = FALSE;
                dwFlags = OPEN_EXISTING;
                dwAccess = GENERIC_READ | GENERIC_WRITE;
                dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
                break;

        case F_CREATENEW:
                bReadOnly = FALSE;
                dwFlags = CREATE_ALWAYS;
                dwAccess = GENERIC_READ | GENERIC_WRITE;
                dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
                break;

        case F_TRUNCATE: // RW
                bReadOnly = FALSE;
                dwFlags = TRUNCATE_EXISTING;
                dwAccess = GENERIC_READ | GENERIC_WRITE;
                dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
                break;
        }

        TCHAR tempFilePath[MAX_PATH];
        MultiByteToWideChar(CP_UTF8,0,szFilePath,-1,tempFilePath,MAX_PATH);

        hFile = CreateFile(
                tempFilePath,
                dwAccess,
                dwShare,
                NULL,
                dwFlags,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
        if (hFile == (HANDLE)-1)
                return FALSE;

        return TRUE;
}

//
// opens a file with RW access if possible else just R
BOOL clsFILE::GetFileHandleWithMaxAccess(char* szFilePath)
{
        BOOL bRet;

        bRet = GetFileHandle(szFilePath, F_OPENEXISTING_RW);
        if (!bRet)
                bRet = GetFileHandle(szFilePath, F_OPENEXISTING_R);

        return bRet;
}

//
// Cleanup routine
//
BOOL clsFILE::Destroy()
{
        BOOL bRet = FALSE;

        // cleanup
        if (hFile != INVALID_HANDLE_VALUE)
                if (CloseHandle(hFile))
                        bRet = TRUE;
        if (pMap)
                free(pMap);

        // adjust vars
        InitVars();

        return bRet;
}

void clsFILE::InitVars()
{
        hFile        = INVALID_HANDLE_VALUE;
        pMap         = NULL;
        dwMapSize    = 0;

        return;
}

//
// returns:
// INVALID_HANDLE_VALUE - if no file is loaded
//
HANDLE clsFILE::GetHandle()
{
        return hFile;
}

BOOL clsFILE::IsFileReadOnly()
{
        return bReadOnly;
}

BOOL clsFILE::MapFile()
{
        DWORD dw, dwFSize;

        if (hFile == INVALID_HANDLE_VALUE)
                return FALSE;

        dwFSize = GetFSize();

        // map file
        pMap = malloc( dwFSize );
        if (!pMap)
                return FALSE;
        if (!ReadFile(hFile, pMap, dwFSize, &dw, NULL))
                return FALSE;

        // set vars
        dwMapSize = dwFSize;

        return TRUE;
}

void* clsFILE::GetMapPtr()
{
        return pMap;
}

BOOL clsFILE::UnmapFile()
{
        if (!pMap)
                return FALSE;

        free(pMap);
        pMap       = NULL;
        dwMapSize  = 0;

        return TRUE;
}

//
// change size of file memory
//
BOOL clsFILE::ReMapFile(DWORD dwNewSize)
{
        if (!pMap)
                return FALSE; // ERR

        pMap = realloc(pMap, dwNewSize);
        if (pMap)
        {
                pMap      = NULL;
                dwMapSize = dwNewSize;
                return TRUE; // OK
        }
        else
                return FALSE; // ERR
}

//
// returns:
// -1 in the case of an error
//
DWORD clsFILE::GetMapSize()
{
        if (!pMap)
                return (DWORD)-1; // ERR

        return dwMapSize;
}

BOOL clsFILE::IsMapped()
{
        return pMap != NULL ? TRUE : FALSE;
}

//
// copy mapping memory to file
//
BOOL clsFILE::FlushFileMap()
{
        if ( !Truncate() )
                return FALSE; // ERR

        return Write(pMap, dwMapSize);
}

BOOL clsFILE::FileExists(char* szFilePath)
{
        clsFILE   *f = new clsFILE;
        BOOL      b;

        b = f->GetFileHandle(szFilePath, F_OPENEXISTING_R);
        if ( b )
                f->Destroy();

        return b;
}

DWORD clsFILE::GetFSize()
{
        return GetFileSize(hFile, NULL);
}
        
//
// returns:
// NULL - if no file is loaded
//      
char* clsFILE::GetFilePath()
{
        if (hFile == (HANDLE)-1)
                return NULL;

        return cFilePath;
}

//
// write to file
//
BOOL clsFILE::Write(void* pBuff, DWORD dwc)
{
        DWORD  dwRet;
        BOOL   bRet;

        bRet = WriteFile(hFile, pBuff, dwc, &dwRet, NULL);
        
        return (bRet && dwc == dwRet) ? TRUE : FALSE;
}

//
// read from file
//
BOOL clsFILE::Read(void* pBuff, DWORD dwc)
{
        DWORD  dwRet;
        BOOL   bRet;

        bRet = ReadFile(hFile, pBuff, dwc, &dwRet, NULL);
        
        return (bRet && dwc == dwRet) ? TRUE : FALSE;
}

//
// set file pointer
//
BOOL clsFILE::SetFPointer(DWORD dwOff)
{
        DWORD dwRet;

        dwRet = SetFilePointer(hFile, dwOff, NULL, FILE_BEGIN);

        return (dwRet != (DWORD)-1) ? TRUE : FALSE;
}

BOOL clsFILE::Truncate()
{
        if (!SetFPointer(0))
                return FALSE; // ERR
        if (!SetEndOfFile(hFile))
                return FALSE; // ERR

        return TRUE; // OK
}

void clsFILE::SetMapPtrSize(void* ptr, DWORD dwSize)
{
        pMap      = ptr;
        dwMapSize = dwSize;

        return;
}