Even if file exists, FileSystem might fail to open file.
if createAndOpenFile() returns 0, application will crash.
This code throws exception if the method returns 0.
Code: Select all
void IrrlichtResourceProvider::loadRawDataContainer(const String& filename,
RawDataContainer& output,
const String& resourceGroup)
{
String final_filename(getFinalFilename(filename, resourceGroup));
irr::u8* input;
irr::u32 input_size;
irr::io::IReadFile* f = d_fsys.createAndOpenFile(final_filename.c_str());
if (!f)
{
String sMsg("IrrlichtResourceProvider::loadRawDataContainer: "
"Filename supplied for loading must be valid");
sMsg += " [" + final_filename + "]";
CEGUI_THROW(InvalidRequestException(sMsg));
}
input_size = f->getSize();
input = new irr::u8[input_size];
f->read(input, input_size);
f->drop();
output.setData(input);
output.setSize(input_size);
}
if _IRR_WCHAR_FILESYSTEM is defined, Irrlicht is using wchar_t in FileSystem.
So this method should properly convert to wchar_t from UTF-32.
This option is required to use no ASCII character like Japanese character.
I achieved it by irrUString's conversion method.
It assumes wchar_t is Unicode, so it may not be compatible with all platforms.
http://irrlicht.sourceforge.net/phpBB2/ ... 8n&start=0
Code: Select all
void IrrlichtResourceProvider::loadRawDataContainer(const String& filename,
RawDataContainer& output,
const String& resourceGroup)
{
String final_filename(getFinalFilename(filename, resourceGroup));
irr::io::path irrFileName;
#ifdef _IRR_WCHAR_FILESYSTEM
irr::core::ustring converter((irr::uchar8_t*)final_filename.c_str());
irrFileName = converter.toWCHAR_s();
#else
irrFileName = final_filename.c_str();
#endif
irr::u8* input;
irr::u32 input_size;
irr::io::IReadFile* f = d_fsys.createAndOpenFile(irrFileName);
if (!f)
{
String sMsg("IrrlichtResourceProvider::loadRawDataContainer: "
"Filename supplied for loading must be valid");
sMsg += " [" + final_filename + "]";
CEGUI_THROW(InvalidRequestException(sMsg));
}
input_size = f->getSize();
input = new irr::u8[input_size];
f->read(input, input_size);
f->drop();
output.setData(input);
output.setSize(input_size);
}