use shared ptrs for stream, vfs and ihttpserver and add progress

This commit is contained in:
2025-09-29 03:03:46 -05:00
parent 91622089f7
commit b92db28bba
31 changed files with 1394 additions and 1493 deletions

View File

@@ -723,22 +723,22 @@ namespace Tesses::CrossLang {
class CodeGen2 {
public:
void Write(Tesses::Framework::Streams::Stream* strm, uint8_t* buffer, size_t len)
void Write(std::shared_ptr<Tesses::Framework::Streams::Stream> strm, uint8_t* buffer, size_t len)
{
strm->WriteBlock(buffer,len);
}
void WriteInt(Tesses::Framework::Streams::Stream* strm,uint32_t v)
void WriteInt(std::shared_ptr<Tesses::Framework::Streams::Stream> strm,uint32_t v)
{
uint8_t buffer[4];
BitConverter::FromUint32BE(buffer[0],v);
Write(strm,buffer,4);
}
void WriteString(Tesses::Framework::Streams::Stream* strm,std::string v)
void WriteString(std::shared_ptr<Tesses::Framework::Streams::Stream> strm,std::string v)
{
WriteInt(strm,(uint32_t)v.size());
Write(strm,(uint8_t*)v.data(),v.size());
}
void Save(Tesses::Framework::Filesystem::VFS* vfs, Tesses::Framework::Streams::Stream* stream)
void Save(std::shared_ptr<Tesses::Framework::Filesystem::VFS> vfs, std::shared_ptr<Tesses::Framework::Streams::Stream> stream)
{
TVMVersion runtime_version(TVM_MAJOR,TVM_MINOR,TVM_PATCH,TVM_BUILD,TVM_VERSIONSTAGE);
@@ -941,7 +941,6 @@ namespace Tesses::CrossLang {
strm->CopyTo(stream);
}
delete strm;
}
if(!this->icon.empty())
{
@@ -1085,7 +1084,7 @@ namespace Tesses::CrossLang {
Tesses::Framework::Filesystem::VFSPath Assemble(Tesses::Framework::Filesystem::VFS* vfs)
Tesses::Framework::Filesystem::VFSPath Assemble(std::shared_ptr<Tesses::Framework::Filesystem::VFS> vfs)
{
using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::TextStreams;
@@ -1104,7 +1103,7 @@ namespace Tesses::CrossLang {
else {
if(item.GetExtension() == ".tcasm")
{
StreamReader reader(vfs->OpenFile(item,"rb"),true);
StreamReader reader(vfs->OpenFile(item,"rb"));
std::stringstream strm(reader.ReadToEnd(),std::ios_base::binary | std::ios_base::in);
Lex(item.ToString(), strm, tokens);
@@ -1124,7 +1123,7 @@ namespace Tesses::CrossLang {
auto confFile = VFSPath() / "crossapp.json";
if(vfs->FileExists(confFile))
{
Tesses::Framework::TextStreams::StreamReader reader(vfs->OpenFile(confFile,"rb"),true);
Tesses::Framework::TextStreams::StreamReader reader(vfs->OpenFile(confFile,"rb"));
auto jobj = Json::Decode(reader.ReadToEnd());
JObject main;
if(TryGetJToken(jobj,main))
@@ -1249,14 +1248,14 @@ namespace Tesses::CrossLang {
vfs->CreateDirectory(VFSPath() / "bin");
vfs->CreateDirectory(VFSPath() / "sections");
SubdirFilesystem sectionsdir(vfs,VFSPath() / "sections",false);
SubdirFilesystem resdir(vfs,VFSPath() / "res",false);
auto sectionsdir = std::make_shared<SubdirFilesystem>(vfs,VFSPath() / "sections");
auto resdir = std::make_shared<SubdirFilesystem>(vfs,VFSPath() / "res");
for(auto file : sectionsdir.EnumeratePaths(VFSPath()))
for(auto file : sectionsdir->EnumeratePaths(VFSPath()))
{
if(file.GetExtension() == ".tsec" && sectionsdir.FileExists(file))
if(file.GetExtension() == ".tsec" && sectionsdir->FileExists(file))
{
auto strm0 = sectionsdir.OpenFile(file,"rb");
auto strm0 = sectionsdir->OpenFile(file,"rb");
int64_t len = strm0->GetLength();
if(len > 4)
{
@@ -1269,15 +1268,15 @@ namespace Tesses::CrossLang {
strm0->ReadBlock(cg2.sections[off].second.data(), cg2.sections[off].second.size());
}
delete strm0;
}
}
auto strm = vfs->OpenFile(VFSPath() / "bin" / cg2.name + "-" + cg2.version.ToString() + ".crvm","wb");
cg2.Save(&resdir, strm);
delete strm;
cg2.Save(resdir, strm);
return VFSPath() / "bin" / cg2.name + "-" + cg2.version.ToString() + ".crvm";

View File

@@ -2,7 +2,7 @@
namespace Tesses::CrossLang {
class CrossLangFileReader {
Tesses::Framework::Streams::Stream* strm;
std::shared_ptr<Tesses::Framework::Streams::Stream> strm;
void Ensure(uint8_t* buffer, size_t len)
{
@@ -34,7 +34,7 @@ namespace Tesses::CrossLang {
}
public:
CrossLangFileReader(Tesses::Framework::Streams::Stream* strm)
CrossLangFileReader(std::shared_ptr<Tesses::Framework::Streams::Stream> strm)
{
this->strm = strm;
@@ -639,7 +639,7 @@ namespace Tesses::CrossLang {
void Disassemble(Tesses::Framework::Streams::Stream* src,Tesses::Framework::Filesystem::VFS* vfs, bool generateJSON,bool extractResources)
void Disassemble(std::shared_ptr<Tesses::Framework::Streams::Stream> src,std::shared_ptr<Tesses::Framework::Filesystem::VFS> vfs, bool generateJSON,bool extractResources)
{
using namespace Tesses::Framework::Filesystem;
CrossLangFileReader file(src);
@@ -653,7 +653,7 @@ namespace Tesses::CrossLang {
auto path2 = path / file.name + "-" + file.version.ToString()+"_"+ std::to_string((uint32_t)i) + ".bin";
auto strm = vfs->OpenFile(path2,"wb");
strm->WriteBlock(file.resources[i].data(),file.resources[i].size());
delete strm;
}
std::string secdir = "sections";
@@ -670,7 +670,7 @@ namespace Tesses::CrossLang {
auto strm = vfs->OpenFile(path2,"wb");
strm->WriteBlock((const uint8_t*)file.sections[i].first.data(), 4);
strm->WriteBlock(file.sections[i].second.data(),file.sections[i].second.size());
delete strm;
}
}
@@ -812,7 +812,7 @@ namespace Tesses::CrossLang {
std::string srcdirs = "src";
VFSPath srcdir=srcdirs;
vfs->CreateDirectory(srcdir);
Tesses::Framework::TextStreams::StreamWriter writer(vfs->OpenFile(srcdir / file.name + "-" + file.version.ToString() + ".tcasm","wb"),true);
Tesses::Framework::TextStreams::StreamWriter writer(vfs->OpenFile(srcdir / file.name + "-" + file.version.ToString() + ".tcasm","wb"));
writer.Write(srcFile);
if(generateJSON)
@@ -889,7 +889,7 @@ namespace Tesses::CrossLang {
}
Tesses::Framework::TextStreams::StreamWriter json_writer(vfs->OpenFile(VFSPath() / "crossapp.json","wb" ),true);
Tesses::Framework::TextStreams::StreamWriter json_writer(vfs->OpenFile(VFSPath() / "crossapp.json","wb" ));
json_writer.WriteLine(Json::Encode(json_data,true));
}

View File

@@ -1,9 +1,9 @@
#include "CrossLang.hpp"
using namespace Tesses::Framework::Serialization::Json;
namespace Tesses::CrossLang {
static void LoadDependency(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir, std::pair<std::string,TVMVersion> dep, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools);
static void LoadDependencies(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,TFile* file, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools);
static void LoadDependency(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir, std::pair<std::string,TVMVersion> dep, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools)
static void LoadDependency(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir, std::pair<std::string,TVMVersion> dep, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools);
static void LoadDependencies(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,TFile* file, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools);
static void LoadDependency(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir, std::pair<std::string,TVMVersion> dep, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools)
{
for(auto index = files.begin(); index != files.end(); index++)
{
@@ -23,17 +23,17 @@ namespace Tesses::CrossLang {
if(srcFS->RegularFileExists(filename))
{
Tesses::Framework::Streams::Stream* file = srcFS->OpenFile(filename,"rb");
auto file = srcFS->OpenFile(filename,"rb");
TFile f;
f.Load(nullptr, file);
delete file;
LoadDependencies(srcFS,sourceDir,&f,files,tools);
}
else throw VMException("Could not open file: \"" + name + "\".");
}
static void LoadDependencies(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,TFile* file, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools)
static void LoadDependencies(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,TFile* file, std::vector<std::pair<std::string, TVMVersion>>& files, std::vector<std::pair<std::string, TVMVersion>>& tools)
{
files.push_back(std::pair<std::string,TVMVersion>(file->name,file->version));
for(auto item : file->tools)
@@ -58,7 +58,7 @@ namespace Tesses::CrossLang {
LoadDependency(srcFS,sourceDir,item,files,tools);
}
}
static void EnumerateCRVM(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,std::string filename, std::vector<std::pair<std::string, TVMVersion>>& files, Tesses::Framework::Filesystem::VFS* destFS)
static void EnumerateCRVM(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourceDir,std::string filename, std::vector<std::pair<std::string, TVMVersion>>& files, std::shared_ptr<Tesses::Framework::Filesystem::VFS> destFS)
{
@@ -66,14 +66,12 @@ namespace Tesses::CrossLang {
auto strm = srcFS->OpenFile(sourceDir / filename,"rb");
if(strm->EndOfStream()) {
delete strm;
throw std::runtime_error("File does not exist: " + (sourceDir / filename).ToString() );
}
file.Load(nullptr,strm);
delete strm;
std::vector<std::pair<std::string, TVMVersion>> tools;
LoadDependencies(srcFS,sourceDir,&file,files,tools);
@@ -135,10 +133,10 @@ namespace Tesses::CrossLang {
}
Tesses::Framework::TextStreams::StreamWriter json_writer(destFS->OpenFile(Tesses::Framework::Filesystem::VFSPath() / "crossapp.json","wb" ),true);
Tesses::Framework::TextStreams::StreamWriter json_writer(destFS->OpenFile(Tesses::Framework::Filesystem::VFSPath() / "crossapp.json","wb" ));
json_writer.WriteLine(Json::Encode(json_data,true));
}
Tesses::Framework::Filesystem::VFSPath Merge(Tesses::Framework::Filesystem::VFS* srcFS, Tesses::Framework::Filesystem::VFSPath sourcePath, Tesses::Framework::Filesystem::VFS* destFS)
Tesses::Framework::Filesystem::VFSPath Merge(std::shared_ptr<Tesses::Framework::Filesystem::VFS> srcFS, Tesses::Framework::Filesystem::VFSPath sourcePath, std::shared_ptr<Tesses::Framework::Filesystem::VFS> destFS)
{
std::vector<std::pair<std::string, TVMVersion>> files;