Merge pull request #630 from Pax1601/read-config-location-with-lfs.writedir()

Read config location with lfs.writedir()
This commit is contained in:
Pax1601
2023-12-02 10:47:33 +01:00
committed by GitHub
8 changed files with 105 additions and 92 deletions

View File

@@ -1345,3 +1345,11 @@ Olympus.initializeUnits()
Olympus.notify("OlympusCommand script " .. version .. " loaded successfully", 2, true) Olympus.notify("OlympusCommand script " .. version .. " loaded successfully", 2, true)
-- Load the current instance folder
local lfs = require('lfs')
Olympus.instancePath = lfs.writedir().."Mods\\Services\\Olympus"
Olympus.notify("Starting DCS Olympus backend session in "..Olympus.instancePath, 2)
Olympus.OlympusDLL.setInstancePath()

View File

@@ -12,24 +12,18 @@ using namespace GeographicLib;
extern Scheduler* scheduler; extern Scheduler* scheduler;
extern UnitsManager* unitsManager; extern UnitsManager* unitsManager;
json::value Aircraft::database = json::value(); json::value Aircraft::database = json::value();
extern string instancePath;
void Aircraft::loadDatabase(string path) { void Aircraft::loadDatabase(string path) {
char* buf = nullptr; std::ifstream ifstream(instancePath + path);
size_t sz = 0; std::stringstream ss;
if (_dupenv_s(&buf, &sz, "DCSOLYMPUS_PATH") == 0 && buf != nullptr) ss << ifstream.rdbuf();
{ std::error_code errorCode;
std::ifstream ifstream(string(buf) + path); database = json::value::parse(ss.str(), errorCode);
std::stringstream ss; if (database.is_object())
ss << ifstream.rdbuf(); log("Aircrafts database loaded correctly from " + instancePath + path);
std::error_code errorCode; else
database = json::value::parse(ss.str(), errorCode); log("Error reading Aircrafts database file");
if (database.is_object())
log("Aircrafts database loaded correctly");
else
log("Error reading Aircrafts database file");
free(buf);
}
} }
/* Aircraft */ /* Aircraft */

View File

