Prevent exceptions in getRunwayByIdent when a malformed rwyuse.xml means
there is no valid active runway. This is not ideal, since it masks underlying problems - the real fix is to make the runway-use code more robust and validate input XML.
This commit is contained in:
parent
2b0ffae339
commit
e98ffd1006
2 changed files with 29 additions and 22 deletions
|
@ -348,22 +348,20 @@ void FGAirportDynamics::setRwyUse(const FGRunwayPreference& ref)
|
|||
//cerr << "Exiting due to not implemented yet" << endl;
|
||||
//exit(1);
|
||||
}
|
||||
void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, string &runway)
|
||||
|
||||
bool FGAirportDynamics::innerGetActiveRunway(const string &trafficType, int action, string &runway)
|
||||
{
|
||||
double windSpeed;
|
||||
double windSpeed;
|
||||
double windHeading;
|
||||
double maxTail;
|
||||
double maxCross;
|
||||
string name;
|
||||
string type;
|
||||
|
||||
if (!(rwyPrefs.available()))
|
||||
{
|
||||
runway = chooseRunwayFallback();
|
||||
return; // generic fall back goes here
|
||||
if (!rwyPrefs.available()) {
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
RunwayGroup *currRunwayGroup = 0;
|
||||
int nrActiveRunways = 0;
|
||||
time_t dayStart = fgGetLong("/sim/time/utc/day-seconds");
|
||||
|
@ -390,19 +388,19 @@ void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, s
|
|||
//cerr << "A"<< endl;
|
||||
currSched = rwyPrefs.getSchedule(trafficType.c_str());
|
||||
if (!(currSched))
|
||||
return;
|
||||
return false;
|
||||
//cerr << "B"<< endl;
|
||||
scheduleName = currSched->getName(dayStart);
|
||||
maxTail = currSched->getTailWind ();
|
||||
maxCross = currSched->getCrossWind ();
|
||||
//cerr << "SChedule anme = " << scheduleName << endl;
|
||||
if (scheduleName.empty())
|
||||
return;
|
||||
return false;
|
||||
//cerr << "C"<< endl;
|
||||
currRunwayGroup = rwyPrefs.getGroup(scheduleName);
|
||||
//cerr << "D"<< endl;
|
||||
if (!(currRunwayGroup))
|
||||
return;
|
||||
return false;
|
||||
nrActiveRunways = currRunwayGroup->getNrActiveRunways();
|
||||
|
||||
// Keep a history of the currently active runways, to ensure
|
||||
|
@ -451,6 +449,7 @@ void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, s
|
|||
}
|
||||
//cerr << endl;
|
||||
}
|
||||
|
||||
if (action == 1) // takeoff
|
||||
{
|
||||
int nr = takeoff.size();
|
||||
|
@ -466,6 +465,7 @@ void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, s
|
|||
runway = chooseRunwayFallback();
|
||||
}
|
||||
}
|
||||
|
||||
if (action == 2) // landing
|
||||
{
|
||||
int nr = landing.size();
|
||||
|
@ -478,8 +478,15 @@ void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, s
|
|||
runway = chooseRunwayFallback();
|
||||
}
|
||||
}
|
||||
//runway = globals->get_runways()->search(_ap->getId(), int(windHeading));
|
||||
//cerr << "Seleceted runway: " << runway << endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, string &runway)
|
||||
{
|
||||
bool ok = innerGetActiveRunway(trafficType, action, runway);
|
||||
if (!ok) {
|
||||
runway = chooseRunwayFallback();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ private:
|
|||
//double avWindSpeed [10];
|
||||
|
||||
string chooseRunwayFallback();
|
||||
|
||||
bool innerGetActiveRunway(const string &trafficType, int action, string &runway);
|
||||
public:
|
||||
FGAirportDynamics(FGAirport* ap);
|
||||
FGAirportDynamics(const FGAirportDynamics &other);
|
||||
|
|
Loading…
Reference in a new issue