Danbias/Code/Misc/Resource/Loaders/ByteLoader.cpp

177 lines
4.0 KiB
C++

/////////////////////////////////////////////////////////////////////
// Created by [Dennis Andersen] [2013]
/////////////////////////////////////////////////////////////////////
#include "..\OResource.h"
#include "..\..\Utilities.h"
#include <fstream>
using namespace Oyster::Resource;
bool readANSI = false;
bool ReadFromFile(const wchar_t fileName[], const wchar_t openFlag[], std::wstring& outData, size_t elemSize)
{
size_t bytesTotal = 0;
size_t bytesRead = 0;
FILE *stream;
if( _wfopen_s( &stream, fileName, openFlag ) == 0 )
{
//Get size of the file
fseek(stream, 0L, SEEK_END);
bytesTotal = ftell(stream);
fseek(stream, 0L, SEEK_SET);
//Sanity check
if(bytesTotal == 0) return false;
//Create the new byte buffer
wchar_t *buff = new wchar_t[bytesTotal + 1];
//Read the bytes to the end
bytesRead = fread_s( buff, bytesTotal, elemSize, bytesTotal ,stream );
fclose( stream );
//Did we read enough bytes
if(!readANSI && bytesRead != bytesTotal) return false;
//Add delimiter
buff[bytesRead] = L'\0';
outData.resize(bytesTotal);
outData = buff;
delete [] buff;
}
else
{
std::wstring msg = L"Failed to open file: \n";
msg.append(fileName);
return false;
}
return true;
}
bool ReadFromFile(const wchar_t fileName[], const char openFlag[], std::string& outData, size_t elemSize)
{
std::string sFilename;
std::wstring wsFile = fileName;
::Utility::String::WStringToString(wsFile, sFilename);
size_t bytesTotal = 0;
size_t bytesRead = 0;
FILE *stream;
if( fopen_s( &stream, sFilename.c_str(), openFlag ) == 0 )
{
//Get size of the file
fseek(stream, 0L, SEEK_END);
bytesTotal = ftell(stream);
fseek(stream, 0L, SEEK_SET);
fflush(stream);
//Sanity check
if(bytesTotal == 0) return false;
//Create the new byte buffer
char *buff = new char[bytesTotal + 1];
//Read the bytes to the end
bytesRead = fread_s( buff, bytesTotal, elemSize, bytesTotal ,stream );
fclose( stream );
//Did we read enough bytes (Get the bytes if we read with ANSI since the hidden characters is ignored)
if(!readANSI && bytesRead != bytesTotal) return false;
buff[bytesRead + 1];
outData.clear();
outData.resize(bytesRead);
memcpy(&outData[0], &buff[0], bytesRead);
delete [] buff;
}
else
{
std::string msg = "Failed to open file: \n";
msg.append(sFilename.c_str());
return false;
}
return true;
}
OResource* OResource::ByteLoader(const wchar_t filename[], ResourceType type, OResource* old)
{
OResource *resource = old;
std::wstring wOut;
std::string sOut;
bool success = false;
switch (type)
{
case Oyster::Resource::ResourceType_Byte_Raw:
success = ReadFromFile(filename, "rb", sOut, sizeof(char));
break;
case Oyster::Resource::ResourceType_Byte_ANSI:
readANSI = true;
success = ReadFromFile(filename, "r", sOut, sizeof(char));
readANSI = false;
break;
case Oyster::Resource::ResourceType_Byte_UTF8:
success = ReadFromFile(filename, "r, ccs=UTF-8", sOut, sizeof(char));
break;
case Oyster::Resource::ResourceType_Byte_UNICODE:
success = ReadFromFile(filename, "r, ccs=UNICODE", sOut, sizeof(char));
break;
case Oyster::Resource::ResourceType_Byte_UTF16LE:
success = ReadFromFile(filename, "r, ccs=UTF-16LE", sOut, sizeof(char));
break;
}
if(!success) return 0;
if(wOut.size())
{
//const wchar_t *data = new wchar_t[wOut.size()];
//resource = new OResource((void*)data, type, (sizeof(wchar_t) * wOut.size()), sizeof(wchar_t), filename);
}
else if(sOut.size())
{
char *data = new char[sOut.size()+1];
data[sOut.size()] = '\0';
memcpy(&data[0], &sOut[0], sOut.size());
if(!old)
{
resource = new OResource((OHRESOURCE)data, type, (sizeof(char) * sOut.size()), sizeof(char), filename);
}
else
{
old->resourceData = (OHRESOURCE)data;
}
}
return resource;
}
void OResource::ByteUnloader()
{
delete [] ((char*)this->resourceData);
this->resourceData = 0;
}
OResource* OResource::ByteReloader()
{
ByteUnloader();
return ByteLoader(this->resourceFilename.c_str(), this->resourceType, this);
}