1
0
Fork 0

src/Main/options.cxx: Fixed bug introduced by recent support for replaying from url.

We used to modify the --aircraft and --airport options when handling
--load-tape, which invalidated iterators and for example could cause later
options to be ignored.

The solution here is rather crude - we store the new options in globals to
ensure that they are used in preference later on.
This commit is contained in:
Julian Smith 2021-02-26 12:39:15 +00:00
parent ad1b932324
commit 538e32d555

View file

@ -1593,6 +1593,19 @@ static std::string urlToLocalPath(const char* url)
return path;
}
// When loading a Continuous recording at startup, we need to override the
// aircraft and airport. Unfortunately we can't simply set /sim/aircraft
// because there may be --aircraft options later on in the command line. Also
// fgMainInit() ends up calling Options::initAircraft() after we have processed
// all options, and Options::initAircraft() seems to look directly at the
// options again, instead of using /sim/aircraft.
//
// So we store any aircraft/airport override here, so that
// Options::initAircraft() can use them if they are set, instead of going back
// to any user-specified aircraft.
//
static std::string g_load_tape_aircraft;
static std::string g_load_tape_airport;
static int
fgOptLoadTape(const char* arg)
@ -1719,19 +1732,11 @@ fgOptLoadTape(const char* arg)
std::string aircraft = properties->getStringValue("meta/aircraft-type");
std::string airport = properties->getStringValue("meta/closest-airport-id");
SG_LOG(SG_GENERAL, SG_ALERT, "From recording header: aircraft=" << aircraft << " airport=" << airport);
if (aircraft != "") {
// Force --aircraft and --airport options to use values from the
// recording.
//
Options::sharedInstance()->setOption("aircraft", aircraft);
}
if (airport != "") {
// Looks like setting --airport option doesn't work - we need to call
// fgOptAirport() directly.
//
Options::sharedInstance()->setOption("airport", airport);
fgOptAirport(airport.c_str());
}
// Override aircraft and airport settings to match what is in the
// recording.
//
g_load_tape_aircraft = aircraft;
g_load_tape_airport = airport;
// Arrange to load the recording after FDM has initialised.
new DelayedTapeLoader(path.c_str(), filerequest);
@ -2378,7 +2383,11 @@ void Options::initPaths()
OptionResult Options::initAircraft()
{
string aircraft;
if (isOptionSet("aircraft")) {
if (g_load_tape_aircraft != "") {
// Use Continuous recording's aircraft if we are replaying on startup.
aircraft = g_load_tape_aircraft;
}
else if (isOptionSet("aircraft")) {
aircraft = valueForOption("aircraft");
} else if (isOptionSet("vehicle")) {
aircraft = valueForOption("vehicle");
@ -2834,6 +2843,19 @@ OptionResult Options::processOptions()
globals->append_fg_scenery(root);
}
if (g_load_tape_aircraft != "") {
// This might not be necessary, because we always end up calling
// Options::initAircraft() later on, which also knows to use
// g_load_tape_aircraft if it is not "".
//
SG_LOG(SG_GENERAL, SG_ALERT, "overriding aircraft from " << fgGetString("/sim/aircraft") << " to " << g_load_tape_aircraft);
fgSetString("/sim/aircraft", g_load_tape_aircraft);
}
if (g_load_tape_airport != "") {
SG_LOG(SG_GENERAL, SG_ALERT, "overriding airport from " << fgGetString("/sim/presets/airport-id") << " to " << g_load_tape_airport);
fgOptAirport(g_load_tape_airport.c_str());
}
if (isOptionSet("json-report")) {
printJSONReport();
return FG_OPTIONS_EXIT;