add file.create_memory_device, app.create_memory_device
This commit is contained in:
parent
654267f2d4
commit
0c517709a1
@ -2,6 +2,7 @@
|
||||
|
||||
#include "debug/Logger.hpp"
|
||||
#include "io/devices/StdfsDevice.hpp"
|
||||
#include "io/devices/MemoryDevice.hpp"
|
||||
#include "io/devices/ZipFileDevice.hpp"
|
||||
#include "maths/util.hpp"
|
||||
#include "typedefs.hpp"
|
||||
@ -168,6 +169,18 @@ void EnginePaths::unmount(const std::string& name) {
|
||||
mounted.erase(found);
|
||||
}
|
||||
|
||||
std::string EnginePaths::createMemoryDevice() {
|
||||
auto device = std::make_unique<io::MemoryDevice>();
|
||||
std::string name;
|
||||
do {
|
||||
name = std::string("M.") + generate_random_base64<6>();
|
||||
} while (std::find(mounted.begin(), mounted.end(), name) != mounted.end());
|
||||
|
||||
io::set_device(name, std::move(device));
|
||||
mounted.push_back(name);
|
||||
return name;
|
||||
}
|
||||
|
||||
std::string EnginePaths::createWriteableDevice(const std::string& name) {
|
||||
const auto& found = writeables.find(name);
|
||||
if (found != writeables.end()) {
|
||||
|
||||
@ -58,6 +58,7 @@ public:
|
||||
void unmount(const std::string& name);
|
||||
|
||||
std::string createWriteableDevice(const std::string& name);
|
||||
std::string createMemoryDevice();
|
||||
|
||||
void setEntryPoints(std::vector<PathsRoot> entryPoints);
|
||||
|
||||
|
||||
@ -1,6 +1,21 @@
|
||||
#include "api_lua.hpp"
|
||||
|
||||
#include "io/io.hpp"
|
||||
#include "io/devices/MemoryDevice.hpp"
|
||||
|
||||
static int l_create_memory_device(lua::State* L) {
|
||||
auto name = lua::require_string(L, 1);
|
||||
if (io::get_device(name)) {
|
||||
throw std::runtime_error(
|
||||
"entry-point '" + std::string(name) + "' is already used"
|
||||
);
|
||||
}
|
||||
io::set_device(name, std::make_unique<io::MemoryDevice>());
|
||||
return 0;
|
||||
}
|
||||
|
||||
const luaL_Reg applib[] = {
|
||||
{"create_memory_device", lua::wrap<l_create_memory_device>},
|
||||
// see libcore.cpp an stdlib.lua
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
@ -221,6 +221,16 @@ static int l_unmount(lua::State* L) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int l_create_memory_device(lua::State* L) {
|
||||
if (lua::isstring(L, 1)) {
|
||||
throw std::runtime_error(
|
||||
"name must not be specified, use app.create_memory_device instead"
|
||||
);
|
||||
}
|
||||
auto& paths = engine->getPaths();
|
||||
return lua::pushstring(L, paths.createMemoryDevice());
|
||||
}
|
||||
|
||||
static int l_create_zip(lua::State* L) {
|
||||
io::path folder = lua::require_string(L, 1);
|
||||
io::path outFile = lua::require_string(L, 2);
|
||||
@ -336,7 +346,6 @@ static int l_write_descriptor(lua::State* L) {
|
||||
if (!stream->good()) {
|
||||
throw std::runtime_error("failed to write to stream");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -352,7 +361,6 @@ static int l_flush_descriptor(lua::State* L) {
|
||||
}
|
||||
|
||||
scripting::descriptors_manager::flush(descriptor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -364,13 +372,11 @@ static int l_close_descriptor(lua::State* L) {
|
||||
}
|
||||
|
||||
scripting::descriptors_manager::close(descriptor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int l_close_all_descriptors(lua::State* L) {
|
||||
scripting::descriptors_manager::close_all_descriptors();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -396,6 +402,7 @@ const luaL_Reg filelib[] = {
|
||||
{"is_writeable", lua::wrap<l_is_writeable>},
|
||||
{"mount", lua::wrap<l_mount>},
|
||||
{"unmount", lua::wrap<l_unmount>},
|
||||
{"create_memory_device", lua::wrap<l_create_memory_device>},
|
||||
{"create_zip", lua::wrap<l_create_zip>},
|
||||
{"__open_descriptor", lua::wrap<l_open_descriptor>},
|
||||
{"__has_descriptor", lua::wrap<l_has_descriptor>},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user