From aef47df40cc1d09affe19b409f110943dff3cf41 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Sun, 29 Dec 2024 16:43:49 -0400 Subject: [PATCH] Add love.filesystem.openNativeFile (name may change in the future) --- src/modules/filesystem/Filesystem.cpp | 6 ++++++ src/modules/filesystem/Filesystem.h | 6 +++++- src/modules/filesystem/wrap_Filesystem.cpp | 25 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/modules/filesystem/Filesystem.cpp b/src/modules/filesystem/Filesystem.cpp index df9863f7f..d1fff7597 100644 --- a/src/modules/filesystem/Filesystem.cpp +++ b/src/modules/filesystem/Filesystem.cpp @@ -20,6 +20,7 @@ // LOVE #include "Filesystem.h" +#include "NativeFile.h" #include "common/utf8.h" // Assume POSIX or Visual Studio. @@ -67,6 +68,11 @@ bool Filesystem::isAndroidSaveExternal() const return useExternal; } +NativeFile *Filesystem::openNativeFile(const char *path, File::Mode mode) const +{ + return new NativeFile(path, mode); +} + FileData *Filesystem::newFileData(const void *data, size_t size, const char *filename) const { FileData *fd = new FileData(size, std::string(filename)); diff --git a/src/modules/filesystem/Filesystem.h b/src/modules/filesystem/Filesystem.h index 9c08e4f6d..efdd1e7f9 100644 --- a/src/modules/filesystem/Filesystem.h +++ b/src/modules/filesystem/Filesystem.h @@ -58,6 +58,8 @@ namespace love namespace filesystem { +class NativeFile; + class Filesystem : public Module { public: @@ -173,6 +175,8 @@ class Filesystem : public Module **/ virtual File *openFile(const char *filename, File::Mode mode) const = 0; + NativeFile *openNativeFile(const char *path, File::Mode mode) const; + /** * Creates a new FileData object. Data will be copied. * @param data Pointer to the data. @@ -328,7 +332,7 @@ class Filesystem : public Module bool getRealPathType(const std::string &path, FileType &ftype) const; // Should we save external or internal for Android - bool useExternal; + bool useExternal = false; }; // Filesystem diff --git a/src/modules/filesystem/wrap_Filesystem.cpp b/src/modules/filesystem/wrap_Filesystem.cpp index 20e571144..ba6d82fe6 100644 --- a/src/modules/filesystem/wrap_Filesystem.cpp +++ b/src/modules/filesystem/wrap_Filesystem.cpp @@ -251,6 +251,30 @@ int w_openFile(lua_State *L) return 1; } +int w_openNativeFile(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + const char *modestr = luaL_checkstring(L, 2); + + File::Mode mode = File::MODE_CLOSED; + if (!File::getConstant(modestr, mode)) + return luax_enumerror(L, "file open mode", File::getConstants(mode), modestr); + + File *t = nullptr; + try + { + t = instance()->openNativeFile(path, mode); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + luax_pushtype(L, t); + t->release(); + return 1; +} + int w_newFile(lua_State* L) { luax_markdeprecated(L, 1, "love.filesystem.newFile", API_FUNCTION, DEPRECATED_RENAMED, "love.filesystem.openFile"); @@ -1027,6 +1051,7 @@ static const luaL_Reg functions[] = { "unmountFullPath", w_unmountFullPath }, { "unmountCommonPath", w_unmountCommonPath }, { "openFile", w_openFile }, + { "openNativeFile", w_openNativeFile }, { "getFullCommonPath", w_getFullCommonPath }, { "getWorkingDirectory", w_getWorkingDirectory }, { "getUserDirectory", w_getUserDirectory },