diff --git a/CMakeLists.txt b/CMakeLists.txt index 063fe74..d19450f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,6 @@ src/Crypto/ClientTLSStream.cpp src/Crypto/MbedHelpers.cpp src/Args.cpp src/TF_Init.cpp -src/wrapper.cpp src/HiddenField.cpp ) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) diff --git a/apps/tanonydrop.cpp b/apps/tanonydrop.cpp index b7e7409..6f1604f 100644 --- a/apps/tanonydrop.cpp +++ b/apps/tanonydrop.cpp @@ -5,16 +5,16 @@ using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Http; using namespace Tesses::Framework::Filesystem; -VFS* vfs; +std::shared_ptr vfs; int main(int argc, char** argv) { TF_InitWithConsole(); - vfs = new SubdirFilesystem(&LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory(),false); + vfs = std::make_shared(LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory()); - CallbackServer cb([](ServerContext& ctx)->bool{ + std::shared_ptr cb = std::make_shared([](ServerContext& ctx)->bool{ if(ctx.path == "/") { ctx.WithMimeType("text/html") @@ -39,7 +39,7 @@ int main(int argc, char** argv) { if(ctx.NeedToParseFormData()) { - ctx.ParseFormData([](std::string mime, std::string filename,std::string name)->Stream* { + ctx.ParseFormData([](std::string mime, std::string filename,std::string name)->std::shared_ptr { if(name != "file") return nullptr; VFSPath path("/"+filename); auto strm = vfs->OpenFile(path,"wb"); @@ -81,8 +81,8 @@ int main(int argc, char** argv) return false; }); - Tesses::Framework::Http::MountableServer mountable(cb); - mountable.Mount("/files/",new FileServer(vfs,true,true,false),true); + auto mountable = std::make_shared(cb); + mountable->Mount("/files/",std::make_shared(vfs,true,false)); HttpServer srv(4985,mountable); srv.StartAccepting(); diff --git a/apps/tbin2h.cpp b/apps/tbin2h.cpp index cbf7f8f..6cecafc 100644 --- a/apps/tbin2h.cpp +++ b/apps/tbin2h.cpp @@ -7,9 +7,9 @@ int main(int argc, char** argv) std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE" << std::endl; return 0; } - Tesses::Framework::Streams::FileStream fs(argv[1],"rb"); - if(!fs.CanRead()) return 1; - Tesses::Framework::TextStreams::StreamWriter writer(argv[3]); - Tesses::Framework::Text::GenerateCHeaderFile(&fs, argv[2], &writer); + auto fs=std::make_shared(argv[1],"rb"); + if(!fs->CanRead()) return 1; + auto writer = std::make_shared(argv[3]); + Tesses::Framework::Text::GenerateCHeaderFile(fs, argv[2], writer); return 0; } \ No newline at end of file diff --git a/apps/tfileserver.cpp b/apps/tfileserver.cpp index 3484898..b247bf9 100644 --- a/apps/tfileserver.cpp +++ b/apps/tfileserver.cpp @@ -59,7 +59,7 @@ int main(int argc, char** argv) std::cout << "In folder: " << std::filesystem::absolute(directory).string() << std::endl; - FileServer fs(directory,allowListing, spa); + auto fs = std::make_shared(directory,allowListing, spa); HttpServer server(port,fs); server.StartAccepting(); TF_RunEventLoop(); diff --git a/apps/tjsonpretty.cpp b/apps/tjsonpretty.cpp index 751d813..545451f 100644 --- a/apps/tjsonpretty.cpp +++ b/apps/tjsonpretty.cpp @@ -2,35 +2,33 @@ using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Serialization::Json; using namespace Tesses::Framework::TextStreams; -FileStream* OpenWrite(std::string dest) +std::shared_ptr OpenWrite(std::string dest) { if(dest == "-") { - return new FileStream(stdout,false,"w"); + return std::make_shared(stdout,false,"w"); } else { - FileStream* strm = new FileStream(dest,"w"); + auto strm = std::make_shared(dest,"w"); if(!strm->CanWrite()) { - delete strm; return nullptr; } return strm; } } -FileStream* OpenRead(std::string src) +std::shared_ptr OpenRead(std::string src) { if(src == "-") { - return new FileStream(stdin,false,"r"); + return std::make_shared(stdin,false,"r"); } else { - FileStream* strm = new FileStream(src,"r"); + auto strm = std::make_shared(src,"r"); if(!strm->CanRead()) { - delete strm; return nullptr; } return strm; @@ -45,25 +43,24 @@ int main(int argc, char** argv) std::cout << "DEST: prettied file or - for stdout" << std::endl; return 0; } - FileStream* src = OpenRead(argv[1]); + auto src = OpenRead(argv[1]); - FileStream* dest = OpenWrite(argv[2]); + auto dest = OpenWrite(argv[2]); if(src == nullptr) { - if(dest != nullptr) delete dest; + std::cerr << "ERROR: Input could not be read" << std::endl; return 1; } if(dest == nullptr) { - delete src; std::cerr << "ERROR: Output could not be read" << std::endl; return 1; } - StreamReader reader(src,true); - StreamWriter writer(dest,true); + StreamReader reader(src); + StreamWriter writer(dest); auto str = reader.ReadToEnd(); writer.WriteLine(Json::Encode(Json::Decode(str))); diff --git a/apps/tjsonunpretty.cpp b/apps/tjsonunpretty.cpp index 880c479..d9c5394 100644 --- a/apps/tjsonunpretty.cpp +++ b/apps/tjsonunpretty.cpp @@ -2,35 +2,33 @@ using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Serialization::Json; using namespace Tesses::Framework::TextStreams; -FileStream* OpenWrite(std::string dest) +std::shared_ptr OpenWrite(std::string dest) { if(dest == "-") { - return new FileStream(stdout,false,"w"); + return std::make_shared(stdout,false,"w"); } else { - FileStream* strm = new FileStream(dest,"w"); + auto strm = std::make_shared(dest,"w"); if(!strm->CanWrite()) { - delete strm; return nullptr; } return strm; } } -FileStream* OpenRead(std::string src) +std::shared_ptr OpenRead(std::string src) { if(src == "-") { - return new FileStream(stdin,false,"r"); + return std::make_shared(stdin,false,"r"); } else { - FileStream* strm = new FileStream(src,"r"); + auto strm = std::make_shared(src,"r"); if(!strm->CanRead()) { - delete strm; return nullptr; } return strm; @@ -45,25 +43,24 @@ int main(int argc, char** argv) std::cout << "DEST: unprettied file or - for stdout" << std::endl; return 0; } - FileStream* src = OpenRead(argv[1]); + auto src = OpenRead(argv[1]); - FileStream* dest = OpenWrite(argv[2]); + auto dest = OpenWrite(argv[2]); if(src == nullptr) { - if(dest != nullptr) delete dest; std::cerr << "ERROR: Input could not be read" << std::endl; return 1; } if(dest == nullptr) { - delete src; + std::cerr << "ERROR: Output could not be read" << std::endl; return 1; } - StreamReader reader(src,true); - StreamWriter writer(dest,true); + StreamReader reader(src); + StreamWriter writer(dest); auto str = reader.ReadToEnd(); writer.WriteLine(Json::Encode(Json::Decode(str),false)); diff --git a/apps/tshell.cpp b/apps/tshell.cpp index c1eb010..1919e4c 100644 --- a/apps/tshell.cpp +++ b/apps/tshell.cpp @@ -96,7 +96,7 @@ int main(int argc,char** argv) { if(args.size()<3) continue; std::vector args2(args.begin()+2,args.end()); - auto f = LocalFS.OpenFile(args[1],"rb"); + auto f = LocalFS->OpenFile(args[1],"rb"); if(f != nullptr) { auto path = Environment::GetRealExecutablePath(args2[0]); @@ -106,11 +106,10 @@ int main(int argc,char** argv) { auto strm = p.GetStdinStream(); f->CopyTo(strm); - delete strm; + p.CloseStdInNow(); p.WaitForExit(); } - delete f; } } else { diff --git a/examples/copyfile.cpp b/examples/copyfile.cpp index 96ed7c8..ad884e6 100644 --- a/examples/copyfile.cpp +++ b/examples/copyfile.cpp @@ -9,8 +9,6 @@ int main(int argc, char** argv) VFSPath dest = fs.SystemToVFSPath(argv[2]); auto srcs = fs.OpenFile(src,"rb"); auto dests = fs.OpenFile(dest,"wb"); - srcs->CopyTo(*dests); + srcs->CopyTo(dests); - delete srcs; - delete dests; } \ No newline at end of file diff --git a/examples/mountabletest.cpp b/examples/mountabletest.cpp index 11c22e1..729cced 100644 --- a/examples/mountabletest.cpp +++ b/examples/mountabletest.cpp @@ -13,23 +13,22 @@ int main(int argc, char** argv) return 1; } - LocalFilesystem lfs; std::string root = "./root"; std::string mountDemi = "./demi"; std::string mountJoelSlashJim = "./joelslashjim"; - SubdirFilesystem rootdir(&lfs,root,false); + std::shared_ptr rootdir = std::make_shared(LocalFS,root); - SubdirFilesystem mountDemidir(&lfs,mountDemi,false); + std::shared_ptr mountDemidir = std::make_shared(LocalFS,mountDemi); - SubdirFilesystem mountjohnslashjim(&lfs,mountJoelSlashJim,false); + std::shared_ptr mountjohnslashjim = std::make_shared(LocalFS,mountJoelSlashJim); - MountableFilesystem fs(&rootdir,false); - fs.Mount(std::string("/demi"), &mountDemidir,false); + std::shared_ptr fs = std::make_shared(rootdir); + fs->Mount(std::string("/demi"), mountDemidir); - fs.Mount(std::string("/joel/jim"), &mountjohnslashjim,false); + fs->Mount(std::string("/joel/jim"), mountjohnslashjim); std::string command = argv[1]; @@ -39,22 +38,22 @@ int main(int argc, char** argv) std::string dir = "/"; if(argc > 2) dir = argv[2]; - for(auto item : fs.EnumeratePaths(dir)) + for(auto item : fs->EnumeratePaths(dir)) { std::cout << item.GetFileName() << std::endl; } } else if(command == "cat") { - FileStream strm(stdout, false,"wb",false); + std::shared_ptr strm = std::make_shared(stdout, false,"wb",false); for(int a = 2; a < argc; a++) { std::string path = argv[a]; - auto f = fs.OpenFile(path,"rb"); + auto f = fs->OpenFile(path,"rb"); if(f != nullptr) { f->CopyTo(strm); - delete f; + } } } diff --git a/examples/webserverex.cpp b/examples/webserverex.cpp index 95fc530..2f84a21 100644 --- a/examples/webserverex.cpp +++ b/examples/webserverex.cpp @@ -25,7 +25,7 @@ class MyWebServer : public IHttpServer { std::cout << ctx.path << std::endl; if(ctx.path == "/") { - FileStream fs("index.html","rb"); + std::shared_ptr fs = std::make_shared("index.html","rb"); ctx .WithMimeType("text/html") @@ -34,7 +34,7 @@ class MyWebServer : public IHttpServer { } else if(ctx.path == "/streaming.html") { - StreamWriter writer(ctx.OpenResponseStream(),true); + StreamWriter writer(ctx.OpenResponseStream()); writer.WriteLine(""); writer.WriteLine("Streaming"); writer.WriteLine(""); @@ -58,7 +58,7 @@ class MyWebServer : public IHttpServer { else if(ctx.path == "/main.js") { - FileStream fs("main.js","rb"); + std::shared_ptr fs = std::make_shared("main.js","rb"); ctx .WithMimeType("text/js") @@ -67,8 +67,8 @@ class MyWebServer : public IHttpServer { } else if(ctx.path == "/upload") { - ctx.ParseFormData([](std::string mime, std::string filename, std::string name)->Tesses::Framework::Streams::Stream*{ - return new FileStream(filename,"wb"); + ctx.ParseFormData([](std::string mime, std::string filename, std::string name)->std::shared_ptr{ + return std::make_shared(filename,"wb"); }); } else if(ctx.path == "/steve") @@ -117,11 +117,11 @@ class MyOtherWebServer : public IHttpServer int main(int argc, char** argv) { TF_InitWithConsole(); - MyOtherWebServer myo; - MyWebServer mws; + std::shared_ptr myo = std::make_shared(); + std::shared_ptr mws = std::make_shared(); - MountableServer mountable(myo); - mountable.Mount("/mymount/",mws); + std::shared_ptr mountable = std::make_shared(myo); + mountable->Mount("/mymount/",mws); HttpServer server(10001,mountable); server.StartAccepting(); TF_RunEventLoop(); diff --git a/examples/wsecho.cpp b/examples/wsecho.cpp index 9b61577..8a5056c 100644 --- a/examples/wsecho.cpp +++ b/examples/wsecho.cpp @@ -39,7 +39,7 @@ int main(int argc, char** argv) { Tesses::Framework::TF_Init(); HttpDictionary reqHeaders; - WebSocketConn conn; + std::shared_ptr conn = std::make_shared(); WebSocketClient("ws://echo.websocket.org/",reqHeaders,conn); return 0; diff --git a/include/TessesFramework/Crypto/ClientTLSStream.hpp b/include/TessesFramework/Crypto/ClientTLSStream.hpp index becbd22..78176e1 100644 --- a/include/TessesFramework/Crypto/ClientTLSStream.hpp +++ b/include/TessesFramework/Crypto/ClientTLSStream.hpp @@ -11,8 +11,8 @@ namespace Tesses::Framework::Crypto public: static std::string GetCertChain(); - ClientTLSStream(Tesses::Framework::Streams::Stream* innerStream, bool owns, bool verify, std::string domain); - ClientTLSStream(Tesses::Framework::Streams::Stream* innerStream, bool owns, bool verify, std::string domain, std::string cert); + ClientTLSStream(std::shared_ptr innerStream, bool verify, std::string domain); + ClientTLSStream(std::shared_ptr innerStream, bool verify, std::string domain, std::string cert); size_t Read(uint8_t* buff, size_t sz); size_t Write(const uint8_t* buff, size_t sz); bool CanRead(); diff --git a/include/TessesFramework/Crypto/MbedHelpers.hpp b/include/TessesFramework/Crypto/MbedHelpers.hpp index 3d16cb0..c860cff 100644 --- a/include/TessesFramework/Crypto/MbedHelpers.hpp +++ b/include/TessesFramework/Crypto/MbedHelpers.hpp @@ -11,13 +11,11 @@ namespace Tesses::Framework::Crypto Sha1(); bool Start(); bool Update(const uint8_t* buffer, size_t sz); - bool Update(Tesses::Framework::Streams::Stream* strm); - bool Update(Tesses::Framework::Streams::Stream& strm); - std::vector Finish(); + bool Update(std::shared_ptr strm); + std::vector Finish(); ~Sha1(); static std::vector ComputeHash(const uint8_t* buffer, size_t len); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream* strm); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream& strm); + static std::vector ComputeHash(std::shared_ptr strm); }; class Sha256 { void* inner; @@ -27,13 +25,11 @@ namespace Tesses::Framework::Crypto bool Start(bool is224=false); bool Is224(); bool Update(const uint8_t* buffer, size_t sz); - bool Update(Tesses::Framework::Streams::Stream* strm); - bool Update(Tesses::Framework::Streams::Stream& strm); + bool Update(std::shared_ptr strm); std::vector Finish(); ~Sha256(); static std::vector ComputeHash(const uint8_t* buffer, size_t len,bool is224=false); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream* strm,bool is224=false); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream& strm,bool is224=false); + static std::vector ComputeHash(std::shared_ptr strm,bool is224=false); }; class Sha512 { @@ -44,14 +40,12 @@ namespace Tesses::Framework::Crypto bool Start(bool is384=false); bool Is384(); bool Update(const uint8_t* buffer, size_t sz); - bool Update(Tesses::Framework::Streams::Stream* strm); - bool Update(Tesses::Framework::Streams::Stream& strm); - std::vector Finish(); + bool Update(std::shared_ptr strm); + std::vector Finish(); ~Sha512(); static std::vector ComputeHash(const uint8_t* buffer, size_t len,bool is384=false); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream* strm,bool is384=false); - static std::vector ComputeHash(Tesses::Framework::Streams::Stream& strm,bool is384=false); + static std::vector ComputeHash(std::shared_ptr strm,bool is384=false); }; typedef enum { VERSION_SHA1=1, diff --git a/include/TessesFramework/Filesystem/LocalFS.hpp b/include/TessesFramework/Filesystem/LocalFS.hpp index e7574c6..0d352e2 100644 --- a/include/TessesFramework/Filesystem/LocalFS.hpp +++ b/include/TessesFramework/Filesystem/LocalFS.hpp @@ -8,7 +8,7 @@ namespace Tesses::Framework::Filesystem { public: - Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode); + std::shared_ptr OpenFile(VFSPath path, std::string mode); void CreateDirectory(VFSPath path); void DeleteDirectory(VFSPath path); @@ -35,6 +35,11 @@ namespace Tesses::Framework::Filesystem void GetDate(VFSPath path, Date::DateTime& lastWrite, Date::DateTime& lastAccess); void SetDate(VFSPath path, Date::DateTime lastWrite, Date::DateTime lastAccess); + bool StatVFS(VFSPath path, StatVFSData& vfsData); + + void Chmod(VFSPath path, uint32_t mode); + + }; - extern LocalFilesystem LocalFS; + extern std::shared_ptr LocalFS; } \ No newline at end of file diff --git a/include/TessesFramework/Filesystem/MemoryFilesystem.hpp b/include/TessesFramework/Filesystem/MemoryFilesystem.hpp index 162870a..ff21664 100644 --- a/include/TessesFramework/Filesystem/MemoryFilesystem.hpp +++ b/include/TessesFramework/Filesystem/MemoryFilesystem.hpp @@ -73,7 +73,7 @@ namespace Tesses::Framework::Filesystem MemoryEntry* GetEntry(VFSPath path,bool followSymlink); public: MemoryFilesystem(); - Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode); + std::shared_ptr OpenFile(VFSPath path, std::string mode); void CreateDirectory(VFSPath path); void DeleteDirectory(VFSPath path); diff --git a/include/TessesFramework/Filesystem/MountableFilesystem.hpp b/include/TessesFramework/Filesystem/MountableFilesystem.hpp index bac796b..22be923 100644 --- a/include/TessesFramework/Filesystem/MountableFilesystem.hpp +++ b/include/TessesFramework/Filesystem/MountableFilesystem.hpp @@ -7,29 +7,28 @@ namespace Tesses::Framework::Filesystem class MountableDirectory { public: std::string name; - VFS* vfs; + std::shared_ptr vfs; bool owns; std::vector dirs; - void GetFS(VFSPath srcPath, VFSPath curDir, VFSPath& destRoot, VFSPath& destPath, VFS*& vfs); + void GetFS(VFSPath srcPath, VFSPath curDir, VFSPath& destRoot, VFSPath& destPath, std::shared_ptr& vfs); ~MountableDirectory(); }; class MountableFilesystem : public VFS { - bool owns; - VFS* root; + std::shared_ptr root; std::vector directories; - void GetFS(VFSPath srcPath, VFSPath& destRoot, VFSPath& destPath, VFS*& vfs); + void GetFS(VFSPath srcPath, VFSPath& destRoot, VFSPath& destPath, std::shared_ptr& vfs); public: MountableFilesystem(); - MountableFilesystem(VFS* root, bool owns); - void Mount(VFSPath path, VFS* fs, bool owns); + MountableFilesystem(std::shared_ptr root); + void Mount(VFSPath path, std::shared_ptr vfs); void Unmount(VFSPath path); - Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode); + std::shared_ptr OpenFile(VFSPath path, std::string mode); void CreateDirectory(VFSPath path); void DeleteDirectory(VFSPath path); bool SpecialFileExists(VFSPath path); @@ -53,5 +52,10 @@ namespace Tesses::Framework::Filesystem ~MountableFilesystem(); void GetDate(VFSPath path, Date::DateTime& lastWrite, Date::DateTime& lastAccess); void SetDate(VFSPath path, Date::DateTime lastWrite, Date::DateTime lastAccess); + + bool StatVFS(VFSPath path, StatVFSData& vfsData); + + void Chmod(VFSPath path, uint32_t mode); + }; } \ No newline at end of file diff --git a/include/TessesFramework/Filesystem/NullFilesystem.hpp b/include/TessesFramework/Filesystem/NullFilesystem.hpp index a0bf7ce..f963139 100644 --- a/include/TessesFramework/Filesystem/NullFilesystem.hpp +++ b/include/TessesFramework/Filesystem/NullFilesystem.hpp @@ -7,7 +7,7 @@ namespace Tesses::Framework::Filesystem class NullFilesystem : public VFS { public: - Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode); + std::shared_ptr OpenFile(VFSPath path, std::string mode); void CreateDirectory(VFSPath path); void DeleteDirectory(VFSPath path); bool RegularFileExists(VFSPath path); diff --git a/include/TessesFramework/Filesystem/SubdirFilesystem.hpp b/include/TessesFramework/Filesystem/SubdirFilesystem.hpp index 0c2ebd3..321ef88 100644 --- a/include/TessesFramework/Filesystem/SubdirFilesystem.hpp +++ b/include/TessesFramework/Filesystem/SubdirFilesystem.hpp @@ -6,14 +6,13 @@ namespace Tesses::Framework::Filesystem { class SubdirFilesystem : public VFS { - bool owns; - VFS* parent; + std::shared_ptr parent; VFSPath path; VFSPath ToParent(VFSPath path); VFSPath FromParent(VFSPath path); public: - SubdirFilesystem(VFS* parent, VFSPath path, bool owns); - Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode); + SubdirFilesystem(std::shared_ptr parent, VFSPath path); + std::shared_ptr OpenFile(VFSPath path, std::string mode); void CreateDirectory(VFSPath path); void DeleteDirectory(VFSPath path); bool SpecialFileExists(VFSPath path); @@ -38,6 +37,9 @@ namespace Tesses::Framework::Filesystem ~SubdirFilesystem(); void GetDate(VFSPath path, Date::DateTime& lastWrite, Date::DateTime& lastAccess); void SetDate(VFSPath path, Date::DateTime lastWrite, Date::DateTime lastAccess); - + bool StatVFS(VFSPath path, StatVFSData& vfsData); + + void Chmod(VFSPath path, uint32_t mode); + }; } \ No newline at end of file diff --git a/include/TessesFramework/Filesystem/VFS.hpp b/include/TessesFramework/Filesystem/VFS.hpp index 3781fe4..1d0e3a7 100644 --- a/include/TessesFramework/Filesystem/VFS.hpp +++ b/include/TessesFramework/Filesystem/VFS.hpp @@ -8,6 +8,20 @@ namespace Tesses::Framework::Filesystem { + class StatVFSData { + public: + uint64_t BlockSize; + uint64_t FragmentSize; + uint64_t Blocks; + uint64_t BlocksFree; + uint64_t BlocksAvailable; + uint64_t TotalInodes; + uint64_t FreeInodes; + uint64_t AvailableInodes; + uint64_t Id; + uint64_t Flags; + uint64_t MaxNameLength; + }; class VFSPath { public: static VFSPath CurrentDirectoryAsRelative(); @@ -107,7 +121,7 @@ namespace Tesses::Framework::Filesystem class VFS { public: - virtual Tesses::Framework::Streams::Stream* OpenFile(VFSPath path, std::string mode)=0; + virtual std::shared_ptr OpenFile(VFSPath path, std::string mode)=0; virtual void CreateDirectory(VFSPath path)=0; virtual void DeleteDirectory(VFSPath path)=0; virtual bool RegularFileExists(VFSPath path)=0; @@ -134,6 +148,10 @@ namespace Tesses::Framework::Filesystem virtual void GetDate(VFSPath path, Date::DateTime& lastWrite, Date::DateTime& lastAccess); virtual void SetDate(VFSPath path, Date::DateTime lastWrite, Date::DateTime lastAccess); + virtual bool StatVFS(VFSPath path, StatVFSData& data); + + virtual void Chmod(VFSPath path, uint32_t mode); + virtual ~VFS(); }; } \ No newline at end of file diff --git a/include/TessesFramework/Http/FileServer.hpp b/include/TessesFramework/Http/FileServer.hpp index 9f96e16..e77c656 100644 --- a/include/TessesFramework/Http/FileServer.hpp +++ b/include/TessesFramework/Http/FileServer.hpp @@ -6,8 +6,8 @@ namespace Tesses::Framework::Http { class FileServer : public IHttpServer { - Tesses::Framework::Filesystem::VFS* vfs; - bool ownsVFS; + std::shared_ptr vfs; + bool SendFile(ServerContext& ctx,Tesses::Framework::Filesystem::VFSPath path); @@ -17,8 +17,8 @@ namespace Tesses::Framework::Http std::vector defaultNames; FileServer(std::filesystem::path path,bool allowListing,bool spa); FileServer(std::filesystem::path path,bool allowListing, bool spa, std::vector defaultNames); - FileServer(Tesses::Framework::Filesystem::VFS* fs, bool owns, bool allowListing, bool spa); - FileServer(Tesses::Framework::Filesystem::VFS* fs, bool owns, bool allowListing, bool spa, std::vector defaultNames); + FileServer(std::shared_ptr fs, bool allowListing, bool spa); + FileServer(std::shared_ptr fs, bool allowListing, bool spa, std::vector defaultNames); bool Handle(ServerContext& ctx); ~FileServer(); }; diff --git a/include/TessesFramework/Http/HttpClient.hpp b/include/TessesFramework/Http/HttpClient.hpp index 27d959b..6132e6a 100644 --- a/include/TessesFramework/Http/HttpClient.hpp +++ b/include/TessesFramework/Http/HttpClient.hpp @@ -10,18 +10,18 @@ namespace Tesses::Framework::Http class HttpRequestBody { public: virtual void HandleHeaders(HttpDictionary& dict); - virtual void Write(Tesses::Framework::Streams::Stream* strm)=0; + virtual void Write(std::shared_ptr strm)=0; virtual ~HttpRequestBody(); }; class StreamHttpRequestBody : public HttpRequestBody { - Tesses::Framework::Streams::Stream* strm; - bool owns; + std::shared_ptr strm; + std::string mimeType; public: - StreamHttpRequestBody(Tesses::Framework::Streams::Stream* strm, bool owns, std::string mimeType); + StreamHttpRequestBody(std::shared_ptr strm, std::string mimeType); void HandleHeaders(HttpDictionary& dict); - void Write(Tesses::Framework::Streams::Stream* strm); + void Write(std::shared_ptr strm); ~StreamHttpRequestBody(); }; @@ -31,7 +31,7 @@ namespace Tesses::Framework::Http public: TextHttpRequestBody(std::string text, std::string mimeType); void HandleHeaders(HttpDictionary& dict); - void Write(Tesses::Framework::Streams::Stream* strm); + void Write(std::shared_ptr strm); ~TextHttpRequestBody(); }; @@ -49,52 +49,47 @@ namespace Tesses::Framework::Http HttpDictionary requestHeaders; HttpRequestBody* body; - static Tesses::Framework::Streams::Stream* EstablishConnection(Uri uri,bool ignoreSSLErrors,std::string trusted_root_cert_bundle); - static Tesses::Framework::Streams::Stream* EstablishUnixPathConnection(std::string unixPath, Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle); + static std::shared_ptr EstablishConnection(Uri uri,bool ignoreSSLErrors,std::string trusted_root_cert_bundle); + static std::shared_ptr EstablishUnixPathConnection(std::string unixPath, Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle); - void SendRequest(Tesses::Framework::Streams::Stream* strm); + void SendRequest(std::shared_ptr strm); }; class HttpResponse { private: bool owns; - Tesses::Framework::Streams::Stream* handleStrm; + std::shared_ptr handleStrm; public: - HttpResponse(Tesses::Framework::Streams::Stream* strm, bool owns); + HttpResponse(std::shared_ptr strm); HttpResponse(HttpRequest& request); std::string version; StatusCode statusCode; HttpDictionary responseHeaders; std::string ReadAsString(); - Tesses::Framework::Streams::Stream* ReadAsStream(); - void CopyToStream(Tesses::Framework::Streams::Stream* strm); - Tesses::Framework::Streams::Stream* GetInternalStream(); + std::shared_ptr ReadAsStream(); + void CopyToStream(std::shared_ptr strm); + std::shared_ptr GetInternalStream(); ~HttpResponse(); }; - void DownloadToStreamSimple(std::string url, Tesses::Framework::Streams::Stream* strm); - void DownloadToStreamSimple(std::string url, Tesses::Framework::Streams::Stream& strm); + void DownloadToStreamSimple(std::string url, std::shared_ptr strm); + + void DownloadToFileSimple(std::string url, std::shared_ptr vfs, Tesses::Framework::Filesystem::VFSPath path); - void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFS* vfs, Tesses::Framework::Filesystem::VFSPath path); - void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFS& vfs, Tesses::Framework::Filesystem::VFSPath path); void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFSPath path); std::string DownloadToStringSimple(std::string url); bool WebSocketClientSuccessDefault(HttpDictionary& dict,bool v); - void WebSocketClient(std::string url, HttpDictionary& requestHeaders, WebSocketConnection& wsc, std::function cb=WebSocketClientSuccessDefault); - void WebSocketClient(std::string url, HttpDictionary& requestHeaders, WebSocketConnection* wsc, std::function cb=WebSocketClientSuccessDefault); + void WebSocketClient(std::string url, HttpDictionary& requestHeaders, std::shared_ptr wsc, std::function cb=WebSocketClientSuccessDefault); - void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, Tesses::Framework::Streams::Stream* strm); - void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, Tesses::Framework::Streams::Stream& strm); + void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, std::shared_ptr strm); - void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFS* vfs, Tesses::Framework::Filesystem::VFSPath path); - void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFS& vfs, Tesses::Framework::Filesystem::VFSPath path); + void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, std::shared_ptr vfs, Tesses::Framework::Filesystem::VFSPath path); void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFSPath path); std::string DownloadUnixSocketToStringSimple(std::string unixSocket,std::string url); - void WebSocketUnixSocketClient(std::string unixSocket,std::string url, HttpDictionary& requestHeaders, WebSocketConnection& wsc, std::function cb=WebSocketClientSuccessDefault); - void WebSocketUnixSocketClient(std::string unixSocket,std::string url,HttpDictionary& requestHeaders, WebSocketConnection* wsc, std::function cb=WebSocketClientSuccessDefault); + void WebSocketUnixSocketClient(std::string unixSocket,std::string url, HttpDictionary& requestHeaders, std::shared_ptr wsc, std::function cb=WebSocketClientSuccessDefault); } \ No newline at end of file diff --git a/include/TessesFramework/Http/HttpServer.hpp b/include/TessesFramework/Http/HttpServer.hpp index c66dfa3..17965cf 100644 --- a/include/TessesFramework/Http/HttpServer.hpp +++ b/include/TessesFramework/Http/HttpServer.hpp @@ -17,7 +17,7 @@ namespace Tesses::Framework::Http class ServerContext { bool sent; - Tesses::Framework::Streams::Stream* strm; + std::shared_ptr strm; std::map data; public: HttpDictionary requestHeaders; @@ -31,27 +31,25 @@ namespace Tesses::Framework::Http uint16_t port; std::string version; bool encrypted; - ServerContext(Tesses::Framework::Streams::Stream* strm); + ServerContext(std::shared_ptr strm); ~ServerContext(); - Tesses::Framework::Streams::Stream& GetStream(); + std::shared_ptr GetStream(); std::string GetOriginalPathWithQuery(); std::string GetUrlWithQuery(); bool Sent(); bool NeedToParseFormData(); - void ParseFormData(std::function cb); - void ReadStream(Tesses::Framework::Streams::Stream& strm); - void ReadStream(Tesses::Framework::Streams::Stream* strm); + void ParseFormData(std::function(std::string mime, std::string filename, std::string name)> cb); + void ReadStream(std::shared_ptr strm); std::string ReadString(); void SendBytes(std::vector buffer); void SendText(std::string text); - void SendStream(Tesses::Framework::Streams::Stream& strm); - void SendStream(Tesses::Framework::Streams::Stream* strm); + void SendStream(std::shared_ptr strm); void SendErrorPage(bool showPath); void SendNotFound(); void SendBadRequest(); void SendException(std::exception& ex); - Tesses::Framework::Streams::Stream* OpenResponseStream(); - Tesses::Framework::Streams::Stream* OpenRequestStream(); + std::shared_ptr OpenResponseStream(); + std::shared_ptr OpenRequestStream(); ServerContext& WithLastModified(Date::DateTime time); ServerContext& WithHeader(std::string key, std::string value); ServerContext& WithSingleHeader(std::string key, std::string value); @@ -59,7 +57,7 @@ namespace Tesses::Framework::Http ServerContext& WithContentDisposition(std::string filename, bool isInline); ServerContext& WriteHeaders(); void StartWebSocketSession(std::function,std::function,std::function)> onOpen, std::function onReceive, std::function onClose); - void StartWebSocketSession(WebSocketConnection& connection); + void StartWebSocketSession(std::shared_ptr connection); template T* GetServerContentData(std::string tag) @@ -81,27 +79,20 @@ namespace Tesses::Framework::Http }; class HttpServer { - Tesses::Framework::Streams::TcpServer* server; - IHttpServer* http; + std::shared_ptr server; + std::shared_ptr http; Tesses::Framework::Threading::Thread* thrd; - bool ownsTCP; - bool ownsHttp; bool showIPs; bool showARTL; public: - HttpServer(Tesses::Framework::Streams::TcpServer& tcpServer, IHttpServer& http, bool showIPs=true); - HttpServer(Tesses::Framework::Streams::TcpServer* tcpServer, bool ownsTCP, IHttpServer& http, bool showIPs=true); - HttpServer(Tesses::Framework::Streams::TcpServer& tcpServer, IHttpServer* http, bool ownsHttpServer, bool showIPs=true); - HttpServer(Tesses::Framework::Streams::TcpServer* tcpServer, bool ownsTCP, IHttpServer* http, bool ownsHttpServer, bool showIPs=true); - HttpServer(uint16_t port, IHttpServer& http, bool showIPs=true); - HttpServer(uint16_t port, IHttpServer* http, bool owns, bool showIPs=true); - HttpServer(std::string unixPath, IHttpServer& http); - HttpServer(std::string unixPath, IHttpServer* http, bool owns); + HttpServer(std::shared_ptr tcpServer, std::shared_ptr http, bool showIPs=true); + HttpServer(uint16_t port, std::shared_ptr http, bool showIPs=true); + HttpServer(std::string unixPath, std::shared_ptr http); uint16_t GetPort(); void StartAccepting(); - static void Process(Tesses::Framework::Streams::Stream& strm, IHttpServer& server, std::string ip, uint16_t port, bool encrypted); + static void Process(std::shared_ptr strm, std::shared_ptr server, std::string ip, uint16_t port, bool encrypted); ~HttpServer(); }; } \ No newline at end of file diff --git a/include/TessesFramework/Http/HttpStream.hpp b/include/TessesFramework/Http/HttpStream.hpp index a94bd12..34267ab 100644 --- a/include/TessesFramework/Http/HttpStream.hpp +++ b/include/TessesFramework/Http/HttpStream.hpp @@ -4,22 +4,20 @@ namespace Tesses::Framework::Http { class HttpStream : public Tesses::Framework::Streams::Stream { - Tesses::Framework::Streams::Stream* strm; + std::shared_ptr strm; size_t offset; size_t read; int64_t length; int64_t position; - bool owns; bool recv; bool http1_1; bool done; public: - HttpStream(Tesses::Framework::Streams::Stream* strm, bool owns, int64_t length, bool recv, bool http1_1); - HttpStream(Tesses::Framework::Streams::Stream& strm, int64_t length, bool recv,bool http1_1); + HttpStream(std::shared_ptr strm, int64_t length, bool recv, bool http1_1); bool CanRead(); bool CanWrite(); bool EndOfStream(); diff --git a/include/TessesFramework/Http/MountableServer.hpp b/include/TessesFramework/Http/MountableServer.hpp index d60a719..38ae107 100644 --- a/include/TessesFramework/Http/MountableServer.hpp +++ b/include/TessesFramework/Http/MountableServer.hpp @@ -7,17 +7,14 @@ namespace Tesses::Framework::Http { class MountableServer : public IHttpServer { - IHttpServer* root; - bool owns; - std::vector>> servers; + std::shared_ptr root; + std::vector>> servers; std::string Subpath(Filesystem::VFSPath fullPath, Filesystem::VFSPath offsetPath); bool StartsWith(Filesystem::VFSPath fullPath, Filesystem::VFSPath offsetPath); public: MountableServer(); - MountableServer(IHttpServer* root, bool owns); - MountableServer(IHttpServer& root); - void Mount(std::string path, IHttpServer* server, bool owns); - void Mount(std::string path, IHttpServer& server); + MountableServer(std::shared_ptr root); + void Mount(std::string path, std::shared_ptr server); void Unmount(std::string path); bool Handle(ServerContext& ctx); ~MountableServer(); diff --git a/include/TessesFramework/Mail/Smtp.hpp b/include/TessesFramework/Mail/Smtp.hpp index 77b535d..d692bb8 100644 --- a/include/TessesFramework/Mail/Smtp.hpp +++ b/include/TessesFramework/Mail/Smtp.hpp @@ -6,7 +6,7 @@ class SMTPBody { public: std::string mimeType; - virtual void Write(Tesses::Framework::Streams::Stream* strm)=0; + virtual void Write(std::shared_ptr strm)=0; virtual ~SMTPBody(); }; @@ -16,27 +16,25 @@ class SMTPStringBody : public SMTPBody SMTPStringBody(); SMTPStringBody(std::string text, std::string mimeType); std::string text; - void Write(Tesses::Framework::Streams::Stream* strm); + void Write(std::shared_ptr strm); }; class SMTPStreamBody : public SMTPBody { - Tesses::Framework::Streams::Stream* stream; - bool owns; + std::shared_ptr stream; + public: - SMTPStreamBody(std::string mimeType,Tesses::Framework::Streams::Stream& stream); - SMTPStreamBody(std::string mimeType,Tesses::Framework::Streams::Stream* stream, bool owns); - void Write(Tesses::Framework::Streams::Stream* strm); + SMTPStreamBody(std::string mimeType,std::shared_ptr stream); + void Write(std::shared_ptr strm); ~SMTPStreamBody(); }; class SMTPClient { - Tesses::Framework::Streams::Stream* strm; - bool owns; + std::shared_ptr strm; + public: - SMTPClient(Tesses::Framework::Streams::Stream* stream,bool owns=true); - SMTPClient(Tesses::Framework::Streams::Stream& strm); + SMTPClient(std::shared_ptr strm); std::string domain; std::string username; std::string password; @@ -44,8 +42,8 @@ class SMTPClient { std::string from_name; std::string to; std::string subject; - SMTPBody* body; - std::vector> attachments; + std::shared_ptr body; + std::vector>> attachments; void Send(); ~SMTPClient(); }; diff --git a/include/TessesFramework/Platform/Process.hpp b/include/TessesFramework/Platform/Process.hpp index 8080f41..7067115 100644 --- a/include/TessesFramework/Platform/Process.hpp +++ b/include/TessesFramework/Platform/Process.hpp @@ -27,14 +27,11 @@ class Process { void CloseStdInNow(); - //YOU ARE RESPONSABLE FOR FREEING THIS STREAM OBJECT + + std::shared_ptr GetStdinStream(); - Tesses::Framework::Streams::Stream* GetStdinStream(); - - //YOU ARE RESPONSABLE FOR FREEING THIS STREAM OBJECT - Tesses::Framework::Streams::Stream* GetStdoutStream(); - //YOU ARE RESPONSABLE FOR FREEING THIS STREAM OBJECT - Tesses::Framework::Streams::Stream* GetStderrStream(); + std::shared_ptr GetStdoutStream(); + std::shared_ptr GetStderrStream(); Process(); Process(std::string name, std::vector args,bool includeThisEnv=true); diff --git a/include/TessesFramework/Streams/BufferedStream.hpp b/include/TessesFramework/Streams/BufferedStream.hpp index 2e35069..7f86db0 100644 --- a/include/TessesFramework/Streams/BufferedStream.hpp +++ b/include/TessesFramework/Streams/BufferedStream.hpp @@ -6,15 +6,13 @@ namespace Tesses::Framework::Streams class BufferedStream : public Stream { private: - Stream* strm; - bool owns; + std::shared_ptr strm; uint8_t* buffer; size_t bufferSize; size_t offset; size_t read; public: - BufferedStream(Stream* strm, bool owns, size_t bufferSize=1024); - BufferedStream(Stream& strm, size_t bufferSize=1024); + BufferedStream(std::shared_ptr strm, size_t bufferSize=1024); bool EndOfStream(); bool CanRead(); bool CanWrite(); diff --git a/include/TessesFramework/Streams/ByteReader.hpp b/include/TessesFramework/Streams/ByteReader.hpp index 0f205fd..32f3dd4 100644 --- a/include/TessesFramework/Streams/ByteReader.hpp +++ b/include/TessesFramework/Streams/ByteReader.hpp @@ -4,12 +4,10 @@ namespace Tesses::Framework::Streams { class ByteReader { - Stream* strm; - bool owns; + std::shared_ptr strm; public: - Stream* GetStream(); - ByteReader(Stream* strm, bool owns); - ByteReader(Stream& strm); + std::shared_ptr GetStream(); + ByteReader(std::shared_ptr strm); uint8_t ReadU8(); uint16_t ReadU16BE(); uint16_t ReadU16LE(); @@ -28,6 +26,5 @@ namespace Tesses::Framework::Streams float ReadF32LE(); double ReadF64BE(); double ReadF64LE(); - ~ByteReader(); }; } \ No newline at end of file diff --git a/include/TessesFramework/Streams/ByteWriter.hpp b/include/TessesFramework/Streams/ByteWriter.hpp index b8c8813..5e0ab8b 100644 --- a/include/TessesFramework/Streams/ByteWriter.hpp +++ b/include/TessesFramework/Streams/ByteWriter.hpp @@ -4,12 +4,11 @@ namespace Tesses::Framework::Streams { class ByteWriter { - Stream* strm; - bool owns; + std::shared_ptr strm; + public: - Stream* GetStream(); - ByteWriter(Stream* strm, bool owns); - ByteWriter(Stream& strm); + std::shared_ptr GetStream(); + ByteWriter(std::shared_ptr strm); void WriteU8(uint8_t v); void WriteU16BE(uint16_t v); void WriteU16LE(uint16_t v); @@ -28,6 +27,5 @@ namespace Tesses::Framework::Streams void WriteF32LE(float v); void WriteF64BE(double v); void WriteF64LE(double v); - ~ByteWriter(); }; } \ No newline at end of file diff --git a/include/TessesFramework/Streams/NetworkStream.hpp b/include/TessesFramework/Streams/NetworkStream.hpp index 5e67609..83e60b5 100644 --- a/include/TessesFramework/Streams/NetworkStream.hpp +++ b/include/TessesFramework/Streams/NetworkStream.hpp @@ -15,7 +15,7 @@ namespace Tesses::Framework::Streams TcpServer(uint16_t port, int32_t backlog); TcpServer(std::string ip, uint16_t port, int32_t backlog); TcpServer(std::string unixPath,int32_t backlog); - NetworkStream* GetStream(std::string& ip, uint16_t& port); + std::shared_ptr GetStream(std::string& ip, uint16_t& port); uint16_t GetPort(); ~TcpServer(); bool IsValid(); @@ -45,7 +45,7 @@ namespace Tesses::Framework::Streams void Listen(int32_t backlog); void Bind(std::string ip, uint16_t port); void SetBroadcast(bool bC); - NetworkStream* Accept(std::string& ip, uint16_t& port); + std::shared_ptr Accept(std::string& ip, uint16_t& port); size_t Read(uint8_t* buff, size_t sz); size_t Write(const uint8_t* buff, size_t sz); size_t ReadFrom(uint8_t* buff, size_t sz, std::string& ip, uint16_t& port); diff --git a/include/TessesFramework/Streams/Stream.hpp b/include/TessesFramework/Streams/Stream.hpp index d4378ea..d3b072b 100644 --- a/include/TessesFramework/Streams/Stream.hpp +++ b/include/TessesFramework/Streams/Stream.hpp @@ -23,8 +23,7 @@ namespace Tesses::Framework::Streams virtual int64_t GetLength(); virtual void Flush(); virtual void Seek(int64_t pos, SeekOrigin whence); - void CopyTo(Stream* strm, size_t buffSize=1024); - void CopyTo(Stream& strm, size_t buffSize=1024); + void CopyTo(std::shared_ptr strm, size_t buffSize=1024); virtual ~Stream(); }; } \ No newline at end of file diff --git a/include/TessesFramework/TessesFramework.h b/include/TessesFramework/TessesFramework.h deleted file mode 100644 index e0e862e..0000000 --- a/include/TessesFramework/TessesFramework.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once - -#if defined(__cplusplus) -extern "C" { -#endif -#include -#include -#include - -typedef void string_t; -typedef void tf_vfs_t; -typedef void tf_stream_t; -typedef void tf_thread_t; -typedef void tf_mutex_t; -typedef void tf_vfs_dir_t; - -typedef void (*tf_action_user_data_t)(void* ptr); - - -typedef enum { - TF_SEEK_BEGIN, - TF_SEEK_CURRENT, - TF_SEEK_END -} TF_WHENCE; - -string_t* string_create(); -string_t* string_create_from_buff(const void* text, size_t len); -string_t* string_create_from_charpointer(const char* text); -string_t* string_resize(string_t* str, size_t len); -string_t* string_set_char(string_t* str, size_t index, char c); -char string_get_char(string_t* str,size_t index); -string_t* string_append_char(string_t* str, char c); -string_t* string_append_from_buff(string_t* str,const void* text, size_t len); -string_t* string_append_from_charpointer(string_t* str,const char* text); -string_t* string_append(string_t* str, string_t* toAppend); -string_t* string_append_signed(string_t* str, int64_t num); -string_t* string_append_unsigned(string_t* str, uint64_t num); -string_t* string_append_double(string_t* str, double num); -void string_print(string_t* str); -void string_println(string_t* str); -size_t string_size(string_t* str); -const char* string_c_str(string_t* str); -void string_free(string_t* str); - -void tf_init(); -tf_thread_t* tf_create_thread(void* userData, tf_action_user_data_t cb); -void tf_join_thread(tf_thread_t* thrd); -void tf_detach_thread(tf_thread_t* thrd); - -tf_mutex_t* tf_mutex_create(); -void tf_mutex_lock(tf_mutex_t* mtx); -bool tf_mutex_trylock(tf_mutex_t* mtx); -void tf_mutex_unlock(tf_mutex_t* mtx); -void tf_mutex_free(tf_mutex_t* mtx); - -bool tf_stream_canread(tf_stream_t* strm); -bool tf_stream_canwrite(tf_stream_t* strm); -bool tf_stream_canseek(tf_stream_t* strm); -bool tf_stream_eof(tf_stream_t* strm); -int64_t tf_stream_getlen(tf_stream_t* strm); -int64_t tf_stream_getpos(tf_stream_t* strm); -void tf_stream_seek(tf_stream_t* strm, int64_t pos, TF_WHENCE whence); -size_t tf_stream_read(tf_stream_t* strm, uint8_t* buffer, size_t length); -size_t tf_stream_write(tf_stream_t* strm, const uint8_t* buffer, size_t length); -size_t tf_stream_readblock(tf_stream_t* strm, uint8_t* buffer, size_t length); -void tf_stream_writeblock(tf_stream_t* strm, const uint8_t* buffer, size_t length); -void tf_stream_copyto(tf_stream_t* src, tf_stream_t* dest, size_t blockSize); -void tf_stream_close(tf_stream_t* strm); -void tf_stream_flush(tf_stream_t* strm); -int32_t tf_stream_readbyte(tf_stream_t* strm); -void tf_stream_writebyte(tf_stream_t* strm, uint8_t val); - -tf_stream_t* tf_stream_fopen(const char* file, const char* mode); - -#if defined(__cplusplus) -} -#endif diff --git a/include/TessesFramework/Text/HeaderGenerator.hpp b/include/TessesFramework/Text/HeaderGenerator.hpp index 917a452..14bbd68 100644 --- a/include/TessesFramework/Text/HeaderGenerator.hpp +++ b/include/TessesFramework/Text/HeaderGenerator.hpp @@ -3,9 +3,9 @@ #include "../TextStreams/StringWriter.hpp" namespace Tesses::Framework::Text { - void GenerateCHeaderFile(Streams::Stream* strm,std::string name, TextStreams::TextWriter* writer); + void GenerateCHeaderFile(std::shared_ptr strm,std::string name, std::shared_ptr writer); - std::string GenerateCHeaderFile(Streams::Stream* strm,std::string name); - void GenerateCHeaderFile(const std::vector& data,std::string name, TextStreams::TextWriter* writer); + std::string GenerateCHeaderFile(std::shared_ptr strm,std::string name); + void GenerateCHeaderFile(const std::vector& data,std::string name, std::shared_ptr writer); std::string GenerateCHeaderFile(const std::vector& data,std::string name); } \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StreamReader.hpp b/include/TessesFramework/TextStreams/StreamReader.hpp index 651d8c2..745865d 100644 --- a/include/TessesFramework/TextStreams/StreamReader.hpp +++ b/include/TessesFramework/TextStreams/StreamReader.hpp @@ -6,12 +6,11 @@ namespace Tesses::Framework::TextStreams class StreamReader : public TextReader { private: - Tesses::Framework::Streams::Stream* strm; + std::shared_ptr strm; bool owns; public: - Tesses::Framework::Streams::Stream& GetStream(); - StreamReader(Tesses::Framework::Streams::Stream& strm); - StreamReader(Tesses::Framework::Streams::Stream* strm, bool owns); + std::shared_ptr GetStream(); + StreamReader(std::shared_ptr strm); StreamReader(std::filesystem::path filename); bool ReadBlock(std::string& str,size_t sz); bool Rewind(); diff --git a/include/TessesFramework/TextStreams/StreamWriter.hpp b/include/TessesFramework/TextStreams/StreamWriter.hpp index 2fc5d9d..321ebad 100644 --- a/include/TessesFramework/TextStreams/StreamWriter.hpp +++ b/include/TessesFramework/TextStreams/StreamWriter.hpp @@ -6,12 +6,10 @@ namespace Tesses::Framework::TextStreams { class StreamWriter : public TextWriter { private: - Tesses::Framework::Streams::Stream* strm; - bool owns; + std::shared_ptr strm; public: - Tesses::Framework::Streams::Stream& GetStream(); - StreamWriter(Tesses::Framework::Streams::Stream& strm); - StreamWriter(Tesses::Framework::Streams::Stream* strm, bool owns); + std::shared_ptr GetStream(); + StreamWriter(std::shared_ptr strm); StreamWriter(std::filesystem::path filename, bool append=false); void WriteData(const char* text, size_t len); ~StreamWriter(); diff --git a/src/Crypto/ClientTLSStream.cpp b/src/Crypto/ClientTLSStream.cpp index 3d1e1b8..9c2ebc0 100644 --- a/src/Crypto/ClientTLSStream.cpp +++ b/src/Crypto/ClientTLSStream.cpp @@ -25,9 +25,8 @@ namespace Tesses::Framework::Crypto class ClientTLSPrivateData { public: bool eos; - bool owns; bool success; - Stream* strm; + std::shared_ptr strm; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; @@ -40,7 +39,6 @@ namespace Tesses::Framework::Crypto mbedtls_entropy_free(&entropy); mbedtls_ssl_config_free(&conf); mbedtls_ssl_free(&ssl); - if(this->owns) delete strm; } }; #endif @@ -59,12 +57,12 @@ namespace Tesses::Framework::Crypto return ""; } - ClientTLSStream::ClientTLSStream(Tesses::Framework::Streams::Stream* innerStream, bool owns, bool verify, std::string domain) : ClientTLSStream(innerStream,owns,verify,domain,"") + ClientTLSStream::ClientTLSStream(std::shared_ptr innerStream, bool verify, std::string domain) : ClientTLSStream(innerStream,verify,domain,"") { } - ClientTLSStream::ClientTLSStream(Tesses::Framework::Streams::Stream* innerStream, bool owns, bool verify, std::string domain, std::string cert) + ClientTLSStream::ClientTLSStream(std::shared_ptr innerStream, bool verify, std::string domain, std::string cert) { #if defined(TESSESFRAMEWORK_ENABLE_MBED) if(cert.empty()) @@ -77,7 +75,7 @@ namespace Tesses::Framework::Crypto data->eos=false; data->success=false; data->strm = innerStream; - data->owns = owns; + mbedtls_ssl_init(&data->ssl); mbedtls_ssl_config_init(&data->conf); diff --git a/src/Crypto/MbedHelpers.cpp b/src/Crypto/MbedHelpers.cpp index 08b1894..4502279 100644 --- a/src/Crypto/MbedHelpers.cpp +++ b/src/Crypto/MbedHelpers.cpp @@ -83,7 +83,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha1::Update(Tesses::Framework::Streams::Stream* strm) + bool Sha1::Update(std::shared_ptr strm) { #if defined(TESSESFRAMEWORK_ENABLE_MBED) if(strm == nullptr) return false; @@ -97,10 +97,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha1::Update(Tesses::Framework::Streams::Stream& strm) - { - return Update(&strm); - } + std::vector Sha1::Finish() { #if defined(TESSESFRAMEWORK_ENABLE_MBED) @@ -127,20 +124,14 @@ namespace Tesses::Framework::Crypto if(!sha1.Update(buffer,len)) return {}; return sha1.Finish(); } - std::vector Sha1::ComputeHash(Tesses::Framework::Streams::Stream* strm) - { - Sha1 sha1; - if(!sha1.Start()) return {}; - if(!sha1.Update(strm)) return {}; - return sha1.Finish(); - } - std::vector Sha1::ComputeHash(Tesses::Framework::Streams::Stream& strm) + std::vector Sha1::ComputeHash(std::shared_ptr strm) { Sha1 sha1; if(!sha1.Start()) return {}; if(!sha1.Update(strm)) return {}; return sha1.Finish(); } + Sha256::Sha256() { @@ -175,7 +166,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha256::Update(Tesses::Framework::Streams::Stream* strm) + bool Sha256::Update(std::shared_ptr strm) { #if defined(TESSESFRAMEWORK_ENABLE_MBED) if(strm == nullptr) return false; @@ -189,10 +180,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha256::Update(Tesses::Framework::Streams::Stream& strm) - { - return Update(&strm); - } + std::vector Sha256::Finish() { #if defined(TESSESFRAMEWORK_ENABLE_MBED) @@ -219,14 +207,7 @@ namespace Tesses::Framework::Crypto if(!sha256.Update(buffer,len)) return {}; return sha256.Finish(); } - std::vector Sha256::ComputeHash(Tesses::Framework::Streams::Stream* strm,bool is224) - { - Sha256 sha256; - if(!sha256.Start(is224)) return {}; - if(!sha256.Update(strm)) return {}; - return sha256.Finish(); - } - std::vector Sha256::ComputeHash(Tesses::Framework::Streams::Stream& strm,bool is224) + std::vector Sha256::ComputeHash(std::shared_ptr strm,bool is224) { Sha256 sha256; if(!sha256.Start(is224)) return {}; @@ -234,6 +215,7 @@ namespace Tesses::Framework::Crypto return sha256.Finish(); } + Sha512::Sha512() { #if defined(TESSESFRAMEWORK_ENABLE_MBED) @@ -265,7 +247,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha512::Update(Tesses::Framework::Streams::Stream* strm) + bool Sha512::Update(std::shared_ptr strm) { #if defined(TESSESFRAMEWORK_ENABLE_MBED) if(strm == nullptr) return false; @@ -279,10 +261,7 @@ namespace Tesses::Framework::Crypto #endif return false; } - bool Sha512::Update(Tesses::Framework::Streams::Stream& strm) - { - return Update(&strm); - } + std::vector Sha512::Finish() { #if defined(TESSESFRAMEWORK_ENABLE_MBED) @@ -310,20 +289,14 @@ namespace Tesses::Framework::Crypto if(!sha512.Update(buffer,len)) return {}; return sha512.Finish(); } - std::vector Sha512::ComputeHash(Tesses::Framework::Streams::Stream* strm,bool is384) - { - Sha512 sha512; - if(!sha512.Start(is384)) return {}; - if(!sha512.Update(strm)) return {}; - return sha512.Finish(); - } - std::vector Sha512::ComputeHash(Tesses::Framework::Streams::Stream& strm,bool is384) + std::vector Sha512::ComputeHash(std::shared_ptr strm,bool is384) { Sha512 sha512; if(!sha512.Start(is384)) return {}; if(!sha512.Update(strm)) return {}; return sha512.Finish(); } + bool PBKDF2(std::vector& output,std::string pass, std::vector& salt, long itterations, ShaVersion version) diff --git a/src/Filesystem/LocalFS.cpp b/src/Filesystem/LocalFS.cpp index 4c690cd..2dd1063 100644 --- a/src/Filesystem/LocalFS.cpp +++ b/src/Filesystem/LocalFS.cpp @@ -8,6 +8,7 @@ #undef min #else #include +#include #endif namespace Tesses::Framework::Filesystem { @@ -71,9 +72,9 @@ namespace Tesses::Framework::Filesystem auto res = std::filesystem::read_symlink(this->VFSPathToSystem(path)).string(); return this->SystemToVFSPath(res.c_str()); } - Tesses::Framework::Streams::Stream* LocalFilesystem::OpenFile(VFSPath path, std::string mode) + std::shared_ptr LocalFilesystem::OpenFile(VFSPath path, std::string mode) { - return new Tesses::Framework::Streams::FileStream(VFSPathToSystem(path), mode); + return std::make_shared(VFSPathToSystem(path), mode); } void LocalFilesystem::DeleteDirectory(VFSPath path) @@ -191,7 +192,45 @@ namespace Tesses::Framework::Filesystem delete dir; }); } - LocalFilesystem LocalFS; + bool LocalFilesystem::StatVFS(VFSPath path, StatVFSData& data) + { + auto pathStr = this->VFSPathToSystem(path); + #if defined(_WIN32) + //not supporting windows yet + VFS::StatVFS(path, data); + return true; + #else + struct statvfs vfs; + if(statvfs(pathStr.c_str(), &vfs) == 0) + { + data.BlockSize = vfs.f_bsize; + data.FragmentSize = vfs.f_frsize; + data.Blocks = vfs.f_blocks; + data.BlocksFree = vfs.f_bfree; + data.BlocksAvailable = vfs.f_bavail; + data.TotalInodes = vfs.f_files; + data.FreeInodes = vfs.f_ffree; + data.AvailableInodes = vfs.f_favail; + data.Id = vfs.f_fsid; + data.Flags = vfs.f_flag; + data.MaxNameLength = vfs.f_namemax; + return true; + } + return false; + #endif + } + + void LocalFilesystem::Chmod(VFSPath path, uint32_t mode) + { + auto pathStr = this->VFSPathToSystem(path); + #if defined(_WIN32) + + #else + chmod(pathStr.c_str(), (mode_t)mode); + #endif + } + + std::shared_ptr LocalFS; } // C:/Users/Jim/Joel diff --git a/src/Filesystem/MemoryFilesystem.cpp b/src/Filesystem/MemoryFilesystem.cpp index 4e15253..db04e4a 100644 --- a/src/Filesystem/MemoryFilesystem.cpp +++ b/src/Filesystem/MemoryFilesystem.cpp @@ -116,7 +116,7 @@ namespace Tesses::Framework::Filesystem return nullptr; } - Streams::Stream* MemoryFilesystem::OpenFile(VFSPath path, std::string mode) + std::shared_ptr MemoryFilesystem::OpenFile(VFSPath path, std::string mode) { bool canRead=false; bool canWrite=false; @@ -181,7 +181,7 @@ namespace Tesses::Framework::Filesystem if(canWrite) f->data->canAccess=false; mtx->Unlock(); - return new MemoryFilesystemStream(mtx,f->data,canRead,canWrite,canSeek); + return std::make_shared(mtx,f->data,canRead,canWrite,canSeek); } else { @@ -204,7 +204,7 @@ namespace Tesses::Framework::Filesystem file->data->readers++; if(truncate) {file->data->file.clear(); file->data->lastWrite=Date::DateTime::NowUTC();} mtx->Unlock(); - return new MemoryFilesystemStream(mtx,file->data,canRead,canWrite,canSeek); + return std::make_shared(mtx,file->data,canRead,canWrite,canSeek); } @@ -287,7 +287,7 @@ namespace Tesses::Framework::Filesystem myDir->entries.push_back(f); mtx->Unlock(); - return new MemoryFilesystemStream(mtx,f->data,canRead,canWrite,canSeek); + return std::make_shared(mtx,f->data,canRead,canWrite,canSeek); } if(thefile != nullptr) { @@ -305,7 +305,7 @@ namespace Tesses::Framework::Filesystem thefile->data->readers++; if(truncate) {thefile->data->file.clear(); thefile->data->lastWrite=Date::DateTime::NowUTC();} mtx->Unlock(); - return new MemoryFilesystemStream(mtx,thefile->data,canRead,canWrite,canSeek); + return std::make_shared(mtx,thefile->data,canRead,canWrite,canSeek); } } diff --git a/src/Filesystem/MountableFilesystem.cpp b/src/Filesystem/MountableFilesystem.cpp index 7358924..1e6cb51 100644 --- a/src/Filesystem/MountableFilesystem.cpp +++ b/src/Filesystem/MountableFilesystem.cpp @@ -3,29 +3,26 @@ #include namespace Tesses::Framework::Filesystem { - MountableFilesystem::MountableFilesystem() : MountableFilesystem(new NullFilesystem(),true) + MountableFilesystem::MountableFilesystem() : MountableFilesystem(std::make_shared()) { } - MountableFilesystem::MountableFilesystem(VFS* root, bool owns) + MountableFilesystem::MountableFilesystem(std::shared_ptr root) { this->root = root; - this->owns = owns; } MountableDirectory::~MountableDirectory() { - if(this->owns && this->vfs) delete this->vfs; for(auto dir : this->dirs) delete dir; } MountableFilesystem::~MountableFilesystem() { - if(this->owns && this->root) delete root; for(auto item : this->directories) delete item; } - void MountableFilesystem::GetFS(VFSPath srcPath, VFSPath& destRoot, VFSPath& destPath, VFS*& vfs) + void MountableFilesystem::GetFS(VFSPath srcPath, VFSPath& destRoot, VFSPath& destPath, std::shared_ptr& vfs) { if(srcPath.path.empty()) return; for(auto item : this->directories) @@ -52,7 +49,7 @@ namespace Tesses::Framework::Filesystem - void MountableDirectory::GetFS(VFSPath srcPath, VFSPath curDir, VFSPath& destRoot, VFSPath& destPath, VFS*& vfs) + void MountableDirectory::GetFS(VFSPath srcPath, VFSPath curDir, VFSPath& destRoot, VFSPath& destPath, std::shared_ptr& vfs) { if(srcPath.path.empty()) return; for(auto item : this->dirs) @@ -83,7 +80,7 @@ namespace Tesses::Framework::Filesystem path = path.CollapseRelativeParents(); VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); if(vfs != nullptr) @@ -91,12 +88,37 @@ namespace Tesses::Framework::Filesystem return VFSPath(); } - Tesses::Framework::Streams::Stream* MountableFilesystem::OpenFile(VFSPath path, std::string mode) + bool MountableFilesystem::StatVFS(VFSPath path, StatVFSData& data) { path = path.CollapseRelativeParents(); VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; + + GetFS(path, destRoot, destPath, vfs); + if(vfs != nullptr) + return vfs->StatVFS(destPath,data); + return false; + } + void MountableFilesystem::Chmod(VFSPath path, uint32_t mode) + { + path = path.CollapseRelativeParents(); + VFSPath destRoot; + VFSPath destPath = path; + std::shared_ptr vfs = root; + + GetFS(path, destRoot, destPath, vfs); + if(vfs != nullptr) + vfs->Chmod(destPath,mode); + } + + + std::shared_ptr MountableFilesystem::OpenFile(VFSPath path, std::string mode) + { + path = path.CollapseRelativeParents(); + VFSPath destRoot; + VFSPath destPath = path; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -110,7 +132,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -128,7 +150,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -145,7 +167,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -160,7 +182,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -174,7 +196,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -189,7 +211,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -203,7 +225,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -217,7 +239,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -232,7 +254,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -248,7 +270,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -265,7 +287,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); if(destPath.path.empty()) return true; @@ -280,7 +302,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -295,7 +317,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -309,7 +331,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -323,10 +345,10 @@ namespace Tesses::Framework::Filesystem VFSPath existingDestRoot; VFSPath existingDestPath = existingFile; - VFS* existingVFS = root; + std::shared_ptr existingVFS = root; VFSPath symlinkDestRoot; VFSPath symlinkDestPath = symlinkFile; - VFS* symlinkVFS = root; + std::shared_ptr symlinkVFS = root; GetFS(existingFile, existingDestRoot, existingDestPath, existingVFS); GetFS(symlinkFile, symlinkDestRoot, symlinkDestPath, symlinkVFS); @@ -342,10 +364,10 @@ namespace Tesses::Framework::Filesystem VFSPath srcDestRoot; VFSPath srcDestPath = src; - VFS* srcVFS = root; + std::shared_ptr srcVFS = root; VFSPath destDestRoot; VFSPath destDestPath = dest; - VFS* destVFS = root; + std::shared_ptr destVFS = root; GetFS(src, srcDestRoot, srcDestPath, srcVFS); GetFS(dest, destDestRoot, destDestPath, destVFS); @@ -360,10 +382,10 @@ namespace Tesses::Framework::Filesystem VFSPath srcDestRoot; VFSPath srcDestPath = src; - VFS* srcVFS = root; + std::shared_ptr srcVFS = root; VFSPath destDestRoot; VFSPath destDestPath = dest; - VFS* destVFS = root; + std::shared_ptr destVFS = root; GetFS(src, srcDestRoot, srcDestPath, srcVFS); GetFS(dest, destDestRoot, destDestPath, destVFS); @@ -378,10 +400,10 @@ namespace Tesses::Framework::Filesystem VFSPath existingDestRoot; VFSPath existingDestPath = existingFile; - VFS* existingVFS = root; + std::shared_ptr existingVFS = root; VFSPath newNameRoot; VFSPath newNamePath = newName; - VFS* newNameVFS = root; + std::shared_ptr newNameVFS = root; GetFS(existingFile, existingDestRoot, existingDestPath, existingVFS); GetFS(newName, newNameRoot, newNamePath, newNameVFS); @@ -427,7 +449,7 @@ namespace Tesses::Framework::Filesystem VFSPath destRoot; VFSPath destPath = path; - VFS* vfs = root; + std::shared_ptr vfs = root; GetFS(path, destRoot, destPath, vfs); @@ -476,13 +498,12 @@ namespace Tesses::Framework::Filesystem }); } - void MountableFilesystem::Mount(VFSPath path, VFS* fs, bool owns) + void MountableFilesystem::Mount(VFSPath path, std::shared_ptr fs) { path = path.CollapseRelativeParents(); if(path.path.empty()) { - if(owns) delete fs; return; } @@ -520,7 +541,7 @@ namespace Tesses::Framework::Filesystem if(item->name == lastDir) { needToCreate=false; - if(item->owns && item->vfs) delete item->vfs; + item->vfs = fs; break; } @@ -530,7 +551,7 @@ namespace Tesses::Framework::Filesystem { MountableDirectory* dir = new MountableDirectory(); dir->name = lastDir; - dir->owns=owns; + dir->vfs=fs; fsLs->push_back(dir); } @@ -541,7 +562,6 @@ namespace Tesses::Framework::Filesystem { if(path.path.empty()) { - if(dir->owns && dir->vfs) delete dir->vfs; dir->vfs = nullptr; } diff --git a/src/Filesystem/NullFilesystem.cpp b/src/Filesystem/NullFilesystem.cpp index adbf9e2..75ed930 100644 --- a/src/Filesystem/NullFilesystem.cpp +++ b/src/Filesystem/NullFilesystem.cpp @@ -2,7 +2,7 @@ namespace Tesses::Framework::Filesystem { - Tesses::Framework::Streams::Stream* NullFilesystem::OpenFile(VFSPath path, std::string mode) + std::shared_ptr NullFilesystem::OpenFile(VFSPath path, std::string mode) { return nullptr; } diff --git a/src/Filesystem/SubdirFilesystem.cpp b/src/Filesystem/SubdirFilesystem.cpp index 5ed4d5e..79cbe26 100644 --- a/src/Filesystem/SubdirFilesystem.cpp +++ b/src/Filesystem/SubdirFilesystem.cpp @@ -29,10 +29,10 @@ namespace Tesses::Framework::Filesystem { return this->path / path.CollapseRelativeParents(); } - SubdirFilesystem::SubdirFilesystem(VFS* parent, VFSPath path, bool owns) + SubdirFilesystem::SubdirFilesystem(std::shared_ptr parent, VFSPath path) { this->parent = parent; - if(path.relative && dynamic_cast(parent) != nullptr) + if(path.relative && std::dynamic_pointer_cast(parent) != nullptr) { Tesses::Framework::Filesystem::LocalFilesystem lfs; auto curDir = std::filesystem::current_path(); @@ -41,9 +41,9 @@ namespace Tesses::Framework::Filesystem } else this->path = path; - this->owns=owns; + } - Tesses::Framework::Streams::Stream* SubdirFilesystem::OpenFile(VFSPath path, std::string mode) + std::shared_ptr SubdirFilesystem::OpenFile(VFSPath path, std::string mode) { return this->parent->OpenFile(ToParent(path),mode); } @@ -151,7 +151,16 @@ namespace Tesses::Framework::Filesystem SubdirFilesystem::~SubdirFilesystem() { - if(this->owns) - delete this->parent; + } + bool SubdirFilesystem::StatVFS(VFSPath path, StatVFSData& vfsData) + { + return this->parent->StatVFS(path, vfsData); + } + + void SubdirFilesystem::Chmod(VFSPath path, uint32_t mode) + { + return this->parent->Chmod(path, mode); + } + } diff --git a/src/Filesystem/VFS.cpp b/src/Filesystem/VFS.cpp index 429d569..c485003 100644 --- a/src/Filesystem/VFS.cpp +++ b/src/Filesystem/VFS.cpp @@ -194,11 +194,11 @@ namespace Tesses::Framework::Filesystem VFSPath VFSPath::GetAbsoluteCurrentDirectory() { auto p = std::filesystem::current_path(); - return LocalFS.SystemToVFSPath(p.string()); + return LocalFS->SystemToVFSPath(p.string()); } void VFSPath::SetAbsoluteCurrentDirectory(VFSPath path) { - auto res = LocalFS.VFSPathToSystem(path); + auto res = LocalFS->VFSPathToSystem(path); std::filesystem::path mpath=res; std::filesystem::current_path(mpath); } @@ -499,5 +499,23 @@ namespace Tesses::Framework::Filesystem { } + bool VFS::StatVFS(VFSPath path, StatVFSData& data) + { + data.BlockSize = 512; + data.Blocks=10000000000000; + data.BlocksFree=10000000000000; + data.BlocksAvailable=10000000000000; + data.AvailableInodes=10000000000000; + data.TotalInodes=10000000000000; + data.FreeInodes=10000000000000; + data.FragmentSize=512; + data.Id = 85138; + data.Flags = 0; + data.MaxNameLength=255; + return true; + } + void VFS::Chmod(VFSPath path, uint32_t mode) { + + } } \ No newline at end of file diff --git a/src/Http/FileServer.cpp b/src/Http/FileServer.cpp index 5553109..0bcd407 100644 --- a/src/Http/FileServer.cpp +++ b/src/Http/FileServer.cpp @@ -15,23 +15,20 @@ namespace Tesses::Framework::Http } FileServer::FileServer(std::filesystem::path path,bool allowListing, bool spa, std::vector defaultNames) { - LocalFilesystem* lfs=new LocalFilesystem(); - SubdirFilesystem* sdfs=new SubdirFilesystem(lfs,lfs->SystemToVFSPath(path.string()),true); + std::shared_ptr sdfs=std::make_shared(Tesses::Framework::Filesystem::LocalFS,Tesses::Framework::Filesystem::LocalFS->SystemToVFSPath(path.string())); this->vfs = sdfs; this->spa = spa; - this->ownsVFS=true; this->allowListing = allowListing; this->defaultNames = defaultNames; } - FileServer::FileServer(Tesses::Framework::Filesystem::VFS* fs, bool owns, bool allowListing,bool spa) : FileServer(fs,owns,allowListing,spa,{"index.html","default.html","index.htm","default.htm"}) + FileServer::FileServer(std::shared_ptr fs, bool allowListing,bool spa) : FileServer(fs,allowListing,spa,{"index.html","default.html","index.htm","default.htm"}) { } - FileServer::FileServer(Tesses::Framework::Filesystem::VFS* fs, bool owns, bool allowListing, bool spa, std::vector defaultNames) + FileServer::FileServer(std::shared_ptr fs, bool allowListing, bool spa, std::vector defaultNames) { this->vfs = fs; - this->ownsVFS = owns; this->allowListing = allowListing; this->defaultNames = defaultNames; this->spa = spa; @@ -49,8 +46,6 @@ namespace Tesses::Framework::Http retVal = true; } - - delete strm; return retVal; } @@ -130,7 +125,6 @@ namespace Tesses::Framework::Http } FileServer::~FileServer() { - if(this->ownsVFS) - delete this->vfs; + } } \ No newline at end of file diff --git a/src/Http/HttpClient.cpp b/src/Http/HttpClient.cpp index 8307f24..0175faf 100644 --- a/src/Http/HttpClient.cpp +++ b/src/Http/HttpClient.cpp @@ -41,7 +41,7 @@ namespace Tesses::Framework::Http dict.SetValue("Content-Type",this->mimeType); dict.SetValue("Content-Length",std::to_string(this->text.size())); } - void TextHttpRequestBody::Write(Tesses::Framework::Streams::Stream* strm) + void TextHttpRequestBody::Write(std::shared_ptr strm) { strm->WriteBlock((const uint8_t*)this->text.c_str(),this->text.size()); } @@ -50,10 +50,9 @@ namespace Tesses::Framework::Http } - StreamHttpRequestBody::StreamHttpRequestBody(Stream* strm, bool owns, std::string mimeType) + StreamHttpRequestBody::StreamHttpRequestBody(std::shared_ptr strm, std::string mimeType) { this->strm = strm; - this->owns = owns; this->mimeType = mimeType; } void StreamHttpRequestBody::HandleHeaders(HttpDictionary& dict) @@ -63,14 +62,12 @@ namespace Tesses::Framework::Http if(len > -1) dict.AddValue("Content-Length",std::to_string(len)); } - void StreamHttpRequestBody::Write(Tesses::Framework::Streams::Stream* strm) + void StreamHttpRequestBody::Write(std::shared_ptr strm) { this->strm->CopyTo(strm); } StreamHttpRequestBody::~StreamHttpRequestBody() { - if(this->owns) - delete this->strm; } HttpRequest::HttpRequest() { @@ -82,7 +79,7 @@ namespace Tesses::Framework::Http this->requestHeaders.SetValue("Connection","close"); } - void HttpRequest::SendRequest(Tesses::Framework::Streams::Stream* strm) + void HttpRequest::SendRequest(std::shared_ptr strm) { Uri uri; if(!Uri::TryParse(this->url, uri)) return; @@ -109,7 +106,7 @@ namespace Tesses::Framework::Http request.append("\r\n"); - StreamWriter writer(strm, false); + StreamWriter writer(strm); writer.Write(request); if(body != nullptr) @@ -117,52 +114,51 @@ namespace Tesses::Framework::Http body->Write(strm); } } - Stream* HttpRequest::EstablishConnection(Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle) + std::shared_ptr HttpRequest::EstablishConnection(Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle) { if(uri.scheme == "http:" || uri.scheme == "ws:") { - return new NetworkStream(uri.host,uri.GetPort(),false,false,false); + return std::make_shared(uri.host,uri.GetPort(),false,false,false); } else if(uri.scheme == "https:" || uri.scheme == "wss:") { - auto netStrm = new NetworkStream(uri.host,uri.GetPort(),false,false,false); + auto netStrm = std::make_shared(uri.host,uri.GetPort(),false,false,false); if(netStrm == nullptr) return nullptr; - return new ClientTLSStream(netStrm, true, !ignoreSSLErrors,uri.host, trusted_root_cert_bundle); + return std::make_shared(netStrm, !ignoreSSLErrors,uri.host, trusted_root_cert_bundle); } return nullptr; } - Stream* HttpRequest::EstablishUnixPathConnection(std::string unixPath,Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle) + std::shared_ptr HttpRequest::EstablishUnixPathConnection(std::string unixPath,Uri uri, bool ignoreSSLErrors, std::string trusted_root_cert_bundle) { if(uri.scheme == "http:" || uri.scheme == "ws:") { - return new NetworkStream(unixPath,false); + return std::make_shared(unixPath,false); } else if(uri.scheme == "https:" || uri.scheme == "wss:") { - auto netStrm = new NetworkStream(unixPath,false); + auto netStrm = std::make_shared (unixPath,false); if(netStrm == nullptr) return nullptr; - return new ClientTLSStream(netStrm, true, !ignoreSSLErrors,uri.host, trusted_root_cert_bundle); + return std::make_shared(netStrm, !ignoreSSLErrors,uri.host, trusted_root_cert_bundle); } return nullptr; } - Tesses::Framework::Streams::Stream* HttpResponse::GetInternalStream() + std::shared_ptr HttpResponse::GetInternalStream() { return this->handleStrm; } HttpResponse::~HttpResponse() { - if(this->owns) - delete this->handleStrm; + } - HttpResponse::HttpResponse(Stream* strm, bool owns) + HttpResponse::HttpResponse(std::shared_ptr strm) { this->handleStrm=nullptr; this->owns=owns; - StreamReader reader(strm, false); + StreamReader reader(strm); std::string statusLine; if(!reader.ReadLine(statusLine)) return; auto statusLinesPart = HttpUtils::SplitString(statusLine," ",3); @@ -178,7 +174,6 @@ namespace Tesses::Framework::Http auto v = HttpUtils::SplitString(line,": ", 2); if(v.size() != 2) { - delete strm; return; } this->responseHeaders.AddValue(v[0],v[1]); @@ -222,7 +217,7 @@ namespace Tesses::Framework::Http request.append("\r\n"); - StreamWriter writer(strm, false); + StreamWriter writer(strm); writer.Write(request); if(req.body != nullptr) @@ -230,7 +225,7 @@ namespace Tesses::Framework::Http req.body->Write(strm); } - StreamReader reader(strm, false); + StreamReader reader(strm); std::string statusLine; if(!reader.ReadLine(statusLine)) break; auto statusLinesPart = HttpUtils::SplitString(statusLine," ",3); @@ -246,7 +241,6 @@ namespace Tesses::Framework::Http auto v = HttpUtils::SplitString(line,": ", 2); if(v.size() != 2) { - delete strm; return; } this->responseHeaders.AddValue(v[0],v[1]); @@ -264,7 +258,6 @@ namespace Tesses::Framework::Http url = uri2.ToString(); - delete strm; continue; } this->handleStrm = strm; @@ -275,18 +268,18 @@ namespace Tesses::Framework::Http { auto strm = ReadAsStream(); if(strm == nullptr) return {}; - StreamReader r(strm, true); + StreamReader r(strm); return r.ReadToEnd(); } - void HttpResponse::CopyToStream(Stream* strm) + void HttpResponse::CopyToStream(std::shared_ptr strm) { if(strm == nullptr) return; auto src = ReadAsStream(); if(src == nullptr) return; - src->CopyTo(*strm); - delete src; + src->CopyTo(strm); + } - Stream* HttpResponse::ReadAsStream() + std::shared_ptr HttpResponse::ReadAsStream() { if(this->handleStrm == nullptr) return nullptr; int64_t length = -1; @@ -295,10 +288,10 @@ namespace Tesses::Framework::Http length = -1; } - return new HttpStream(this->handleStrm,false,length,true,version=="HTTP/1.1"); + return std::make_shared(this->handleStrm,length,true,version=="HTTP/1.1"); } - void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, Tesses::Framework::Streams::Stream* strm) + void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, std::shared_ptr strm) { if(strm == nullptr) throw std::runtime_error("strm is null"); HttpRequest request; @@ -310,26 +303,17 @@ namespace Tesses::Framework::Http if(response.statusCode < 200 || response.statusCode > 299) throw std::runtime_error("Status code does not indicate success: " + std::to_string(response.statusCode) + " " + HttpUtils::StatusCodeString(response.statusCode)); response.CopyToStream(strm); } - void DownloadUnixSocketToStreamSimple(std::string unixSocket,std::string url, Tesses::Framework::Streams::Stream& strm) - { - DownloadUnixSocketToStreamSimple(unixSocket,url,&strm); - } + - void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFS* vfs, Tesses::Framework::Filesystem::VFSPath path) + void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, std::shared_ptr vfs, Tesses::Framework::Filesystem::VFSPath path) { if(vfs == nullptr) throw std::runtime_error("vfs is null"); auto strm = vfs->OpenFile(path,"wb"); if(strm == nullptr) throw std::runtime_error("strm is null"); DownloadUnixSocketToStreamSimple(unixSocket,url,strm); - delete strm; - } - void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFS& vfs, Tesses::Framework::Filesystem::VFSPath path) - { - auto strm = vfs.OpenFile(path,"wb"); - if(strm == nullptr) throw std::runtime_error("strm is null"); - DownloadUnixSocketToStreamSimple(unixSocket,url,strm); - delete strm; + } + void DownloadUnixSocketToFileSimple(std::string unixSocket,std::string url, Tesses::Framework::Filesystem::VFSPath path) { DownloadUnixSocketToFileSimple(unixSocket,url,Tesses::Framework::Filesystem::LocalFS,path); @@ -345,23 +329,17 @@ namespace Tesses::Framework::Http if(response.statusCode < 200 || response.statusCode > 299) throw std::runtime_error("Status code does not indicate success: " + std::to_string(response.statusCode) + " " + HttpUtils::StatusCodeString(response.statusCode)); return response.ReadAsString(); } - void DownloadToStreamSimple(std::string url, Tesses::Framework::Streams::Stream* strm) - { - DownloadUnixSocketToStreamSimple("",url,strm); - } - void DownloadToStreamSimple(std::string url, Tesses::Framework::Streams::Stream& strm) + void DownloadToStreamSimple(std::string url, std::shared_ptr strm) { DownloadUnixSocketToStreamSimple("",url,strm); } + - void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFS* vfs, Tesses::Framework::Filesystem::VFSPath path) - { - DownloadUnixSocketToFileSimple("",url,vfs,path); - } - void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFS& vfs, Tesses::Framework::Filesystem::VFSPath path) + void DownloadToFileSimple(std::string url, std::shared_ptr vfs, Tesses::Framework::Filesystem::VFSPath path) { DownloadUnixSocketToFileSimple("",url,vfs,path); } + void DownloadToFileSimple(std::string url, Tesses::Framework::Filesystem::VFSPath path) { DownloadUnixSocketToFileSimple("",url,path); @@ -381,22 +359,15 @@ namespace Tesses::Framework::Http { return true; } - void WebSocketClient(std::string url, HttpDictionary& requestHeaders, WebSocketConnection& wsc, std::function cb) - { - WebSocketUnixSocketClient("",url,requestHeaders,wsc,cb); - } - void WebSocketUnixSocketClient(std::string unixSocket,std::string url, HttpDictionary& requestHeaders, WebSocketConnection& wsc, std::function cb) - { - WebSocketUnixSocketClient(unixSocket,url,requestHeaders, &wsc,cb); - } + class WSClient { public: std::atomic closed; Threading::Mutex mtx; - WebSocketConnection* conn; - Stream* strm; + std::shared_ptr conn; + std::shared_ptr strm; void close() { mtx.Lock(); @@ -557,7 +528,7 @@ namespace Tesses::Framework::Http return true; } - WSClient(Tesses::Framework::Streams::Stream* strm,WebSocketConnection* conn) + WSClient(std::shared_ptr strm,std::shared_ptr conn) { this->strm = strm; this->conn = conn; @@ -626,12 +597,12 @@ namespace Tesses::Framework::Http }; - void WebSocketClient(std::string url, HttpDictionary& requestHeaders, WebSocketConnection* wsc, std::function cb) + void WebSocketClient(std::string url, HttpDictionary& requestHeaders, std::shared_ptr wsc, std::function cb) { WebSocketUnixSocketClient("",url,requestHeaders,wsc,cb); } - void WebSocketUnixSocketClient(std::string unixSocket,std::string url, HttpDictionary& requestHeaders, WebSocketConnection* wsc, std::function cb) + void WebSocketUnixSocketClient(std::string unixSocket,std::string url, HttpDictionary& requestHeaders, std::shared_ptr wsc, std::function cb) { HttpRequest req; req.url = url; diff --git a/src/Http/HttpServer.cpp b/src/Http/HttpServer.cpp index 3e0265f..c6a6cc0 100644 --- a/src/Http/HttpServer.cpp +++ b/src/Http/HttpServer.cpp @@ -29,8 +29,8 @@ namespace Tesses::Framework::Http public: Threading::Mutex mtx; ServerContext* ctx; - WebSocketConnection* conn; - Stream* strm; + std::shared_ptr conn; + std::shared_ptr strm; std::atomic_bool hasInit; std::atomic closed; void close() @@ -42,7 +42,6 @@ namespace Tesses::Framework::Http strm->WriteByte(firstByte); strm->WriteByte(0); - delete strm; this->strm = nullptr; mtx.Unlock(); this->conn->OnClose(true); @@ -180,11 +179,11 @@ namespace Tesses::Framework::Http return true; } - WSServer(ServerContext* ctx,WebSocketConnection* conn) + WSServer(ServerContext* ctx,std::shared_ptr conn) { this->ctx = ctx; this->conn = conn; - this->strm = &this->ctx->GetStream(); + this->strm = this->ctx->GetStream(); this->hasInit=false; @@ -352,27 +351,23 @@ namespace Tesses::Framework::Http if(this->queryParams.kvp.empty()) return this->originalPath; return this->originalPath + "?" + HttpUtils::QueryParamsEncode(this->queryParams); } - void ServerContext::ReadStream(Stream* strm) + void ServerContext::ReadStream(std::shared_ptr strm) { if(strm == nullptr) return; auto strm2 = this->OpenRequestStream(); if(strm2 != nullptr) { strm2->CopyTo(strm); - delete strm2; } } - void ServerContext::ReadStream(Stream& strm) - { - ReadStream(&strm); - } + std::string ServerContext::ReadString() { if(strm == nullptr) return {}; auto strm2 = this->OpenRequestStream(); if(strm2 != nullptr) { - TextStreams::StreamReader reader(strm2,true); + TextStreams::StreamReader reader(strm2); return reader.ReadToEnd(); } return {}; @@ -389,7 +384,7 @@ namespace Tesses::Framework::Http } return false; } - static bool parseUntillBoundaryEnd(Tesses::Framework::Streams::Stream* src, Tesses::Framework::Streams::Stream* dest, std::string boundary) + static bool parseUntillBoundaryEnd(std::shared_ptr src, std::shared_ptr dest, std::string boundary) { bool hasMore=true; #if defined(_WIN32) @@ -466,7 +461,7 @@ namespace Tesses::Framework::Http return hasMore; } - static bool parseSection(ServerContext* ctx, std::string boundary, std::function cb) + static bool parseSection(ServerContext* ctx, std::string boundary, std::function(std::string mime, std::string filename, std::string name)> cb) { HttpDictionary req; StreamReader reader(ctx->GetStream()); @@ -489,10 +484,10 @@ namespace Tesses::Framework::Http { if(cd1.filename.empty()) { - MemoryStream ms(true); + std::shared_ptr ms=std::make_shared(true); - bool retVal = parseUntillBoundaryEnd(&ctx->GetStream(),&ms,boundary); - auto& buff = ms.GetBuffer(); + bool retVal = parseUntillBoundaryEnd(ctx->GetStream(),ms,boundary); + auto& buff = ms->GetBuffer(); ctx->queryParams.AddValue(cd1.fieldName, std::string(buff.begin(),buff.end())); @@ -502,16 +497,16 @@ namespace Tesses::Framework::Http else { auto strm = cb(ct, cd1.filename, cd1.fieldName); - if(strm == nullptr) strm = new Stream(); - bool retVal = parseUntillBoundaryEnd(&ctx->GetStream(),strm,boundary); - delete strm; + if(strm == nullptr) strm = std::make_shared(); + bool retVal = parseUntillBoundaryEnd(ctx->GetStream(),strm,boundary); + return retVal; } } return false; } - void ServerContext::ParseFormData(std::function cb) + void ServerContext::ParseFormData(std::function(std::string mime, std::string filename, std::string name)> cb) { std::string ct; if(this->requestHeaders.TryGetFirst("Content-Type",ct)) @@ -525,51 +520,33 @@ namespace Tesses::Framework::Http if(res == std::string::npos) return; ct = "--" + ct.substr(res+9); } - Stream nullStrm; - parseUntillBoundaryEnd(this->strm,&nullStrm, ct); + std::shared_ptr nullStrm=std::make_shared(); + parseUntillBoundaryEnd(this->strm,nullStrm, ct); while(parseSection(this, ct, cb)); } - HttpServer::HttpServer(Tesses::Framework::Streams::TcpServer& tcpServer, IHttpServer& http, bool showIPs) : HttpServer(&tcpServer,false,&http,false,showIPs) - { - } - HttpServer::HttpServer(Tesses::Framework::Streams::TcpServer* tcpServer, bool ownsTCP, IHttpServer& http, bool showIPs) : HttpServer(tcpServer,ownsTCP,&http,false,showIPs) - { - - } - HttpServer::HttpServer(Tesses::Framework::Streams::TcpServer& tcpServer, IHttpServer* http, bool ownsHttpServer, bool showIPs) : HttpServer(&tcpServer,false,http,ownsHttpServer,showIPs) - { - - } - HttpServer::HttpServer(Tesses::Framework::Streams::TcpServer* tcpServer, bool ownsTCP, IHttpServer* http, bool ownsHttpServer, bool showIPs) + HttpServer::HttpServer(std::shared_ptr tcpServer, std::shared_ptr http, bool showIPs) { this->server = tcpServer; - this->ownsTCP = ownsTCP; this->http = http; - this->ownsHttp = ownsHttpServer; + this->showIPs = showIPs; this->thrd=nullptr; this->showARTL = showIPs; } - HttpServer::HttpServer(uint16_t port, IHttpServer* http, bool owns, bool showIPs) : HttpServer(new TcpServer(port,10),true,http,owns,showIPs) + HttpServer::HttpServer(uint16_t port, std::shared_ptr http, bool showIPs) : HttpServer(std::make_shared(port,10),http,showIPs) { } - HttpServer::HttpServer(uint16_t port, IHttpServer& http,bool showIPs) : HttpServer(port,&http,false,showIPs) - { - - } - HttpServer::HttpServer(std::string unixPath, IHttpServer* http, bool owns) : HttpServer(new TcpServer(unixPath,10),true,http,owns,false) + + HttpServer::HttpServer(std::string unixPath, std::shared_ptr http) : HttpServer(std::make_shared(unixPath,10),http,false) { this->showARTL=true; } - HttpServer::HttpServer(std::string unixPath, IHttpServer& http) : HttpServer(unixPath,&http,false) - { - - } + uint16_t HttpServer::GetPort() { @@ -577,7 +554,7 @@ namespace Tesses::Framework::Http return server->GetPort(); return 0; } - Stream* ServerContext::OpenResponseStream() + std::shared_ptr ServerContext::OpenResponseStream() { if(sent) return nullptr; int64_t length = -1; @@ -588,14 +565,14 @@ namespace Tesses::Framework::Http this->responseHeaders.SetValue("Transfer-Encoding","chunked"); this->WriteHeaders(); - return new HttpStream(this->strm,false,length,false,version == "HTTP/1.1"); + return std::make_shared(this->strm,length,false,version == "HTTP/1.1"); } - Stream* ServerContext::OpenRequestStream() + std::shared_ptr ServerContext::OpenRequestStream() { int64_t length = -1; if(!this->requestHeaders.TryGetFirstInt("Content-Length",length)) length = -1; - return new HttpStream(this->strm,false,length,true,version == "HTTP/1.1"); + return std::make_shared(this->strm,length,true,version == "HTTP/1.1"); } void HttpServer::StartAccepting() { @@ -622,9 +599,9 @@ namespace Tesses::Framework::Http TF_LOG("Before entering socket thread"); Threading::Thread thrd2([sock,http,ip,port]()->void { TF_LOG("In thread to process"); - HttpServer::Process(*sock,*http,ip,port,false); + HttpServer::Process(sock,http,ip,port,false); TF_LOG("In thread after process"); - delete sock; + }); TF_LOG("Before attach"); thrd2.Detach(); @@ -664,16 +641,13 @@ namespace Tesses::Framework::Http this->thrd->Join(); delete this->thrd; } - if(this->ownsHttp) - delete http; - if(this->ownsTCP) - delete this->server; + } IHttpServer::~IHttpServer() { } - ServerContext::ServerContext(Stream* strm) + ServerContext::ServerContext(std::shared_ptr strm) { this->statusCode = OK; this->strm = strm; @@ -681,14 +655,14 @@ namespace Tesses::Framework::Http this->queryParams.SetCaseSensitive(true); this->responseHeaders.AddValue("Server","TessesFrameworkWebServer"); } - Stream& ServerContext::GetStream() + std::shared_ptr ServerContext::GetStream() { - return *this->strm; + return this->strm; } void ServerContext::SendBytes(std::vector buff) { - MemoryStream strm(false); - strm.GetBuffer() = buff; + std::shared_ptr strm=std::make_shared(false); + strm->GetBuffer() = buff; SendStream(strm); } ServerContext& ServerContext::WithLastModified(Date::DateTime dt) @@ -699,8 +673,9 @@ namespace Tesses::Framework::Http void ServerContext::SendText(std::string text) { - MemoryStream strm(false); - auto& buff= strm.GetBuffer(); + std::shared_ptr strm=std::make_shared(false); + + auto& buff= strm->GetBuffer(); buff.insert(buff.end(),text.begin(),text.end()); SendStream(strm); } @@ -711,11 +686,7 @@ namespace Tesses::Framework::Http WithMimeType("text/html").SendText(errorHtml); } - void ServerContext::SendStream(Stream* strm) - { - if(strm == nullptr) return; - SendStream(*strm); - } + ServerContext::~ServerContext() { for(auto item : this->data) @@ -727,14 +698,14 @@ namespace Tesses::Framework::Http { } - void ServerContext::SendStream(Stream& strm) + void ServerContext::SendStream(std::shared_ptr strm) { if(sent) return; - if(!strm.CanRead()) throw std::runtime_error("Cannot read from stream"); - if(strm.EndOfStream()) throw std::runtime_error("End of stream"); - if(strm.CanSeek()) + if(!strm->CanRead()) throw std::runtime_error("Cannot read from stream"); + if(strm->EndOfStream()) throw std::runtime_error("End of stream"); + if(strm->CanSeek()) { - int64_t len=strm.GetLength(); + int64_t len=strm->GetLength(); std::string range={}; if(this->requestHeaders.TryGetFirst("Range",range)) { @@ -815,7 +786,7 @@ namespace Tesses::Framework::Http this->WithSingleHeader("Content-Range","bytes " + std::to_string(begin) + "-" + std::to_string(end) + "/" + std::to_string(len)); this->statusCode = PartialContent; this->WriteHeaders(); - strm.Seek(begin,SeekOrigin::Begin); + strm->Seek(begin,SeekOrigin::Begin); uint8_t buffer[1024]; @@ -825,7 +796,7 @@ namespace Tesses::Framework::Http myLen = (end - begin)+1; if(myLen < read) read = (size_t)myLen; if(read == 0) break; - read = strm.Read(buffer,read); + read = strm->Read(buffer,read); if(read == 0) break; this->strm->WriteBlock(buffer,read); @@ -848,7 +819,7 @@ namespace Tesses::Framework::Http this->WithSingleHeader("Accept-Range","bytes"); this->WithSingleHeader("Content-Length",std::to_string(len)); this->WriteHeaders(); - strm.CopyTo(*this->strm); + strm->CopyTo(this->strm); } } @@ -857,7 +828,7 @@ namespace Tesses::Framework::Http { auto chunkedStream = this->OpenResponseStream(); this->strm->CopyTo(chunkedStream); - delete chunkedStream; + } } @@ -920,7 +891,7 @@ namespace Tesses::Framework::Http if(this->sent) return *this; this->sent = true; - StreamWriter writer(this->strm,false); + StreamWriter writer(this->strm); writer.newline = "\r\n"; writer.WriteLine("HTTP/1.1 " + std::to_string((int)statusCode) + " " + HttpUtils::StatusCodeString(statusCode)); for(auto& hdr : responseHeaders.kvp) @@ -935,14 +906,14 @@ namespace Tesses::Framework::Http return *this; } - void HttpServer::Process(Stream& strm, IHttpServer& server, std::string ip, uint16_t port, bool encrypted) + void HttpServer::Process(std::shared_ptr strm, std::shared_ptr server, std::string ip, uint16_t port, bool encrypted) { TF_LOG("In process"); while(true) { - BufferedStream bStrm(strm); + std::shared_ptr bStrm = std::make_shared(strm); StreamReader reader(bStrm); - ServerContext ctx(&bStrm); + ServerContext ctx(bStrm); ctx.ip = ip; ctx.port = port; ctx.encrypted = encrypted; @@ -1002,13 +973,13 @@ namespace Tesses::Framework::Http { size_t len = (size_t)length; uint8_t* buffer = new uint8_t[len]; - len = bStrm.ReadBlock(buffer,len); + len = bStrm->ReadBlock(buffer,len); std::string query((const char*)buffer,len); delete[] buffer; HttpUtils::QueryParamsDecode(ctx.queryParams, query); } - if(!server.Handle(ctx)) + if(!server->Handle(ctx)) { ctx.SendNotFound(); } @@ -1047,7 +1018,7 @@ namespace Tesses::Framework::Http if(HttpUtils::ToLower(connection) != "keep-alive") return; } - if(bStrm.EndOfStream()) { + if(bStrm->EndOfStream()) { return; } } @@ -1059,16 +1030,16 @@ namespace Tesses::Framework::Http } void ServerContext::StartWebSocketSession(std::function,std::function,std::function)> onOpen, std::function onReceive, std::function onClose) { - CallbackWebSocketConnection wsc(onOpen,onReceive,onClose); + std::shared_ptr wsc = std::make_shared(onOpen,onReceive,onClose); StartWebSocketSession(wsc); } - void ServerContext::StartWebSocketSession(WebSocketConnection& connection) + void ServerContext::StartWebSocketSession(std::shared_ptr connection) { - WSServer svr(this,&connection); + WSServer svr(this,connection); Threading::Thread thrd([&svr,&connection]()->void{ try { - connection.OnOpen([&svr](WebSocketMessage& msg)->void { + connection->OnOpen([&svr](WebSocketMessage& msg)->void { svr.send_msg(&msg); },[&svr]()->void { std::vector p = {(uint8_t)'p',(uint8_t)'i',(uint8_t)'n',(uint8_t)'g'}; diff --git a/src/Http/HttpStream.cpp b/src/Http/HttpStream.cpp index 75d0623..dcaf289 100644 --- a/src/Http/HttpStream.cpp +++ b/src/Http/HttpStream.cpp @@ -7,10 +7,9 @@ using StreamWriter = Tesses::Framework::TextStreams::StreamWriter; using StreamReader = Tesses::Framework::TextStreams::StreamReader; namespace Tesses::Framework::Http { - HttpStream::HttpStream(Tesses::Framework::Streams::Stream* strm, bool owns, int64_t length, bool recv, bool http1_1) + HttpStream::HttpStream(std::shared_ptr strm, int64_t length, bool recv, bool http1_1) { this->strm = strm; - this->owns = owns; this->length = length; this->recv = recv; this->http1_1 = http1_1; @@ -18,10 +17,6 @@ namespace Tesses::Framework::Http this->read = 0; this->position = 0; this->done=false; - } - HttpStream::HttpStream(Tesses::Framework::Streams::Stream& strm, int64_t length, bool recv,bool http1_1) : HttpStream(&strm,false,length,recv,http1_1) - { - } bool HttpStream::CanRead() { @@ -79,14 +74,14 @@ namespace Tesses::Framework::Http this->position += len; if(this->offset >= this->read) { - StreamReader reader(this->strm, false); + StreamReader reader(this->strm); reader.ReadLine(); } return len; } else { - StreamReader reader(this->strm, false); + StreamReader reader(this->strm); std::string line = reader.ReadLine(); if(!line.empty()) { @@ -141,7 +136,7 @@ namespace Tesses::Framework::Http std::stringstream strm; strm << std::hex << len; - StreamWriter writer(this->strm,false); + StreamWriter writer(this->strm); writer.newline = "\r\n"; writer.WriteLine(strm.str()); @@ -160,11 +155,10 @@ namespace Tesses::Framework::Http { if(this->length == -1 && this->http1_1) { - StreamWriter writer(this->strm,false); + StreamWriter writer(this->strm); writer.newline = "\r\n"; writer.WriteLine("0"); writer.WriteLine(); } - if(this->owns) delete this->strm; } } \ No newline at end of file diff --git a/src/Http/MountableServer.cpp b/src/Http/MountableServer.cpp index af7ffb0..1d26c65 100644 --- a/src/Http/MountableServer.cpp +++ b/src/Http/MountableServer.cpp @@ -22,26 +22,18 @@ bool MountableServer::StartsWith(Filesystem::VFSPath fullPath, Filesystem::VFSPa } return true; } -MountableServer::MountableServer() : MountableServer(nullptr,false) +MountableServer::MountableServer() : MountableServer(nullptr) { } -MountableServer::MountableServer(IHttpServer* root, bool owns) +MountableServer::MountableServer(std::shared_ptr root) { this->root = root; - this->owns = owns; } -MountableServer::MountableServer(IHttpServer& root) : MountableServer(&root,false) + +void MountableServer::Mount(std::string path, std::shared_ptr server) { - -} -void MountableServer::Mount(std::string path, IHttpServer* server, bool owns) -{ - this->servers.insert(this->servers.begin(), std::pair>(path, std::pair(owns,server))); -} -void MountableServer::Mount(std::string path, IHttpServer& server) -{ - Mount(path,&server,false); + this->servers.insert(this->servers.begin(), std::pair>(path, server)); } void MountableServer::Unmount(std::string path) { @@ -50,7 +42,6 @@ void MountableServer::Unmount(std::string path) auto& item = *i; if(item.first == path) { - if(item.second.first) delete item.second.second; this->servers.erase(i); return; } @@ -64,7 +55,7 @@ bool MountableServer::Handle(ServerContext& ctx) if(StartsWith(oldPath, item.first)) { ctx.path = Subpath(oldPath, item.first); - if(item.second.second->Handle(ctx)) + if(item.second->Handle(ctx)) { ctx.path = oldPath; return true; @@ -79,7 +70,5 @@ bool MountableServer::Handle(ServerContext& ctx) } MountableServer::~MountableServer() { - if(this->owns) delete this->root; - for(auto svr : this->servers) if(svr.second.first) delete svr.second.second; } } diff --git a/src/Mail/Smtp.cpp b/src/Mail/Smtp.cpp index 87141e3..fa9581c 100644 --- a/src/Mail/Smtp.cpp +++ b/src/Mail/Smtp.cpp @@ -5,9 +5,9 @@ #include "TessesFramework/Http/HttpUtils.hpp" namespace Tesses::Framework::Mail { - static void SMTP_ATTACHMENT_WRITE(std::string& myStr, Tesses::Framework::Streams::MemoryStream& strm) + static void SMTP_ATTACHMENT_WRITE(std::string& myStr, std::shared_ptr strm) { - std::string txt = Tesses::Framework::Crypto::Base64_Encode(strm.GetBuffer()); + std::string txt = Tesses::Framework::Crypto::Base64_Encode(strm->GetBuffer()); bool first=true; size_t read; size_t offset = 0; @@ -39,40 +39,30 @@ namespace Tesses::Framework::Mail this->text = text; this->mimeType=mimeType; } - void SMTPStringBody::Write(Tesses::Framework::Streams::Stream* strm) + void SMTPStringBody::Write(std::shared_ptr strm) { strm->WriteBlock((const uint8_t*)this->text.c_str(),this->text.size()); } - SMTPStreamBody::SMTPStreamBody(std::string mimeType,Tesses::Framework::Streams::Stream* strm, bool owns) + SMTPStreamBody::SMTPStreamBody(std::string mimeType,std::shared_ptr strm) { this->mimeType = mimeType; this->stream = strm; - this->owns=owns; } - SMTPStreamBody::SMTPStreamBody(std::string mimeType,Tesses::Framework::Streams::Stream& strm) : SMTPStreamBody(mimeType,&strm,false) - { - - } - void SMTPStreamBody::Write(Tesses::Framework::Streams::Stream* strm) + + void SMTPStreamBody::Write(std::shared_ptr strm) { this->stream->Seek(0L,Tesses::Framework::Streams::SeekOrigin::Begin); this->stream->CopyTo(strm); } SMTPStreamBody::~SMTPStreamBody() { - if(this->owns) - delete this->stream; } - SMTPClient::SMTPClient(Tesses::Framework::Streams::Stream* stream,bool owns) + SMTPClient::SMTPClient(std::shared_ptr stream) { this->strm = stream; - this->owns = owns; this->body = nullptr; } - SMTPClient::SMTPClient(Tesses::Framework::Streams::Stream& strm) : SMTPClient(&strm,false) - { - - } + void SMTPClient::Send() { std::string emailHeaders = "EHLO "; @@ -112,7 +102,7 @@ namespace Tesses::Framework::Mail emailHeaders.append("\r\nContent-Type: "); emailHeaders.append(this->body->mimeType); emailHeaders.append("; charset=utf-8\r\n\r\n"); - Tesses::Framework::TextStreams::StreamWriter writer(this->strm,false); + Tesses::Framework::TextStreams::StreamWriter writer(this->strm); writer.Write(emailHeaders); this->body->Write(this->strm); @@ -138,8 +128,8 @@ namespace Tesses::Framework::Mail emailHeaders.append("\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\""); emailHeaders.append(name); emailHeaders.append("\"\r\n\r\n"); - Tesses::Framework::Streams::MemoryStream ms(true); - item.second->Write(&ms); + std::shared_ptr ms = std::make_shared(true); + item.second->Write(ms); SMTP_ATTACHMENT_WRITE(emailHeaders,ms); //emailHeaders.append(Tesses::Framework::Crypto::Base64_Encode(ms.GetBuffer())); writer.Write(emailHeaders); @@ -154,10 +144,6 @@ namespace Tesses::Framework::Mail SMTPClient::~SMTPClient() { - delete this->body; - for(auto& item : this->attachments) - { - delete item.second; - } + } } \ No newline at end of file diff --git a/src/Platform/Environment.cpp b/src/Platform/Environment.cpp index a6b6627..1ebe148 100644 --- a/src/Platform/Environment.cpp +++ b/src/Platform/Environment.cpp @@ -124,7 +124,7 @@ namespace Tesses::Framework::Platform::Environment if(!realPath.relative) return realPath; - if(LocalFS.FileExists(realPath)) return realPath.MakeAbsolute(); + if(LocalFS->FileExists(realPath)) return realPath.MakeAbsolute(); const char* path = std::getenv("PATH"); #if defined(_WIN32) const char* pathext = std::getenv("PATHEXT"); @@ -134,13 +134,13 @@ namespace Tesses::Framework::Platform::Environment for(auto item : pathParts) { - auto newPath = LocalFS.SystemToVFSPath(item) / realPath; + auto newPath = LocalFS->SystemToVFSPath(item) / realPath; for(auto item2 : pext) { auto newPathExt = newPath + item2; - if(LocalFS.FileExists(newPathExt)) return newPathExt; + if(LocalFS->FileExists(newPathExt)) return newPathExt; } - if(LocalFS.FileExists(newPath)) return newPath; + if(LocalFS->FileExists(newPath)) return newPath; } return realPath; #else @@ -148,8 +148,8 @@ namespace Tesses::Framework::Platform::Environment auto pathParts = HttpUtils::SplitString(path,":"); for(auto item : pathParts) { - auto newPath = LocalFS.SystemToVFSPath(item) / realPath; - if(LocalFS.FileExists(newPath)) return newPath; + auto newPath = LocalFS->SystemToVFSPath(item) / realPath; + if(LocalFS->FileExists(newPath)) return newPath; } return realPath.MakeAbsolute(); #endif diff --git a/src/Platform/Process.cpp b/src/Platform/Process.cpp index 75bda52..0476622 100644 --- a/src/Platform/Process.cpp +++ b/src/Platform/Process.cpp @@ -685,34 +685,34 @@ CreateProcessW( #endif } - Tesses::Framework::Streams::Stream* Process::GetStdinStream() + std::shared_ptr Process::GetStdinStream() { if (this->exited) return nullptr; #if defined(GEKKO) || defined(__PS2__) || defined(__SWITCH__) || !defined(TESSESFRAMEWORK_ENABLE_PROCESS) return nullptr; #else - return new ProcessStream(this->hidden.GetField()->stdin_strm,true); + return std::make_shared(this->hidden.GetField()->stdin_strm,true); #endif } - Tesses::Framework::Streams::Stream* Process::GetStdoutStream() + std::shared_ptr Process::GetStdoutStream() { if (this->exited) return nullptr; #if defined(GEKKO) || defined(__PS2__) || defined(__SWITCH__) || !defined(TESSESFRAMEWORK_ENABLE_PROCESS) return nullptr; #else - return new ProcessStream(this->hidden.GetField()->stdout_strm,false); + return std::make_shared(this->hidden.GetField()->stdout_strm,false); #endif } - Tesses::Framework::Streams::Stream* Process::GetStderrStream() + std::shared_ptr Process::GetStderrStream() { if (this->exited) return nullptr; #if defined(GEKKO) || defined(__PS2__) || defined(__SWITCH__) || !defined(TESSESFRAMEWORK_ENABLE_PROCESS) return nullptr; #else - return new ProcessStream(this->hidden.GetField()->stderr_strm,false); + return std::make_shared(this->hidden.GetField()->stderr_strm,false); #endif } diff --git a/src/Streams/BufferedStream.cpp b/src/Streams/BufferedStream.cpp index 469c7f6..54dfb49 100644 --- a/src/Streams/BufferedStream.cpp +++ b/src/Streams/BufferedStream.cpp @@ -1,18 +1,14 @@ #include "TessesFramework/Streams/BufferedStream.hpp" namespace Tesses::Framework::Streams { - BufferedStream::BufferedStream(Stream* strm, bool owns, size_t bufferSize) + BufferedStream::BufferedStream(std::shared_ptr strm, size_t bufferSize) { this->strm = strm; - this->owns = owns; this->bufferSize = bufferSize; this->buffer = new uint8_t[bufferSize]; this->read = 0; this->offset = 0; } - BufferedStream::BufferedStream(Stream& strm, size_t bufferSize) : BufferedStream(&strm,false, bufferSize) - { - - } + bool BufferedStream::EndOfStream() { if(this->offset < this->read) return false; @@ -60,8 +56,6 @@ namespace Tesses::Framework::Streams { BufferedStream::~BufferedStream() { - if(this->owns) - delete this->strm; delete buffer; } } \ No newline at end of file diff --git a/src/Streams/ByteReader.cpp b/src/Streams/ByteReader.cpp index cf86146..b6c7701 100644 --- a/src/Streams/ByteReader.cpp +++ b/src/Streams/ByteReader.cpp @@ -1,19 +1,15 @@ #include "TessesFramework/Streams/ByteReader.hpp" namespace Tesses::Framework::Streams { - Stream* ByteReader::GetStream() + std::shared_ptr ByteReader::GetStream() { return this->strm; } - ByteReader::ByteReader(Stream* strm, bool owns) + ByteReader::ByteReader(std::shared_ptr strm) { this->strm = strm; - this->owns = owns; - } - ByteReader::ByteReader(Stream& strm) : ByteReader(&strm,false) - { - } + uint8_t ByteReader::ReadU8() { auto r = this->strm->ReadByte(); @@ -153,8 +149,5 @@ namespace Tesses::Framework::Streams auto v=ReadU64LE(); return *(double*)&v; } - ByteReader::~ByteReader() - { - if(this->owns) delete this->strm; - } + } \ No newline at end of file diff --git a/src/Streams/ByteWriter.cpp b/src/Streams/ByteWriter.cpp index 38f5530..d349f7f 100644 --- a/src/Streams/ByteWriter.cpp +++ b/src/Streams/ByteWriter.cpp @@ -1,19 +1,15 @@ #include "TessesFramework/Streams/ByteWriter.hpp" namespace Tesses::Framework::Streams { - Stream* ByteWriter::GetStream() + std::shared_ptr ByteWriter::GetStream() { return this->strm; } - ByteWriter::ByteWriter(Stream* strm, bool owns) + ByteWriter::ByteWriter(std::shared_ptr strm) { this->strm = strm; - this->owns = owns; - } - ByteWriter::ByteWriter(Stream& strm) : ByteWriter(&strm,false) - { - } + void ByteWriter::WriteU8(uint8_t v) { strm->WriteByte(v); @@ -133,8 +129,5 @@ namespace Tesses::Framework::Streams uint64_t data = *(uint64_t*)&v; WriteU64LE(data); } - ByteWriter::~ByteWriter() - { - if(this->owns) delete this->strm; - } + } \ No newline at end of file diff --git a/src/Streams/NetworkStream.cpp b/src/Streams/NetworkStream.cpp index 9aee798..c68209c 100644 --- a/src/Streams/NetworkStream.cpp +++ b/src/Streams/NetworkStream.cpp @@ -507,7 +507,7 @@ namespace Tesses::Framework::Streams { NETWORK_CLOSE(this->sock); this->valid=false; } - NetworkStream* TcpServer::GetStream(std::string& ip, uint16_t& port) + std::shared_ptr TcpServer::GetStream(std::string& ip, uint16_t& port) { struct sockaddr_storage storage; memset(&storage,0, sizeof(storage)); @@ -522,7 +522,7 @@ namespace Tesses::Framework::Streams { ip = StringifyIP((struct sockaddr*)&storage); port = getPort((struct sockaddr*)&storage); - return new NetworkStream(s,true); + return std::make_shared(s,true); } bool NetworkStream::CanRead() { @@ -690,7 +690,7 @@ namespace Tesses::Framework::Streams { } } - NetworkStream* NetworkStream::Accept(std::string& ip, uint16_t& port) + std::shared_ptr NetworkStream::Accept(std::string& ip, uint16_t& port) { if(!this->success) return nullptr; struct sockaddr_storage storage; @@ -704,7 +704,7 @@ namespace Tesses::Framework::Streams { ip = StringifyIP((struct sockaddr*)&storage); port = getPort((struct sockaddr*)&storage); - return new NetworkStream((int32_t)s,(bool)true); + return std::make_shared((int32_t)s,(bool)true); } size_t NetworkStream::Read(uint8_t* buff, size_t sz) { @@ -803,7 +803,7 @@ TcpServer::TcpServer(std::string unixPath,int32_t backlog) { } -NetworkStream* TcpServer::GetStream(std::string& ip, uint16_t& port) +std::shared_ptr TcpServer::GetStream(std::string& ip, uint16_t& port) { return nullptr; } @@ -857,7 +857,7 @@ void NetworkStream::SetBroadcast(bool bC) { } -NetworkStream* NetworkStream::Accept(std::string& ip, uint16_t& port) +std::shared_ptr NetworkStream::Accept(std::string& ip, uint16_t& port) { return nullptr; } diff --git a/src/Streams/Stream.cpp b/src/Streams/Stream.cpp index f0f523a..e66383d 100644 --- a/src/Streams/Stream.cpp +++ b/src/Streams/Stream.cpp @@ -92,30 +92,22 @@ namespace Tesses::Framework::Streams { { } - void Stream::CopyTo(Stream* strm, size_t buffSize) - { - if(strm != nullptr) - this->CopyTo(*strm, buffSize); - } - void Stream::CopyTo(Stream& strm, size_t buffSize) + + void Stream::CopyTo(std::shared_ptr strm, size_t buffSize) { size_t read; - #if defined(_WIN32) uint8_t* buffer = new uint8_t[buffSize]; - #else + - uint8_t buffer[buffSize]; - #endif do { read = this->Read(buffer,buffSize); - strm.WriteBlock(buffer, read); + strm->WriteBlock(buffer, read); } while(read > 0); - strm.Flush(); + strm->Flush(); - #if defined(_WIN32) delete[] buffer; - #endif + } Stream::~Stream() { diff --git a/src/TF_Init.cpp b/src/TF_Init.cpp index d9ce2ea..6ef499a 100644 --- a/src/TF_Init.cpp +++ b/src/TF_Init.cpp @@ -1,6 +1,7 @@ #include "TessesFramework/Common.hpp" #include "TessesFramework/Streams/NetworkStream.hpp" #include "TessesFramework/Lazy.hpp" +#include "TessesFramework/Filesystem/LocalFS.hpp" #include #include #include @@ -181,7 +182,7 @@ namespace Tesses::Framework } void TF_Init() { - + Tesses::Framework::Filesystem::LocalFS = std::make_shared(); #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) sqlite3_initialize(); #if defined(GEKKO) || defined(__SWITCH__) || defined(__PS2__) diff --git a/src/Text/HeaderGenerator.cpp b/src/Text/HeaderGenerator.cpp index c583b90..2fa4eb5 100644 --- a/src/Text/HeaderGenerator.cpp +++ b/src/Text/HeaderGenerator.cpp @@ -1,7 +1,7 @@ #include "TessesFramework/Text/HeaderGenerator.hpp" namespace Tesses::Framework::Text { - void GenerateCHeaderFile(Streams::Stream* strm,std::string name, TextStreams::TextWriter* writer) + void GenerateCHeaderFile(std::shared_ptr strm,std::string name, std::shared_ptr writer) { const size_t BLK_SZ=1024; writer->WriteLine("#pragma once"); @@ -48,22 +48,22 @@ namespace Tesses::Framework::Text { } - std::string GenerateCHeaderFile(Streams::Stream* strm,std::string name) + std::string GenerateCHeaderFile(std::shared_ptr strm,std::string name) { - TextStreams::StringWriter writer; - GenerateCHeaderFile(strm,name,&writer); - return writer.GetString(); + auto writer=std::make_shared(); + GenerateCHeaderFile(strm,name,writer); + return writer->GetString(); } - void GenerateCHeaderFile(const std::vector& data,std::string name, TextStreams::TextWriter* writer) + void GenerateCHeaderFile(const std::vector& data,std::string name, std::shared_ptr writer) { - Tesses::Framework::Streams::MemoryStream ms(false); - ms.GetBuffer() = data; - GenerateCHeaderFile(&ms,name,writer); + auto ms = std::make_shared(false); + ms->GetBuffer() = data; + GenerateCHeaderFile(ms,name,writer); } std::string GenerateCHeaderFile(const std::vector& data,std::string name) { - TextStreams::StringWriter writer; - GenerateCHeaderFile(data,name,&writer); - return writer.GetString(); + auto writer = std::make_shared(); + GenerateCHeaderFile(data,name,writer); + return writer->GetString(); } }; \ No newline at end of file diff --git a/src/TextStreams/StreamReader.cpp b/src/TextStreams/StreamReader.cpp index ee1da18..e7c2c30 100644 --- a/src/TextStreams/StreamReader.cpp +++ b/src/TextStreams/StreamReader.cpp @@ -4,11 +4,8 @@ using Stream = Tesses::Framework::Streams::Stream; using FileStream = Tesses::Framework::Streams::FileStream; namespace Tesses::Framework::TextStreams { - StreamReader::StreamReader(Stream& strm) : StreamReader(&strm, false) - { - - } - StreamReader::StreamReader(std::filesystem::path path) : StreamReader(new FileStream(path,"rb"),true) + + StreamReader::StreamReader(std::filesystem::path path) : StreamReader(std::make_shared(path,"rb")) { } @@ -21,35 +18,30 @@ namespace Tesses::Framework::TextStreams { } return false; } - StreamReader::StreamReader(Stream* strm, bool owns) : TextReader() + StreamReader::StreamReader(std::shared_ptr strm) : TextReader() { this->strm = strm; - this->owns = owns; } - Stream& StreamReader::GetStream() + std::shared_ptr StreamReader::GetStream() { - return *(this->strm); + return (this->strm); } bool StreamReader::ReadBlock(std::string& str, size_t len) { - #if defined(_WIN32) uint8_t* buff = new uint8_t[len]; - #else - uint8_t buff[len]; - #endif + len = strm->ReadBlock(buff,len); - if(len == 0) return false; + if(len == 0) {delete buff; return false;} str.append((const char*)buff, len); - #if defined(_WIN32) + delete buff; - #endif + return true; } StreamReader::~StreamReader() { - if(this->owns) - delete this->strm; + } }; \ No newline at end of file diff --git a/src/TextStreams/StreamWriter.cpp b/src/TextStreams/StreamWriter.cpp index 990f033..c8ceadd 100644 --- a/src/TextStreams/StreamWriter.cpp +++ b/src/TextStreams/StreamWriter.cpp @@ -5,20 +5,16 @@ using FileStream = Tesses::Framework::Streams::FileStream; namespace Tesses::Framework::TextStreams { - Stream& StreamWriter::GetStream() + std::shared_ptr StreamWriter::GetStream() { - return *(this->strm); + return this->strm; } - StreamWriter::StreamWriter(Stream& strm) : StreamWriter(&strm, false) + StreamWriter::StreamWriter(std::shared_ptr strm) : TextWriter() { - } - StreamWriter::StreamWriter(Stream* strm, bool owns) : TextWriter() - { this->strm = strm; - this->owns = owns; } - StreamWriter::StreamWriter(std::filesystem::path filename, bool append) : StreamWriter(new FileStream(filename, append ? "ab" : "wb"),true) + StreamWriter::StreamWriter(std::filesystem::path filename, bool append) : StreamWriter(std::make_shared(filename, append ? "ab" : "wb")) { } @@ -28,7 +24,5 @@ namespace Tesses::Framework::TextStreams } StreamWriter::~StreamWriter() { - if(this->owns) - delete this->strm; } } \ No newline at end of file diff --git a/src/wrapper.cpp b/src/wrapper.cpp deleted file mode 100644 index 4dec880..0000000 --- a/src/wrapper.cpp +++ /dev/null @@ -1,231 +0,0 @@ - -#include "TessesFramework/TessesFramework.hpp" - -#include "TessesFramework/TessesFramework.h" -#include - -using namespace Tesses::Framework; -using namespace Tesses::Framework::Streams; -using namespace Tesses::Framework::Filesystem; -using namespace Tesses::Framework::Threading; - - -#if defined(__cplusplus) -extern "C" { -#endif - - - -string_t* string_create() -{ - return static_cast(new std::string()); -} -string_t* string_create_from_buff(const void* text, size_t len) -{ - return static_cast(new std::string((const char*)text,len)); -} -string_t* string_create_from_charpointer(const char* text) -{ - return static_cast(new std::string(text)); -} -string_t* string_resize(string_t* str, size_t len) -{ - static_cast(str)->resize(len); - return str; -} -string_t* string_set_char(string_t* str, size_t index, char c) -{ - static_cast(str)->at(index) = c; - return str; -} -char string_get_char(string_t* str,size_t index) -{ - return static_cast(str)->at(index); -} -string_t* string_append_char(string_t* str, char c) -{ - static_cast(str)->push_back(c); - return str; -} -string_t* string_append_from_buff(string_t* str,const void* text, size_t len) -{ - static_cast(str)->append((const char*)text,len); - return str; -} -string_t* string_append_from_charpointer(string_t* str,const char* text) -{ - static_cast(str)->append(text); - return str; -} -string_t* string_append(string_t* str, string_t* toAppend) -{ - if(str == NULL) return NULL; - static_cast(str)->append(*static_cast(str)); - return str; -} -string_t* string_append_signed(string_t* str, int64_t num) -{ - static_cast(str)->append(std::to_string(num)); - return str; -} -string_t* string_append_unsigned(string_t* str, uint64_t num) -{ - static_cast(str)->append(std::to_string(num)); - return str; -} -string_t* string_append_double(string_t* str, double num) -{ - static_cast(str)->append(std::to_string(num)); - return str; -} -void string_print(string_t* str) -{ - std::cout << *static_cast(str); -} -void string_println(string_t* str) -{ - std::cout << *static_cast(str) << std::endl; -} -size_t string_size(string_t* str) -{ - return static_cast(str)->size(); -} -const char* string_c_str(string_t* str) -{ - return static_cast(str)->c_str(); -} -void string_free(string_t* str) -{ - delete static_cast(str); -} - -void tf_init() -{ - TF_Init(); -} -tf_thread_t* tf_create_thread(void* userData, tf_action_user_data_t cb) -{ - Thread* thrd = new Thread([userData,cb]()->void{ - cb(userData); - }); - return static_cast(thrd); -} -void tf_join_thread(tf_thread_t* thrd) -{ - auto thrd2 = static_cast(thrd); - if(thrd2 != nullptr) - { - thrd2->Join(); - delete thrd2; - } -} -void tf_detach_thread(tf_thread_t* thrd) -{ - auto thrd2 = static_cast(thrd); - if(thrd2 != nullptr) - { - thrd2->Detach(); - delete thrd2; - } -} - -tf_mutex_t* tf_mutex_create() -{ - return static_cast(new Mutex()); -} -void tf_mutex_lock(tf_mutex_t* mtx) -{ - static_cast(mtx)->Lock(); - -} -bool tf_mutex_trylock(tf_mutex_t* mtx) -{ - return static_cast(mtx)->TryLock(); - -} -void tf_mutex_unlock(tf_mutex_t* mtx) -{ - static_cast(mtx)->Unlock(); - -} -void tf_mutex_free(tf_mutex_t* mtx) -{ - delete static_cast(mtx); - -} - -bool tf_stream_canread(tf_stream_t* strm) -{ - return static_cast(strm)->CanRead(); -} -bool tf_stream_canwrite(tf_stream_t* strm) -{ - return static_cast(strm)->CanWrite(); -} -bool tf_stream_canseek(tf_stream_t* strm) -{ - return static_cast(strm)->CanSeek(); -} -bool tf_stream_eof(tf_stream_t* strm) -{ - return static_cast(strm)->EndOfStream(); -} -int64_t tf_stream_getlen(tf_stream_t* strm) -{ - return static_cast(strm)->GetLength(); -} -int64_t tf_stream_getpos(tf_stream_t* strm) -{ - return static_cast(strm)->GetPosition(); -} -void tf_stream_seek(tf_stream_t* strm, int64_t pos, TF_WHENCE whence) -{ - static_cast(strm)->Seek(pos,whence == TF_SEEK_BEGIN ? SeekOrigin::Begin : whence == TF_SEEK_CURRENT ? SeekOrigin::Current : SeekOrigin::End); -} -size_t tf_stream_read(tf_stream_t* strm, uint8_t* buffer, size_t length) -{ - return static_cast(strm)->Read(buffer,length); -} -size_t tf_stream_write(tf_stream_t* strm, const uint8_t* buffer, size_t length) -{ - return static_cast(strm)->Write(buffer,length); -} -size_t tf_stream_readblock(tf_stream_t* strm, uint8_t* buffer, size_t length) -{ - return static_cast(strm)->ReadBlock(buffer,length); -} -void tf_stream_writeblock(tf_stream_t* strm, const uint8_t* buffer, size_t length) -{ - static_cast(strm)->WriteBlock(buffer,length); -} -void tf_stream_copyto(tf_stream_t* src, tf_stream_t* dest, size_t blockSize) -{ - static_cast(src)->CopyTo(static_cast(dest),blockSize); -} -void tf_stream_close(tf_stream_t* strm) -{ - delete static_cast(strm); -} -void tf_stream_flush(tf_stream_t* strm) -{ - static_cast(strm)->Flush(); -} -int32_t tf_stream_readbyte(tf_stream_t* strm) -{ - return static_cast(strm)->ReadByte(); -} -void tf_stream_writebyte(tf_stream_t* strm, uint8_t val) -{ - static_cast(strm)->WriteByte(val); -} - -tf_stream_t* tf_stream_fopen(const char* file, const char* mode) -{ - FILE* f = fopen(file,mode); - if(f == NULL) return NULL; - return static_cast(new FileStream(f,true,std::string(mode))); -} - -#if defined(__cplusplus) -} -#endif