fixes
This commit is contained in:
parent
2a8fa4f2fa
commit
536035441a
@ -173,7 +173,7 @@ std::string EnginePaths::createMemoryDevice() {
|
|||||||
auto device = std::make_unique<io::MemoryDevice>();
|
auto device = std::make_unique<io::MemoryDevice>();
|
||||||
std::string name;
|
std::string name;
|
||||||
do {
|
do {
|
||||||
name = std::string("M.") + generate_random_base64<6>();
|
name = std::string("W.") + generate_random_base64<6>();
|
||||||
} while (std::find(mounted.begin(), mounted.end(), name) != mounted.end());
|
} while (std::find(mounted.begin(), mounted.end(), name) != mounted.end());
|
||||||
|
|
||||||
io::set_device(name, std::move(device));
|
io::set_device(name, std::move(device));
|
||||||
|
|||||||
@ -59,10 +59,16 @@ io::file_time_type io::MemoryDevice::lastWriteTime(std::string_view path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool io::MemoryDevice::exists(std::string_view path) {
|
bool io::MemoryDevice::exists(std::string_view path) {
|
||||||
|
if (path.empty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return nodes.find(std::string(path)) != nodes.end();
|
return nodes.find(std::string(path)) != nodes.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool io::MemoryDevice::isdir(std::string_view path) {
|
bool io::MemoryDevice::isdir(std::string_view path) {
|
||||||
|
if (path.empty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
const auto& found = nodes.find(std::string(path));
|
const auto& found = nodes.find(std::string(path));
|
||||||
if (found == nodes.end()) {
|
if (found == nodes.end()) {
|
||||||
return false;
|
return false;
|
||||||
@ -201,6 +207,9 @@ io::MemoryDevice::Node* io::MemoryDevice::createFile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
io::MemoryDevice::Dir* io::MemoryDevice::getDir(std::string_view path) {
|
io::MemoryDevice::Dir* io::MemoryDevice::getDir(std::string_view path) {
|
||||||
|
if (path.empty()) {
|
||||||
|
return &rootDir;
|
||||||
|
}
|
||||||
const auto& found = nodes.find(std::string(path));
|
const auto& found = nodes.find(std::string(path));
|
||||||
if (found == nodes.end()) {
|
if (found == nodes.end()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@ -62,6 +62,7 @@ namespace io {
|
|||||||
std::unique_ptr<PathsGenerator> list(std::string_view path) override;
|
std::unique_ptr<PathsGenerator> list(std::string_view path) override;
|
||||||
private:
|
private:
|
||||||
std::unordered_map<std::string, Node> nodes;
|
std::unordered_map<std::string, Node> nodes;
|
||||||
|
Dir rootDir {};
|
||||||
|
|
||||||
Node* createFile(std::string path, util::Buffer<char>&& content);
|
Node* createFile(std::string path, util::Buffer<char>&& content);
|
||||||
Dir* createDir(std::string path);
|
Dir* createDir(std::string path);
|
||||||
|
|||||||
@ -4,12 +4,16 @@
|
|||||||
#include "io/devices/MemoryDevice.hpp"
|
#include "io/devices/MemoryDevice.hpp"
|
||||||
|
|
||||||
static int l_create_memory_device(lua::State* L) {
|
static int l_create_memory_device(lua::State* L) {
|
||||||
auto name = lua::require_string(L, 1);
|
std::string name = lua::require_string(L, 1);
|
||||||
if (io::get_device(name)) {
|
if (io::get_device(name)) {
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"entry-point '" + std::string(name) + "' is already used"
|
"entry-point '" + name + "' is already used"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (name.find(':') != std::string::npos) {
|
||||||
|
throw std::runtime_error("invalid entry point name");
|
||||||
|
}
|
||||||
|
|
||||||
io::set_device(name, std::make_unique<io::MemoryDevice>());
|
io::set_device(name, std::make_unique<io::MemoryDevice>());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "engine/Engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "engine/EnginePaths.hpp"
|
#include "engine/EnginePaths.hpp"
|
||||||
#include "io/io.hpp"
|
#include "io/io.hpp"
|
||||||
|
#include "io/devices/MemoryDevice.hpp"
|
||||||
#include "io/devices/ZipFileDevice.hpp"
|
#include "io/devices/ZipFileDevice.hpp"
|
||||||
#include "util/stringutil.hpp"
|
#include "util/stringutil.hpp"
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
@ -49,6 +50,14 @@ static bool is_writeable(const std::string& entryPoint) {
|
|||||||
if (entryPoint.substr(0, 2) == "W.") {
|
if (entryPoint.substr(0, 2) == "W.") {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// todo: do better
|
||||||
|
auto device = io::get_device(entryPoint);
|
||||||
|
if (device == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (dynamic_cast<io::MemoryDevice*>(device.get())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (writeable_entry_points.find(entryPoint) != writeable_entry_points.end()) {
|
if (writeable_entry_points.find(entryPoint) != writeable_entry_points.end()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user