157 lines
5.9 KiB
C++
157 lines
5.9 KiB
C++
#include "CrossLang.hpp"
|
|
#include "TessesFramework/Serialization/BitConverter.hpp"
|
|
|
|
#if defined(_WIN32)
|
|
#include <windows.h>
|
|
#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<TObject> args) {
|
|
return GetCrossLangConfigDir();
|
|
}
|
|
static TObject Env_getPlatform(GCList &ls, std::vector<TObject> args) {
|
|
return Tesses::Framework::Platform::Environment::GetPlatform();
|
|
}
|
|
static TObject Env_GetAt(GCList &ls, std::vector<TObject> 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<TObject> 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<TObject> args) {
|
|
return SpecialFolders::GetDownloads();
|
|
}
|
|
static TObject Env_getMusic(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetMusic();
|
|
}
|
|
static TObject Env_getPictures(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetPictures();
|
|
}
|
|
static TObject Env_getVideos(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetVideos();
|
|
}
|
|
static TObject Env_getDocuments(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetDocuments();
|
|
}
|
|
static TObject Env_getConfig(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetConfig();
|
|
}
|
|
|
|
static TObject Env_getDesktop(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetDesktop();
|
|
}
|
|
static TObject Env_getState(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetState();
|
|
}
|
|
static TObject Env_getCache(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetCache();
|
|
}
|
|
static TObject Env_getData(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetData();
|
|
}
|
|
static TObject Env_getUser(GCList &ls, std::vector<TObject> args) {
|
|
return SpecialFolders::GetHomeFolder();
|
|
}
|
|
static TObject Env_GetRealExecutablePath(GCList &ls,
|
|
std::vector<TObject> 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<TObject> args) {
|
|
ls.GetGC()->BarrierBegin();
|
|
TList *list = TList::Create(ls);
|
|
std::vector<std::pair<std::string, std::string>> 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<TObject> args) {
|
|
return Tesses::Framework::Serialization::BitConverter::IsLittleEndian();
|
|
}
|
|
void TStd::RegisterEnv(std::shared_ptr<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();
|
|
}
|
|
} // namespace Tesses::CrossLang
|