Page 1 of 1

IrrlichtResourceProvider::loadRawDataContainer fix

Posted: Sun Sep 19, 2010 13:20
by vroad
IrrlichtResourceProvider now use existFile() method to know whether file exists.
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);
}

Re: IrrlichtResourceProvider::loadRawDataContainer fix

Posted: Tue Sep 21, 2010 09:32
by CrazyEddie
Sorry to always be a moaning git, but please read this: http://www.cegui.org.uk/docs/current/devel.html

Basically, you need to provide any modifications in unified diff format, otherwise I'm not going to bother even looking ;)

Thanks,

CE.

Re: IrrlichtResourceProvider::loadRawDataContainer fix

Posted: Tue Sep 21, 2010 14:11
by vroad
Basically, you need to provide any modifications in unified diff format, otherwise I'm not going to bother even looking

I don't know that, sorry.
I created path using TortoiseSVN and posted(only first one). Is this OK?

http://www.cegui.org.uk/mantis/view.php?id=395

Re: IrrlichtResourceProvider::loadRawDataContainer fix

Posted: Wed Sep 22, 2010 08:53
by CrazyEddie
Yeah, this looks more like it, thanks :)

CE