#include "pch.h"


////////////////////////////////////////////////////////////////////////////////
//
// ZFile
//
////////////////////////////////////////////////////////////////////////////////
ZFile::ZFile(const PathString& strPath, DWORD how) : 
    m_p(NULL)
{
    WCHAR wszPath[MAX_PATH];
    
    mbstowcs(wszPath, (LPCSTR)strPath, MAX_PATH);
    if (INVALID_HANDLE_VALUE == (m_handle = CreateFileForMapping( wszPath, GENERIC_READ, FILE_SHARE_READ, NULL, 
                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)))
        {
        ZString str = "Failed to open file: " + strPath + " (code = " + ZString((int)GetLastError()) + ")\r\n";
        debugf(str);
        }
    else
        {
        ZString str = "Opened file: " + strPath + "\r\n";
        debugf(str);
        }
}

ZFile::~ZFile()
{
    if (m_p) {
        UnmapViewOfFile(m_p);
        CloseHandle(m_hfileMapping);
    }
}

bool ZFile::IsValid()
{
     return m_handle != (HANDLE)-1;
}

DWORD ZFile::Read(void* p, DWORD length)
{
    DWORD cbActual;

    ReadFile(m_handle, p, length, (LPDWORD)&cbActual, NULL);
    return cbActual;
}

DWORD ZFile::Write(void* p, DWORD length)
{
    DWORD cbActual;

    WriteFile(m_handle, p, length, (LPDWORD)&cbActual, NULL);

    ZAssert(cbActual == length);

    return cbActual;
}

bool ZFile::Write(const ZString& str)
{
    return (Write((void*)(PCC)str, str.GetLength()) != 0);
}

bool  ZFile::WriteString(const ZString& str)
{
    return (Write((void*)(PCC)str, str.GetLength() + 1) != 0);
}

bool ZFile::Write(DWORD value)
{
    return (Write(&value, 4) != 0);
}

bool ZFile::Write(int value)
{
    return (Write(&value, 4) != 0);
}

bool ZFile::Write(float value)
{
    return (Write(&value, 4) != 0);
}

int ZFile::GetLength()
{
    return GetFileSize(m_handle, NULL);
}

void* ZFile::GetPointer()
{
    if (m_p != NULL) {
        return m_p;
    }

    m_hfileMapping = CreateFileMapping(m_handle, 0, PAGE_READONLY, 0, 0, NULL);
    if (m_hfileMapping == (HANDLE)-1) {
        ZError("Can't map file");
        return NULL;
    }

    m_p = MapViewOfFile(m_hfileMapping, FILE_MAP_READ, 0, 0, 0);

    return m_p;
}

/*
    void* m_p;
    char* m_pRead;
	DWORD m_dwSize;
	DWORD m_dwRead;

////////////////////////////////////////////////////////////////////////////////
//
// ZFile
//
////////////////////////////////////////////////////////////////////////////////

ZFile::ZFile(const PathString& strPath, DWORD how) : 
    m_p(NULL),
    m_pRead(NULL),
	m_dwSize(0),
	m_dwRead(0)
{
	HRSRC       hrsrc;
    HGLOBAL     hglobal;
    TCHAR       outbuf[256];

    ZString strFile = strPath;
    if (!strPath.GetExtension().IsEmpty())
        strFile = strFile.LeftOf(strPath.GetExtension().GetLength()+1) + strPath.GetExtension();

    WCHAR wszFile[MAX_PATH];
    mbstowcs(wszFile, (LPCSTR)strFile, MAX_PATH);

    // Handles obtained through FindResource and LoadResource do not have
    // to be freed or released.  This is done automatically.
	hrsrc = FindResource (GetModuleHandle(NULL), wszFile, RT_RCDATA);
    if (hrsrc == NULL) 
        {
        wsprintf (outbuf, TEXT("ERROR: Could not find resource \"%s\".\r\n"), wszFile);
        OutputDebugString (outbuf);
        return;
        }

    m_dwSize = SizeofResource(GetModuleHandle(NULL), hrsrc); 

    // Load the resource.
    wsprintf (outbuf, TEXT("Loading the resource \"%s\".\r\n"), wszFile);
    OutputDebugString (outbuf);
    hglobal = LoadResource (GetModuleHandle(NULL), hrsrc);
    if (hglobal == NULL) 
		{
        wsprintf (outbuf, TEXT("ERROR: Could not load the resource \"%s\".\r\n"), wszFile);
        OutputDebugString (outbuf);
    	return;
		}

    // Get pointer to raw data in resource.
    m_p = LockResource (hglobal);
    m_pRead = (char*)m_p;
}

ZFile::~ZFile()
{
}

bool ZFile::IsValid()
{
    return m_p != NULL;
}

DWORD ZFile::Read(void* p, DWORD length)
{
	DWORD cbActual = length < (m_dwSize - m_dwRead) ? length : (m_dwSize - m_dwRead);

    if (p)
		{
		memcpy(p, m_pRead, cbActual);
		m_dwRead += cbActual;
		m_pRead += cbActual;
		}

    return cbActual;
}

DWORD ZFile::Write(void* p, DWORD length)
{
    return 0;
}

bool ZFile::Write(const ZString& str)
{
    return 0;
}

bool  ZFile::WriteString(const ZString& str)
{
    return 0;
}

bool ZFile::Write(DWORD value)
{
    return 0;
}

bool ZFile::Write(int value)
{
    return 0;
}

bool ZFile::Write(float value)
{
    return 0;
}

int ZFile::GetLength()
{
    return (int)m_dwSize;
}

void* ZFile::GetPointer()
{
    return m_p;
}
*/