@@ -25,6 +25,7 @@ json::value missionData = json::value::object();
mutex mutexLock; mutex mutexLock;
string sessionHash; string sessionHash;
string instancePath;
bool initialized = false; bool initialized = false;
@@ -69,6 +70,20 @@ extern "C" DllExport int coreInit(lua_State* L)
return(0); return(0);
} }
extern "C" DllExport int coreInstancePath(lua_State * L)
{
/* Lock for thread safety */
lock_guard<mutex> guard(mutexLock);
lua_getglobal(L, "Olympus");
lua_getfield(L, -1, "instancePath");
instancePath = lua_tostring(L, -1);
log("Setting instance path to " + instancePath);
return(0);
}
extern "C" DllExport int coreFrame(lua_State* L) extern "C" DllExport int coreFrame(lua_State* L)
{ {
if (!initialized) if (!initialized)

View File

@@ -12,27 +12,21 @@ using namespace GeographicLib;
extern Scheduler* scheduler; extern Scheduler* scheduler;
extern UnitsManager* unitsManager; extern UnitsManager* unitsManager;
json::value GroundUnit::database = json::value(); json::value GroundUnit::database = json::value();
extern string instancePath;
#define RANDOM_ZERO_TO_ONE (double)(rand()) / (double)(RAND_MAX) #define RANDOM_ZERO_TO_ONE (double)(rand()) / (double)(RAND_MAX)
#define RANDOM_MINUS_ONE_TO_ONE (((double)(rand()) / (double)(RAND_MAX) - 0.5) * 2) #define RANDOM_MINUS_ONE_TO_ONE (((double)(rand()) / (double)(RAND_MAX) - 0.5) * 2)
void GroundUnit::loadDatabase(string path) { void GroundUnit::loadDatabase(string path) {
char* buf = nullptr; std::ifstream ifstream(instancePath + path);
size_t sz = 0; std::stringstream ss;
if (_dupenv_s(&buf, &sz, "DCSOLYMPUS_PATH") == 0 && buf != nullptr) ss << ifstream.rdbuf();
{ std::error_code errorCode;
std::ifstream ifstream(string(buf) + path); database = json::value::parse(ss.str(), errorCode);
std::stringstream ss; if (database.is_object())
ss << ifstream.rdbuf(); log("GroundUnits database loaded correctly from " + instancePath + path);
std::error_code errorCode; else
database = json::value::parse(ss.str(), errorCode); log("Error reading GroundUnits database file");
if (database.is_object())
log("Ground Units database loaded correctly");
else
log("Error reading Ground Units database file");
free(buf);
}
} }
/* Ground unit */ /* Ground unit */

View File

@@ -12,24 +12,18 @@ using namespace GeographicLib;
extern Scheduler* scheduler; extern Scheduler* scheduler;
extern UnitsManager* unitsManager; extern UnitsManager* unitsManager;
json::value Helicopter::database = json::value(); json::value Helicopter::database = json::value();
extern string instancePath;
void Helicopter::loadDatabase(string path) { void Helicopter::loadDatabase(string path) {
char* buf = nullptr; std::ifstream ifstream(instancePath + path);
size_t sz = 0; std::stringstream ss;
if (_dupenv_s(&buf, &sz, "DCSOLYMPUS_PATH") == 0 && buf != nullptr) ss << ifstream.rdbuf();
{ std::error_code errorCode;
std::ifstream ifstream(string(buf) + path); database = json::value::parse(ss.str(), errorCode);
std::stringstream ss; if (database.is_object())
ss << ifstream.rdbuf(); log("Helicopters database loaded correctly from " + instancePath + path);
std::error_code errorCode; else
database = json::value::parse(ss.str(), errorCode); log("Error reading Helicopters database file");
if (database.is_object())
log("Helicopters database loaded correctly");
else
log("Error reading Helicopters database file");
free(buf);
}
} }
/* Helicopter */ /* Helicopter */

View File

@@ -12,24 +12,18 @@ using namespace GeographicLib;
extern Scheduler* scheduler; extern Scheduler* scheduler;
extern UnitsManager* unitsManager; extern UnitsManager* unitsManager;
json::value NavyUnit::database = json::value(); json::value NavyUnit::database = json::value();
extern string instancePath;
void NavyUnit::loadDatabase(string path) { void NavyUnit::loadDatabase(string path) {
char* buf = nullptr; std::ifstream ifstream(instancePath + path);
size_t sz = 0; std::stringstream ss;
if (_dupenv_s(&buf, &sz, "DCSOLYMPUS_PATH") == 0 && buf != nullptr) ss << ifstream.rdbuf();
{ std::error_code errorCode;
std::ifstream ifstream(string(buf) + path); database = json::value::parse(ss.str(), errorCode);
std::stringstream ss; if (database.is_object())
ss << ifstream.rdbuf(); log("NavyUnits database loaded correctly from " + instancePath + path);
std::error_code errorCode; else
database = json::value::parse(ss.str(), errorCode); log("Error reading NavyUnits database file");
if (database.is_object())
log("Navy Units database loaded correctly");
else
log("Error reading Navy Units database file");
free(buf);
}
} }
/* Navy Unit */ /* Navy Unit */

View File

@@ -19,6 +19,7 @@ extern Scheduler* scheduler;
extern json::value missionData; extern json::value missionData;
extern mutex mutexLock; extern mutex mutexLock;
extern string sessionHash; extern string sessionHash;
extern string instancePath;
void handle_eptr(std::exception_ptr eptr) void handle_eptr(std::exception_ptr eptr)
{ {
@@ -286,39 +287,32 @@ string Server::extractPassword(http_request& request) {
void Server::task() void Server::task()
{ {
string address = REST_ADDRESS; string address = REST_ADDRESS;
string modLocation; string jsonLocation = instancePath + OLYMPUS_JSON_PATH;
char* buf = nullptr;
size_t sz = 0;
if (_dupenv_s(&buf, &sz, "DCSOLYMPUS_PATH") == 0 && buf != nullptr)
{
std::ifstream ifstream(string(buf) + OLYMPUS_JSON_PATH);
std::stringstream ss;
ss << ifstream.rdbuf();
std::error_code errorCode;
json::value config = json::value::parse(ss.str(), errorCode);
if (config.is_object() && config.has_object_field(L"server") &&
config[L"server"].has_string_field(L"address") && config[L"server"].has_number_field(L"port"))
{
address = "http://" + to_string(config[L"server"][L"address"]) + ":" + to_string(config[L"server"][L"port"].as_number().to_int32());
log("Starting server on " + address);
}
else
log("Error reading configuration file. Starting server on " + address);
if (config.is_object() && config.has_object_field(L"authentication")) log("Reading configuration from " + jsonLocation);
{
if (config[L"authentication"].has_string_field(L"gameMasterPassword")) gameMasterPassword = to_string(config[L"authentication"][L"gameMasterPassword"]); std::ifstream ifstream(jsonLocation);
if (config[L"authentication"].has_string_field(L"blueCommanderPassword")) blueCommanderPassword = to_string(config[L"authentication"][L"blueCommanderPassword"]); std::stringstream ss;
if (config[L"authentication"].has_string_field(L"redCommanderPassword")) redCommanderPassword = to_string(config[L"authentication"][L"redCommanderPassword"]); ss << ifstream.rdbuf();
} std::error_code errorCode;
else json::value config = json::value::parse(ss.str(), errorCode);
log("Error reading configuration file. No password set."); if (config.is_object() && config.has_object_field(L"server") &&
free(buf); config[L"server"].has_string_field(L"address") && config[L"server"].has_number_field(L"port"))
{
address = "http://" + to_string(config[L"server"][L"address"]) + ":" + to_string(config[L"server"][L"port"].as_number().to_int32());
log("Starting server on " + address);
} }
else else
log("Error reading configuration file. Starting server on " + address);
if (config.is_object() && config.has_object_field(L"authentication"))
{ {
log("DCSOLYMPUS_PATH environment variable is missing, starting server on " + address); if (config[L"authentication"].has_string_field(L"gameMasterPassword")) gameMasterPassword = to_string(config[L"authentication"][L"gameMasterPassword"]);
if (config[L"authentication"].has_string_field(L"blueCommanderPassword")) blueCommanderPassword = to_string(config[L"authentication"][L"blueCommanderPassword"]);
if (config[L"authentication"].has_string_field(L"redCommanderPassword")) redCommanderPassword = to_string(config[L"authentication"][L"redCommanderPassword"]);
} }
else
log("Error reading configuration file. No password set.");
http_listener listener(to_wstring(address + "/" + REST_URI)); http_listener listener(to_wstring(address + "/" + REST_URI));

View File

@@ -11,12 +11,14 @@ typedef int(__stdcall* f_coreFrame)(lua_State* L);
typedef int(__stdcall* f_coreUnitsData)(lua_State* L); typedef int(__stdcall* f_coreUnitsData)(lua_State* L);
typedef int(__stdcall* f_coreWeaponsData)(lua_State* L); typedef int(__stdcall* f_coreWeaponsData)(lua_State* L);
typedef int(__stdcall* f_coreMissionData)(lua_State* L); typedef int(__stdcall* f_coreMissionData)(lua_State* L);
typedef int(__stdcall* f_coreInstancePath)(lua_State* L);
f_coreInit coreInit = nullptr; f_coreInit coreInit = nullptr;
f_coreDeinit coreDeinit = nullptr; f_coreDeinit coreDeinit = nullptr;
f_coreFrame coreFrame = nullptr; f_coreFrame coreFrame = nullptr;
f_coreUnitsData coreUnitsData = nullptr; f_coreUnitsData coreUnitsData = nullptr;
f_coreWeaponsData coreWeaponsData = nullptr; f_coreWeaponsData coreWeaponsData = nullptr;
f_coreMissionData coreMissionData = nullptr; f_coreMissionData coreMissionData = nullptr;
f_coreInstancePath coreInstancePath = nullptr;
static int onSimulationStart(lua_State* L) static int onSimulationStart(lua_State* L)
{ {
@@ -90,6 +92,13 @@ static int onSimulationStart(lua_State* L)
goto error; goto error;
} }
coreInstancePath = (f_coreInstancePath)GetProcAddress(hGetProcIDDLL, "coreInstancePath");
if (!coreInstancePath)
{
LogError(L, "Error getting coreInstancePath ProcAddress from DLL");
goto error;
}
coreInit(L); coreInit(L);
LogInfo(L, "Module loaded and started successfully."); LogInfo(L, "Module loaded and started successfully.");
@@ -137,6 +146,7 @@ static int onSimulationStop(lua_State* L)
coreUnitsData = nullptr; coreUnitsData = nullptr;
coreWeaponsData = nullptr; coreWeaponsData = nullptr;
coreMissionData = nullptr; coreMissionData = nullptr;
coreInstancePath = nullptr;
} }
hGetProcIDDLL = NULL; hGetProcIDDLL = NULL;
@@ -175,6 +185,15 @@ static int setMissionData(lua_State* L)
return 0; return 0;
} }
static int setInstancePath(lua_State* L)
{
if (coreInstancePath)
{
coreInstancePath(L);
}
return 0;
}
static const luaL_Reg Map[] = { static const luaL_Reg Map[] = {
{"onSimulationStart", onSimulationStart}, {"onSimulationStart", onSimulationStart},
{"onSimulationFrame", onSimulationFrame}, {"onSimulationFrame", onSimulationFrame},
@@ -182,6 +201,7 @@ static const luaL_Reg Map[] = {
{"setUnitsData", setUnitsData }, {"setUnitsData", setUnitsData },
{"setWeaponsData", setWeaponsData }, {"setWeaponsData", setWeaponsData },
{"setMissionData", setMissionData }, {"setMissionData", setMissionData },
{"setInstancePath", setInstancePath },
{NULL, NULL} {NULL, NULL}
}; };