[nostalgia] Fix to allow building UUID map later

This commit is contained in:
Gary Talent 2023-02-13 21:37:14 -06:00
parent d17f536832
commit 53229b05da
8 changed files with 46 additions and 18 deletions

View File

@ -18,6 +18,11 @@ ox::Result<ox::UUID> readUuidHeader(const ox::Buffer &buff) noexcept;
ox::Result<ox::UUID> readUuidHeader(const char *buff, std::size_t buffLen) noexcept;
ox::Error writeUuidHeader(ox::Writer_c auto *writer, const ox::UUID &uuid) noexcept {
const auto hdr = ox::sfmt<ox::BString<40>>("N1{};", uuid.toString());
return write(writer, hdr);
}
template<typename T>
ox::Result<T> readAsset(const ox::Buffer &buff) noexcept {
std::size_t offset = 0;

View File

@ -15,9 +15,8 @@ namespace nostalgia::foundation {
template<typename Ctx = foundation::Context>
ox::Result<ox::UPtr<Ctx>> init(ox::UPtr<ox::FileSystem> &&fs, ox::CRStringView appName) noexcept {
auto ctx = ox::make_unique<Ctx>();
ctx->rom = std::move(fs);
ctx->appName = appName;
oxReturnError(buildUuidMap(ctx.get()));
oxIgnoreError(setRomFs(ctx.get(), std::move(fs)));
auto mods = modules();
if (mods) {
for (auto &mod : *mods) {

View File

@ -40,6 +40,11 @@ ox::Result<void*> findPreloadSection() noexcept {
return OxError(1, "findPreloadSection is unsupported on this platform");
}
static void clearUuidMap(Context *ctx) noexcept {
ctx->uuidToPath.clear();
ctx->pathToUuid.clear();
}
static ox::Error buildUuidMap(Context *ctx, ox::CRStringView path) noexcept {
oxRequire(files, ctx->rom->ls(path));
for (const auto &f : files) {
@ -76,6 +81,9 @@ ox::Error buildUuidMap(Context *ctx) noexcept {
namespace nostalgia::foundation {
static void clearUuidMap(Context*) noexcept {
}
ox::Error buildUuidMap(Context*) noexcept {
return {};
}
@ -122,6 +130,12 @@ ox::Result<std::size_t> getPreloadAddr(foundation::Context *ctx, const ox::FileA
namespace nostalgia::foundation {
ox::Error setRomFs(Context *ctx, ox::UPtr<ox::FileSystem> fs) noexcept {
ctx->rom = std::move(fs);
clearUuidMap(ctx);
return buildUuidMap(ctx);
}
ox::Result<ox::UniquePtr<ox::FileSystem>> loadRomFs(ox::CRStringView path) noexcept {
const auto lastDot = ox_lastIndexOf(path, '.');
const auto fsExt = lastDot != -1 ? path.substr(static_cast<std::size_t>(lastDot)) : "";

View File

@ -133,6 +133,8 @@ ox::Error writeObj(
return ctx->rom->write(file, objBuff.data(), objBuff.size());
}
ox::Error setRomFs(Context *ctx, ox::UPtr<ox::FileSystem> fs) noexcept;
ox::Result<ox::UniquePtr<ox::FileSystem>> loadRomFs(ox::CRStringView assetId) noexcept;
ox::Result<char*> loadRom(ox::CRStringView assetId = "") noexcept;

View File

@ -21,7 +21,11 @@ static void generateTypes(ox::TypeStore *ts) noexcept {
}
}
Project::Project(ox::FileSystem *fs, ox::String path) noexcept: m_path(std::move(path)), m_typeStore(fs), m_fs(fs) {
Project::Project(foundation::Context *ctx, ox::String path) noexcept:
m_path(std::move(path)),
m_typeStore(ctx->rom.get()),
m_fs(ctx->rom.get()),
m_ctx(ctx) {
oxTracef("nostalgia::studio", "Project: {}", m_path);
generateTypes(&m_typeStore);
buildFileIndex();
@ -79,15 +83,22 @@ void Project::indexFile(ox::CRStringView path) noexcept {
}
ox::Error Project::writeBuff(const ox::StringView &path, const ox::Buffer &buff) noexcept {
constexpr auto HdrSz = 40;
ox::Buffer outBuff;
outBuff.reserve(buff.size() + HdrSz);
ox::BufferWriter writer(&outBuff);
oxRequire(uuid, m_ctx->pathToUuid.at(path));
oxReturnError(foundation::writeUuidHeader(&writer, *uuid));
oxReturnError(writer.write(buff.data(), buff.size()));
const auto newFile = m_fs->stat(path).error != 0;
oxReturnError(m_fs->write(path, buff.data(), buff.size(), ox::FileType::NormalFile));
oxReturnError(m_fs->write(path, outBuff.data(), outBuff.size(), ox::FileType::NormalFile));
if (newFile) {
fileAdded.emit(path);
indexFile(path);
} else {
fileUpdated.emit(path);
}
return OxError(0);
return {};
}
ox::Result<ox::Buffer> Project::loadBuff(const ox::String &path) const noexcept {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
@ -43,10 +43,11 @@ class NOSTALGIASTUDIO_EXPORT Project {
ox::String m_path;
mutable core::TypeStore m_typeStore;
mutable ox::FileSystem *m_fs = nullptr;
foundation::Context *m_ctx = nullptr;
ox::HashMap<ox::String, ox::Vector<ox::String>> m_fileExtFileMap;
public:
explicit Project(ox::FileSystem *fs, ox::String path) noexcept;
explicit Project(foundation::Context *ctx, ox::String path) noexcept;
ox::Error create() noexcept;

View File

@ -4,6 +4,7 @@
#include <ox/logconn/logconn.hpp>
#include <ox/std/trace.hpp>
#include <ox/std/uuid.hpp>
#include <nostalgia/appmodules/appmodules.hpp>
#include <nostalgia/core/core.hpp>
@ -54,16 +55,11 @@ static ox::Error run(ox::UniquePtr<ox::FileSystem> fs) noexcept {
return core::run(ctx.get());
}
static ox::Error run(int argc, const char **argv) noexcept {
static ox::Error run(int, const char**) noexcept {
ox::trace::init();
ox::UUID::seedGenerator({});
loadModules();
if (argc >= 2) {
const auto path = argv[1];
oxRequireM(fs, foundation::loadRomFs(path));
return run(std::move(fs));
} else {
return run(ox::UniquePtr<ox::FileSystem>(nullptr));
}
return run(ox::UniquePtr<ox::FileSystem>(nullptr));
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <imgui.h>
@ -286,9 +286,9 @@ void StudioUI::save() noexcept {
ox::Error StudioUI::openProject(ox::CRStringView path) noexcept {
oxRequireM(fs, foundation::loadRomFs(path));
m_ctx->rom = std::move(fs);
oxReturnError(foundation::setRomFs(m_ctx, std::move(fs)));
core::setWindowTitle(m_ctx, ox::sfmt("Nostalgia Studio - {}", path));
m_project = ox::make_unique<studio::Project>(m_ctx->rom.get(), path);
m_project = ox::make_unique<studio::Project>(m_ctx, path);
auto sctx = applicationData<studio::StudioContext>(m_ctx);
sctx->project = m_project.get();
m_project->fileAdded.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel);