diff --git a/src/runtime_methods/helpers.cpp b/src/runtime_methods/helpers.cpp index f584a21..55ed514 100644 --- a/src/runtime_methods/helpers.cpp +++ b/src/runtime_methods/helpers.cpp @@ -52,6 +52,6 @@ namespace Tesses::CrossLang { void TStd::RegisterHelpers(GC* gc, TRootEnvironment* env) { auto helpers=env->EnsureDictionary(gc,"Helpers"); - helpers->DeclareFunction(gc,"CopyToProgress","Copy Stream to another (but with progress event)",{"src","dest","progressCB"},Helpers_CopyToProgress); + helpers->DeclareFunction(gc,"CopyToProgress","Copy Stream to another (but with progress event)",{"src","dest","progressCB","$precision"},Helpers_CopyToProgress); } } \ No newline at end of file diff --git a/src/runtime_methods/net.cpp b/src/runtime_methods/net.cpp index 521794a..d51cc68 100644 --- a/src/runtime_methods/net.cpp +++ b/src/runtime_methods/net.cpp @@ -206,7 +206,41 @@ namespace Tesses::CrossLang } return _ls; } + else if(key == "SetContentDisposition") + { + std::string type; + std::string filename; + std::string fieldName; + if(GetArgument(args,0,filename) && GetArgument(args,1,type)) + { + ContentDisposition dispo; + dispo.filename = filename; + dispo.type = type; + + if(GetArgument(args,2, fieldName)) + dispo.fieldName = fieldName; + + this->dict->SetValue("Content-Disposition", dispo.ToString()); + } + return nullptr; + } + else if(key == "TryGetContentDisposition") + { + std::string cdStr; + ContentDisposition cd; + + if(this->dict->TryGetFirst("Content-Disposition", cdStr) && ContentDisposition::TryParse(cdStr,cd)) + { + return TDictionary::Create(ls,{ + TDItem("Type",cd.type), + TDItem("FileName",cd.filename), + TDItem("FieldName",cd.fieldName) + }); + } + + return nullptr; + } return Undefined(); } }; @@ -381,6 +415,60 @@ namespace Tesses::CrossLang if(GetArgumentHeap(args,0,ba)) ctx->SendBytes(ba->data); } + else if(key == "GetUrlWithQuery") + { + return ctx->GetUrlWithQuery(); + } + else if(key == "GetOriginalPathWithQuery") + { + return ctx->GetOriginalPathWithQuery(); + } + else if(key == "MakeAbsolute") + { + std::string path; + if(GetArgument(args,0,path)) + { + return ctx->MakeAbsolute(path); + + } + return nullptr; + } + else if(key == "WithLocationHeader") + { + std::string path; + if(GetArgument(args,0,path)) + { + int64_t sc; + if(GetArgument(args,1,sc)) + { + ctx->WithLocationHeader(path,(StatusCode)sc); + return nullptr; + } + ctx->WithLocationHeader(path); + + } + return this; + } + else if(key == "GetServerRoot") + { + return ctx->GetServerRoot(); + } + else if(key == "SendRedirect") + { + std::string path; + if(GetArgument(args,0,path)) + { + int64_t sc; + if(GetArgument(args,1,sc)) + { + ctx->SendRedirect(path,(StatusCode)sc); + return nullptr; + } + ctx->SendRedirect(path); + + } + return nullptr; + } else if(key == "WriteHeaders") ctx->WriteHeaders(); else if(key == "StartWebSocketSession") { TDictionary* dict; @@ -1422,10 +1510,17 @@ namespace Tesses::CrossLang return nullptr; }); http->DeclareFunction(gc, "MountableServer","Create a server you can mount to, must mount parents before child",{"root"}, [](GCList& ls, std::vector args)->TObject{ + TCallable* call; TDictionary* dict; TClassObject* cls; std::shared_ptr mySvr; - if(GetArgumentHeap(args,0,dict)) + if(GetArgumentHeap(args,0,call)) + { + auto svr = std::make_shared(ls.GetGC(), call); + return std::make_shared(svr); + + } + else if(GetArgumentHeap(args,0,dict)) { auto svr = std::make_shared(ls.GetGC(), dict); return std::make_shared(svr); diff --git a/src/runtime_methods/sqlite.cpp b/src/runtime_methods/sqlite.cpp index e9e7599..35c9c0b 100644 --- a/src/runtime_methods/sqlite.cpp +++ b/src/runtime_methods/sqlite.cpp @@ -5,6 +5,35 @@ namespace Tesses::CrossLang { #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) using namespace Tesses::Framework::Serialization; + TObject Sqlite_Escape(GCList& ls, std::vector args) + { + int64_t n; + double d; + bool b; + + + std::string str; + if(GetArgument(args,0,str)) + { + return SQLiteDatabase::Escape(str); + } + if(GetArgument(args,0,n)) + { + return std::to_string(n); + } + if(GetArgument(args,0,b)) + { + return b ? "1" : "0"; + } + if(GetArgument(args,0,d)) + { + return std::to_string(d); + } + + return "NULL"; + } + + class SQLiteObject : public TNativeObject { public: @@ -34,11 +63,7 @@ namespace Tesses::CrossLang { { if(name == "Close") this->Close(); if(name == "Escape") { - std::string str; - if(GetArgument(args,0,str)) - { - return SQLiteDatabase::Escape(str); //here for completeness - } + return Sqlite_Escape(ls,args); } if(name == "Exec") { @@ -114,35 +139,7 @@ namespace Tesses::CrossLang { } - TObject Sqlite_Escape(GCList& ls, std::vector args) - { - int64_t n; - double d; - bool b; - - - std::string str; - if(GetArgument(args,0,str)) - { - return SQLiteDatabase::Escape(str); - } - if(GetArgument(args,0,n)) - { - return std::to_string(n); - } - if(GetArgument(args,0,b)) - { - return b ? "1" : "0"; - } - if(GetArgument(args,0,d)) - { - return std::to_string(d); - } - - return "NULL"; - } - - TObject Sqlite_Close(GCList& ls, std::vector args) + TObject Sqlite_Close(GCList& ls, std::vector args) { SQLiteObject* sql; if(GetArgumentHeap(args,0,sql)) diff --git a/src/runtime_methods/std.cpp b/src/runtime_methods/std.cpp index 03e50dc..f4689ca 100644 --- a/src/runtime_methods/std.cpp +++ b/src/runtime_methods/std.cpp @@ -959,6 +959,7 @@ namespace Tesses::CrossLang if(std::holds_alternative(_obj)) return "String"; if(std::holds_alternative(_obj)) return "Path"; + if(std::holds_alternative(_obj)) return "Version"; if(std::holds_alternative(_obj)) return "DateTime"; if(std::holds_alternative>(_obj)) { @@ -1373,6 +1374,8 @@ namespace Tesses::CrossLang env->DeclareVariable("Version", TDictionary::Create(ls,{ TDItem("Parse",TExternalMethod::Create(ls,"Parse version from string",{"versionStr"},[](GCList& ls, std::vector args)->TObject{ std::string str; + TVMVersion v; + if(GetArgument(args,0,v)) return v; if(GetArgument(args, 0, str)) { TVMVersion version; diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index b57e0fc..6a119d3 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -3489,6 +3489,19 @@ namespace Tesses::CrossLang { cse.back()->Push(gc, nullptr); return false; } + if(key == "CopyToLimit") + { + std::shared_ptr data; + int64_t cnt; + int64_t buffSize; + if(GetArgument(args,0,data) && GetArgument(args,1,cnt)) + { + if(!GetArgument(args,2,buffSize)) buffSize=1024; + strm->CopyToLimit(data,(uint64_t)cnt,(size_t)buffSize); + } + cse.back()->Push(gc, nullptr); + return false; + } if(key == "Flush") { strm->Flush();