#include "CrossLang.hpp" #include "TessesFramework/Serialization/BitConverter.hpp" #if defined(_WIN32) #include #endif namespace Tesses::CrossLang { using namespace Tesses::Framework::Platform::Environment; #if defined(_WIN32) static char EnvPathSeperator=';'; #else static char EnvPathSeperator=':'; #endif Tesses::Framework::Filesystem::VFSPath CrossLangConfigPath(""); Tesses::Framework::Filesystem::VFSPath GetCrossLangConfigDir() { if(!CrossLangConfigPath.path.empty()) return CrossLangConfigPath; return SpecialFolders::GetConfig() / "Tesses" / "CrossLang"; } static TObject Env_getCrossLangConfig(GCList& ls, std::vector args) { return GetCrossLangConfigDir(); } static TObject Env_getPlatform(GCList& ls, std::vector args) { return Tesses::Framework::Platform::Environment::GetPlatform(); } static TObject Env_GetAt(GCList& ls, std::vector args) { std::string key; if(GetArgument(args,0,key)) { auto v = GetVariable(key); if(v) return v.value(); } return nullptr; } static TObject Env_SetAt(GCList& ls, std::vector args) { std::string key; std::string value; if(GetArgument(args,0,key)) { if(GetArgument(args,1,value)) { SetVariable(key,value); return value; } else { SetVariable(key,std::nullopt); } } return nullptr; } static TObject Env_getDownloads(GCList& ls, std::vector args) { return SpecialFolders::GetDownloads(); } static TObject Env_getMusic(GCList& ls, std::vector args) { return SpecialFolders::GetMusic(); } static TObject Env_getPictures(GCList& ls, std::vector args) { return SpecialFolders::GetPictures(); } static TObject Env_getVideos(GCList& ls, std::vector args) { return SpecialFolders::GetVideos(); } static TObject Env_getDocuments(GCList& ls, std::vector args) { return SpecialFolders::GetDocuments(); } static TObject Env_getConfig(GCList& ls, std::vector args) { return SpecialFolders::GetConfig(); } static TObject Env_getDesktop(GCList& ls, std::vector args) { return SpecialFolders::GetDesktop(); } static TObject Env_getState(GCList& ls, std::vector args) { return SpecialFolders::GetState(); } static TObject Env_getCache(GCList& ls, std::vector args) { return SpecialFolders::GetCache(); } static TObject Env_getData(GCList& ls, std::vector args) { return SpecialFolders::GetData(); } static TObject Env_getUser(GCList& ls, std::vector args) { return SpecialFolders::GetHomeFolder(); } static TObject Env_GetRealExecutablePath(GCList& ls, std::vector args) { Tesses::Framework::Filesystem::VFSPath p; if(GetArgumentAsPath(args,0,p)) { return GetRealExecutablePath(p); } return Tesses::Framework::Filesystem::VFSPath(); } static TObject Env_GetAll(GCList& ls, std::vector args) { ls.GetGC()->BarrierBegin(); TList* list = TList::Create(ls); std::vector> env; Tesses::Framework::Platform::Environment::GetEnvironmentVariables(env); for(auto& item : env) { list->Add(TDictionary::Create(ls,{TDItem("Key",item.first),TDItem("Value",item.second)})); } ls.GetGC()->BarrierEnd(); return list; } static TObject Env_getLittleEndian(GCList& ls, std::vector args) { return Tesses::Framework::Serialization::BitConverter::IsLittleEndian(); } void TStd::RegisterEnv(GC* gc, TRootEnvironment* env) { env->permissions.canRegisterEnv=true; GCList ls(gc); TDictionary* dict = TDictionary::Create(ls); dict->DeclareFunction(gc,"GetAt","Get environment variable", {"key"}, Env_GetAt); dict->DeclareFunction(gc,"SetAt","Set environment variable", {"key","value"}, Env_SetAt); dict->DeclareFunction(gc,"GetAll","Get all of the environment variables",{},Env_GetAll); dict->DeclareFunction(gc,"getDesktop","Get desktop folder",{},Env_getDesktop); dict->DeclareFunction(gc,"getDownloads","Get downloads folder",{},Env_getDownloads); dict->DeclareFunction(gc,"getDocuments","Get documents folder",{},Env_getDocuments); dict->DeclareFunction(gc,"getMusic","Get music folder",{},Env_getMusic); dict->DeclareFunction(gc,"getPictures","Get pictures folder",{},Env_getPictures); dict->DeclareFunction(gc,"getVideos","Get videos folder",{},Env_getVideos); dict->DeclareFunction(gc,"getState","Get state folder",{},Env_getState); dict->DeclareFunction(gc,"getCache","Get cache folder",{},Env_getCache); dict->DeclareFunction(gc,"getConfig","Get config folder",{},Env_getConfig); dict->DeclareFunction(gc,"getCrossLangConfig","Get crosslang configuration folder",{}, Env_getCrossLangConfig); dict->DeclareFunction(gc,"getData","Get data folder",{},Env_getData); dict->DeclareFunction(gc,"getUser","Get user folder",{},Env_getUser); dict->DeclareFunction(gc,"getPlatform","Get platform name",{},Env_getPlatform); dict->DeclareFunction(gc,"GetRealExecutablePath", "Get the absolute path for executable", {"path"},Env_GetRealExecutablePath); dict->DeclareFunction(gc, "getLittleEndian", "Is the platform little endian", {},Env_getLittleEndian); gc->BarrierBegin(); dict->SetValue("EnvPathSeperator",EnvPathSeperator); env->SetVariable("Env", dict); gc->BarrierEnd(); } }