From bff2c1b5f1eacb13a2b592c4c85290063123533e Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 22 Jun 2013 14:58:12 +0200 Subject: [PATCH] Recreate love.filesystem.mount, adding mount and unmount, for your archive (and folder?) pleasure --HG-- branch : love.filesystem.mount2 --- src/modules/filesystem/physfs/Filesystem.cpp | 30 +++++++++++++++++++ src/modules/filesystem/physfs/Filesystem.h | 2 ++ .../filesystem/physfs/wrap_Filesystem.cpp | 19 ++++++++++++ .../filesystem/physfs/wrap_Filesystem.h | 2 ++ 4 files changed, 53 insertions(+) diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index e31ca96c0..8eb623a09 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -182,6 +182,36 @@ bool Filesystem::setupWriteDirectory() return true; } +bool Filesystem::mount(const char *archive, const char *mountpoint) +{ + if (!isInited) + return false; + + if (strstr(archive, "..")) // Not allowed for safety reasons + return false; + + std::string realPath = PHYSFS_getRealDir(archive); + realPath += LOVE_PATH_SEPARATOR; + realPath += archive; + + return PHYSFS_mount(realPath.c_str(), mountpoint, 0); +} + +bool Filesystem::unmount(const char *archive) +{ + if (!isInited) + return false; + + if (strstr(archive, "..")) // Not allowed for safety reasons + return false; + + std::string realPath = PHYSFS_getRealDir(archive); + realPath += LOVE_PATH_SEPARATOR; + realPath += archive; + + return PHYSFS_removeFromSearchPath(archive); +} + File *Filesystem::newFile(const char *filename) const { return new File(filename); diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 49fd6c70a..06d340a5a 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -143,6 +143,8 @@ public: * @param source Path to a directory or a .love-file. **/ bool setSource(const char *source); + bool mount(const char *archive, const char *mountpoint); + bool unmount(const char *archive); /** * Creates a new file. diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index b641b34fb..e5387c76f 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -99,6 +99,23 @@ int w_setSource(lua_State *L) return 0; } +int w_mount(lua_State *L) +{ + const char *archive = luaL_checkstring(L, 1); + const char *mountpoint = luaL_checkstring(L, 2); + + luax_pushboolean(L, instance->mount(archive, mountpoint)); + return 1; +} + +int w_unmount(lua_State *L) +{ + const char *archive = luaL_checkstring(L, 1); + + luax_pushboolean(L, instance->unmount(archive)); + return 1; +} + int w_newFile(lua_State *L) { const char *filename = luaL_checkstring(L, 1); @@ -544,6 +561,8 @@ static const luaL_Reg functions[] = { "setIdentity", w_setIdentity }, { "getIdentity", w_getIdentity }, { "setSource", w_setSource }, + { "mount", w_mount }, + { "unmount", w_unmount }, { "newFile", w_newFile }, { "getWorkingDirectory", w_getWorkingDirectory }, { "getUserDirectory", w_getUserDirectory }, diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.h b/src/modules/filesystem/physfs/wrap_Filesystem.h index cb21c96fc..456d250ae 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.h +++ b/src/modules/filesystem/physfs/wrap_Filesystem.h @@ -42,6 +42,8 @@ int w_setRelease(lua_State *L); int w_setIdentity(lua_State *L); int w_getIdentity(lua_State *L); int w_setSource(lua_State *L); +int w_mount(lua_State *L); +int w_unmount(lua_State *L); int w_newFile(lua_State *L); int w_newFileData(lua_State *L); int w_getWorkingDirectory(lua_State *L);