Compare commits
4 Commits
671dd86206
...
4e27a4c1f5
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e27a4c1f5 | |||
| 4ef31762d0 | |||
| 8b22a8f339 | |||
| d45ff05bcd |
45
deps/ox/src/ox/fs/filesystem/filesystem.cpp
vendored
45
deps/ox/src/ox/fs/filesystem/filesystem.cpp
vendored
@@ -37,6 +37,30 @@ Error FileSystem::read(const FileAddress &addr, void *buffer, std::size_t size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<Buffer> FileSystem::read(FileAddress const &addr, size_t const size) noexcept {
|
||||||
|
Result<Buffer> out;
|
||||||
|
out.value.resize(size);
|
||||||
|
switch (addr.type()) {
|
||||||
|
case FileAddressType::Inode:
|
||||||
|
OX_RETURN_ERROR(readFileInode(addr.getInode().value, out.value.data(), size));
|
||||||
|
break;
|
||||||
|
case FileAddressType::ConstPath:
|
||||||
|
case FileAddressType::Path:
|
||||||
|
OX_RETURN_ERROR(readFilePath(StringView{addr.getPath().value}, out.value.data(), size));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ox::Error{1};
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<Buffer> FileSystem::read(StringViewCR path, size_t const size) noexcept {
|
||||||
|
Result<Buffer> out;
|
||||||
|
out.value.resize(size);
|
||||||
|
OX_RETURN_ERROR(readFilePath(path, out.value.data(), size));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
Result<Buffer> FileSystem::read(const FileAddress &addr) noexcept {
|
Result<Buffer> FileSystem::read(const FileAddress &addr) noexcept {
|
||||||
OX_REQUIRE(s, stat(addr));
|
OX_REQUIRE(s, stat(addr));
|
||||||
Buffer buff(static_cast<std::size_t>(s.size));
|
Buffer buff(static_cast<std::size_t>(s.size));
|
||||||
@@ -51,18 +75,33 @@ Result<Buffer> FileSystem::read(StringViewCR path) noexcept {
|
|||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error FileSystem::read(const FileAddress &addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept {
|
Error FileSystem::read(
|
||||||
|
FileAddress const &addr,
|
||||||
|
std::size_t const readStart,
|
||||||
|
std::size_t const readSize,
|
||||||
|
void *buffer,
|
||||||
|
std::size_t *size) noexcept {
|
||||||
switch (addr.type()) {
|
switch (addr.type()) {
|
||||||
case FileAddressType::Inode:
|
case FileAddressType::Inode:
|
||||||
return read(addr.getInode().value, readStart, readSize, buffer, size);
|
return readFileInodeRange(addr.getInode().value, readStart, readSize, buffer, size);
|
||||||
case FileAddressType::ConstPath:
|
case FileAddressType::ConstPath:
|
||||||
case FileAddressType::Path:
|
case FileAddressType::Path:
|
||||||
return ox::Error(2, "Unsupported for path lookups");
|
return readFilePathRange(addr.getPath().value, readStart, readSize, buffer, size);
|
||||||
default:
|
default:
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<size_t> FileSystem::read(
|
||||||
|
StringViewCR path,
|
||||||
|
std::size_t const readStart,
|
||||||
|
std::size_t const readSize,
|
||||||
|
Span<char> buff) noexcept {
|
||||||
|
size_t szOut{buff.size()};
|
||||||
|
OX_RETURN_ERROR(readFilePathRange(path, readStart, readSize, buff.data(), &szOut));
|
||||||
|
return szOut;
|
||||||
|
}
|
||||||
|
|
||||||
Error FileSystem::write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
Error FileSystem::write(const FileAddress &addr, const void *buffer, uint64_t size, FileType fileType) noexcept {
|
||||||
switch (addr.type()) {
|
switch (addr.type()) {
|
||||||
case FileAddressType::Inode:
|
case FileAddressType::Inode:
|
||||||
|
|||||||
38
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
38
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
@@ -41,6 +41,10 @@ class FileSystem {
|
|||||||
|
|
||||||
Error read(const FileAddress &addr, void *buffer, std::size_t size) noexcept;
|
Error read(const FileAddress &addr, void *buffer, std::size_t size) noexcept;
|
||||||
|
|
||||||
|
Result<Buffer> read(FileAddress const &addr, size_t size) noexcept;
|
||||||
|
|
||||||
|
Result<Buffer> read(StringViewCR path, size_t size) noexcept;
|
||||||
|
|
||||||
Result<Buffer> read(const FileAddress &addr) noexcept;
|
Result<Buffer> read(const FileAddress &addr) noexcept;
|
||||||
|
|
||||||
Result<Buffer> read(StringViewCR path) noexcept;
|
Result<Buffer> read(StringViewCR path) noexcept;
|
||||||
@@ -53,7 +57,24 @@ class FileSystem {
|
|||||||
return readFileInode(inode, buffer, buffSize);
|
return readFileInode(inode, buffer, buffSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error read(const FileAddress &addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept;
|
Error read(
|
||||||
|
FileAddress const &addr,
|
||||||
|
size_t readStart,
|
||||||
|
size_t readSize,
|
||||||
|
void *buffer,
|
||||||
|
size_t *size) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* @param readStart
|
||||||
|
* @param readSize
|
||||||
|
* @param buffer
|
||||||
|
* @param size
|
||||||
|
* @return error or number of bytes read
|
||||||
|
*/
|
||||||
|
Result<size_t> read(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, ox::Span<char> buff) noexcept;
|
||||||
|
|
||||||
virtual Result<Vector<String>> ls(StringViewCR dir) const noexcept = 0;
|
virtual Result<Vector<String>> ls(StringViewCR dir) const noexcept = 0;
|
||||||
|
|
||||||
@@ -140,7 +161,10 @@ class FileSystem {
|
|||||||
|
|
||||||
virtual Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept = 0;
|
virtual Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept = 0;
|
||||||
|
|
||||||
virtual Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept = 0;
|
virtual Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept = 0;
|
||||||
|
|
||||||
|
virtual Error readFileInodeRange(uint64_t inode, size_t readStart, size_t readSize, void *buffer, size_t *size) noexcept = 0;
|
||||||
|
|
||||||
virtual Error removePath(StringViewCR path, bool recursive) noexcept = 0;
|
virtual Error removePath(StringViewCR path, bool recursive) noexcept = 0;
|
||||||
|
|
||||||
@@ -211,6 +235,9 @@ class FileSystemTemplate: public MemFS {
|
|||||||
|
|
||||||
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
||||||
|
|
||||||
|
Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept override;
|
||||||
|
|
||||||
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
||||||
|
|
||||||
Result<const char*> directAccessInode(uint64_t) const noexcept override;
|
Result<const char*> directAccessInode(uint64_t) const noexcept override;
|
||||||
@@ -358,6 +385,13 @@ Error FileSystemTemplate<FileStore, Directory>::readFileInodeRange(uint64_t inod
|
|||||||
return m_fs.read(inode, readStart, readSize, reinterpret_cast<uint8_t*>(buffer), size);
|
return m_fs.read(inode, readStart, readSize, reinterpret_cast<uint8_t*>(buffer), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename FileStore, typename Directory>
|
||||||
|
Error FileSystemTemplate<FileStore, Directory>::readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept {
|
||||||
|
OX_REQUIRE(s, stat(path));
|
||||||
|
return readFileInodeRange(s.inode, readStart, readSize, buffer, buffSize);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
Error FileSystemTemplate<FileStore, Directory>::removePath(StringViewCR path, bool recursive) noexcept {
|
Error FileSystemTemplate<FileStore, Directory>::removePath(StringViewCR path, bool recursive) noexcept {
|
||||||
OX_REQUIRE(fd, fileSystemData());
|
OX_REQUIRE(fd, fileSystemData());
|
||||||
|
|||||||
19
deps/ox/src/ox/fs/filesystem/passthroughfs.cpp
vendored
19
deps/ox/src/ox/fs/filesystem/passthroughfs.cpp
vendored
@@ -154,6 +154,25 @@ Error PassThroughFS::readFileInode(uint64_t, void*, std::size_t) noexcept {
|
|||||||
return ox::Error(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS");
|
return ox::Error(1, "readFileInode(uint64_t, void*, std::size_t) is not supported by PassThroughFS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Error PassThroughFS::readFilePathRange(
|
||||||
|
StringViewCR path, size_t const readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept {
|
||||||
|
try {
|
||||||
|
std::ifstream file(m_path / stripSlash(path), std::ios::binary | std::ios::ate);
|
||||||
|
auto const size = static_cast<size_t>(file.tellg());
|
||||||
|
readSize = ox::min(readSize, size);
|
||||||
|
file.seekg(static_cast<off_t>(readStart), std::ios::beg);
|
||||||
|
if (readSize > *buffSize) {
|
||||||
|
oxTracef("ox.fs.PassThroughFS.read.error", "Read failed: Buffer too small: {}", path);
|
||||||
|
return ox::Error{1};
|
||||||
|
}
|
||||||
|
file.read(static_cast<char*>(buffer), static_cast<std::streamsize>(readSize));
|
||||||
|
return {};
|
||||||
|
} catch (std::fstream::failure const &f) {
|
||||||
|
oxTracef("ox.fs.PassThroughFS.read.error", "Read of {} failed: {}", path, f.what());
|
||||||
|
return ox::Error{2};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Error PassThroughFS::readFileInodeRange(uint64_t, std::size_t, std::size_t, void*, std::size_t*) noexcept {
|
Error PassThroughFS::readFileInodeRange(uint64_t, std::size_t, std::size_t, void*, std::size_t*) noexcept {
|
||||||
// unsupported
|
// unsupported
|
||||||
return ox::Error(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS");
|
return ox::Error(1, "read(uint64_t, std::size_t, std::size_t, void*, std::size_t*) is not supported by PassThroughFS");
|
||||||
|
|||||||
@@ -71,6 +71,9 @@ class PassThroughFS: public FileSystem {
|
|||||||
|
|
||||||
Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept override;
|
Error readFileInode(uint64_t inode, void *buffer, std::size_t size) noexcept override;
|
||||||
|
|
||||||
|
Error readFilePathRange(
|
||||||
|
StringViewCR path, size_t readStart, size_t readSize, void *buffer, size_t *buffSize) noexcept override;
|
||||||
|
|
||||||
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
Error readFileInodeRange(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override;
|
||||||
|
|
||||||
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
Error removePath(StringViewCR path, bool recursive) noexcept override;
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ ox::Error RotateCommand::redo() noexcept {
|
|||||||
switch (m_dir) {
|
switch (m_dir) {
|
||||||
case Direction::Left:
|
case Direction::Left:
|
||||||
rotateLeft(ss, m_pt1, m_pt2);
|
rotateLeft(ss, m_pt1, m_pt2);
|
||||||
break;
|
break;
|
||||||
case Direction::Right:
|
case Direction::Right:
|
||||||
rotateRight(ss, m_pt1, m_pt2);
|
rotateRight(ss, m_pt1, m_pt2);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ ox::Error TileSheetEditorModel::markUpdatedCmdId(studio::UndoCommand const*cmd)
|
|||||||
m_pal = keel::AssetRef<Palette>{};
|
m_pal = keel::AssetRef<Palette>{};
|
||||||
}
|
}
|
||||||
m_palettePage = ox::min<size_t>(pal().pages.size(), 0);
|
m_palettePage = ox::min<size_t>(pal().pages.size(), 0);
|
||||||
|
setPalPath();
|
||||||
paletteChanged.emit();
|
paletteChanged.emit();
|
||||||
}
|
}
|
||||||
auto const tsCmd = dynamic_cast<TileSheetCommand const*>(cmd);
|
auto const tsCmd = dynamic_cast<TileSheetCommand const*>(cmd);
|
||||||
|
|||||||
@@ -53,10 +53,12 @@ static ox::Error buildUuidMap(Context &ctx, ox::StringViewCR path) noexcept {
|
|||||||
OX_REQUIRE_M(filePath, ox::join("/", ox::Array<ox::StringView, 2>{path, f}));
|
OX_REQUIRE_M(filePath, ox::join("/", ox::Array<ox::StringView, 2>{path, f}));
|
||||||
OX_REQUIRE(stat, ctx.rom->stat(filePath));
|
OX_REQUIRE(stat, ctx.rom->stat(filePath));
|
||||||
if (stat.fileType == ox::FileType::NormalFile) {
|
if (stat.fileType == ox::FileType::NormalFile) {
|
||||||
OX_REQUIRE(data, ctx.rom->read(filePath));
|
ox::Array<char, K1HdrSz> buff;
|
||||||
auto const [hdr, err] = readAssetHeader(data);
|
OX_RETURN_ERROR(
|
||||||
|
ctx.rom->read(filePath, 0, buff.size(), buff));
|
||||||
|
auto const [uuid, err] = readUuidHeader(buff);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
createUuidMapping(ctx, filePath, hdr.uuid);
|
createUuidMapping(ctx, filePath, uuid);
|
||||||
}
|
}
|
||||||
} else if (stat.fileType == ox::FileType::Directory) {
|
} else if (stat.fileType == ox::FileType::Directory) {
|
||||||
if (!beginsWith(f, ".")) {
|
if (!beginsWith(f, ".")) {
|
||||||
|
|||||||
Reference in New Issue
Block a user