From 28b1ee4f16ae085ca270fc92529e5e1ac048e78c Mon Sep 17 00:00:00 2001 From: rude Date: Wed, 2 Sep 2009 22:47:11 +0200 Subject: [PATCH] Fixed bug which caused files opened in write mode to fail. --- src/modules/filesystem/physfs/File.cpp | 10 ++- src/modules/filesystem/physfs/Filesystem.cpp | 2 - src/modules/filesystem/physfs/wrap_File.cpp | 65 ++++++++++++++----- .../filesystem/physfs/wrap_Filesystem.cpp | 18 ++++- 4 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/modules/filesystem/physfs/File.cpp b/src/modules/filesystem/physfs/File.cpp index 1a826fab7..470dce8c9 100644 --- a/src/modules/filesystem/physfs/File.cpp +++ b/src/modules/filesystem/physfs/File.cpp @@ -46,10 +46,15 @@ namespace physfs bool File::open(Mode mode) { + // File must exist if read mode. + if((mode == READ)) + if(!PHYSFS_exists(filename.c_str())) + throw love::Exception("Could not open file %s. Does not exist.", filename.c_str()); + // Check whether the write directory is set. if((mode == APPEND || mode == WRITE) && (PHYSFS_getWriteDir() == 0)) if(!hack_setupWriteDirectory()) - return false; + throw love::Exception("Could not set write directory."); // File already open? if(file != 0) @@ -143,6 +148,9 @@ namespace physfs bool File::write(const void * data, int size) { + if(file == 0) + throw love::Exception("Could not write to file. File not open."); + // Try to write. int written = static_cast(PHYSFS_write(file, data, 1, size)); diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 133f2d193..03845890c 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -142,8 +142,6 @@ namespace physfs File * Filesystem::newFile(const char *filename) { - if (!PHYSFS_exists(filename)) - throw Exception("File %s doesn't exist", filename); return new File(filename); } diff --git a/src/modules/filesystem/physfs/wrap_File.cpp b/src/modules/filesystem/physfs/wrap_File.cpp index af64642bd..e07185011 100644 --- a/src/modules/filesystem/physfs/wrap_File.cpp +++ b/src/modules/filesystem/physfs/wrap_File.cpp @@ -20,6 +20,8 @@ #include "wrap_File.h" +#include + namespace love { namespace filesystem @@ -42,7 +44,16 @@ namespace physfs { File * file = luax_checkfile(L, 1); int mode = luaL_optint(L, 2, File::READ); - lua_pushboolean(L, file->open((File::Mode)mode) ? 1 : 0); + + try + { + lua_pushboolean(L, file->open((File::Mode)mode) ? 1 : 0); + } + catch(Exception e) + { + return luaL_error(L, e.what()); + } + return 1; } @@ -56,7 +67,17 @@ namespace physfs int w_File_read(lua_State * L) { File * file = luax_checkfile(L, 1); - Data * d = file->read(luaL_optint(L, 2, file->getSize())); + Data * d = 0; + + try + { + d = file->read(luaL_optint(L, 2, file->getSize())); + } + catch(Exception e) + { + return luaL_error(L, e.what()); + } + lua_pushlstring(L, (const char*) d->getData(), d->getSize()); lua_pushnumber(L, d->getSize()); d->release(); @@ -70,9 +91,21 @@ namespace physfs if ( file->getMode() == File::CLOSED ) return luaL_error(L, "File is not open."); if ( lua_isstring(L, 2) ) - result = file->write(lua_tostring(L, 2), luaL_optint(L, 3, lua_objlen(L, 2))); + { + try + { + result = file->write(lua_tostring(L, 2), luaL_optint(L, 3, lua_objlen(L, 2))); + } + catch(Exception e) + { + return luaL_error(L, e.what()); + } + + } else + { return luaL_error(L, "String expected."); + } lua_pushboolean(L, result); return 1; } @@ -201,21 +234,21 @@ namespace physfs return 0; } + static const luaL_Reg functions[] = { + { "getSize", w_File_getSize }, + { "open", w_File_open }, + { "close", w_File_close }, + { "read", w_File_read }, + { "write", w_File_write }, + { "eof", w_File_eof }, + { "tell", w_File_tell }, + { "seek", w_File_seek }, + { "lines", w_File_lines }, + { 0, 0 } + }; + int luaopen_file(lua_State * L) { - static const luaL_Reg functions[] = { - { "getSize", w_File_getSize }, - { "open", w_File_open }, - { "close", w_File_close }, - { "read", w_File_read }, - { "write", w_File_write }, - { "eof", w_File_eof }, - { "tell", w_File_tell }, - { "seek", w_File_seek }, - { "lines", w_File_lines }, - { 0, 0 } - }; - return luax_register_type(L, "File", functions); } diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index 732899ab4..d779fc6ba 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -166,12 +166,26 @@ namespace physfs int w_read(lua_State * L) { - return instance->read(L); + try + { + return instance->read(L); + } + catch(Exception e) + { + return luaL_error(L, e.what()); + } } int w_write(lua_State * L) { - return instance->write(L); + try + { + return instance->write(L); + } + catch(Exception e) + { + return luaL_error(L, e.what()); + } } int w_enumerate(lua_State * L)