- bool found = false;
- bool available = false;
- //string gateType;
-
- FGParkingVecIterator i;
-// if (flType == "cargo")
-// {
-// gateType = "RAMP_CARGO";
-// }
-// else if (flType == "ga")
-// {
-// gateType = "RAMP_GA";
-// }
-// else gateType = "GATE";
-
- if (parkings.begin() == parkings.end())
- {
- //cerr << "Could not find parking spot at " << _ap->getId() << endl;
- *lat = _ap->getLatitude();
- *lon = _ap->getLongitude();
- *heading = 0;
- found = true;
+ bool found = false;
+ bool available = false;
+
+
+ FGParkingVecIterator i;
+ if (parkings.begin() == parkings.end()) {
+ //cerr << "Could not find parking spot at " << _ap->getId() << endl;
+ *lat = _ap->getLatitude();
+ *lon = _ap->getLongitude();
+ *heading = 0;
+ found = true;
+ } else {
+ // First try finding a parking with a designated airline code
+ for (i = parkings.begin(); !(i == parkings.end() || found); i++) {
+ available = true;
+ // Taken by another aircraft
+ if (!(i->isAvailable())) {
+ available = false;
+ continue;
+ }
+ // No airline codes, so skip
+ if (i->getCodes().empty()) {
+ available = false;
+ continue;
+ } else { // Airline code doesn't match
+ //cerr << "Code = " << airline << ": Codes " << i->getCodes();
+ if (i->getCodes().find(airline, 0) == string::npos) {
+ available = false;
+ //cerr << "Unavailable" << endl;
+ continue;
+ } else {
+ //cerr << "Available" << endl;
+ }
+ }
+ // Type doesn't match
+ if (i->getType() != flType) {
+ available = false;
+ continue;
+ }
+ // too small
+ if (i->getRadius() < rad) {
+ available = false;
+ continue;
+ }
+
+ if (available) {
+ *lat = i->getLatitude();
+ *lon = i->getLongitude();
+ *heading = i->getHeading();
+ *gateId = i->getIndex();
+ i->setAvailable(false);
+ found = true;
+ }
+ }
+ // then try again for those without codes.
+ for (i = parkings.begin(); !(i == parkings.end() || found); i++) {
+ available = true;
+ if (!(i->isAvailable())) {
+ available = false;
+ continue;
+ }
+ if (!(i->getCodes().empty())) {
+ if ((i->getCodes().find(airline, 0) == string::npos)) {
+ available = false;
+ continue;
+ }
+ }
+ if (i->getType() != flType) {
+ available = false;
+ continue;
+ }
+
+ if (i->getRadius() < rad) {
+ available = false;
+ continue;
+ }
+
+ if (available) {
+ *lat = i->getLatitude();
+ *lon = i->getLongitude();
+ *heading = i->getHeading();
+ *gateId = i->getIndex();
+ i->setAvailable(false);
+ found = true;
+ }
+ }
+ // And finally once more if that didn't work. Now ignore the airline codes, as a last resort
+ for (i = parkings.begin(); !(i == parkings.end() || found); i++) {
+ available = true;
+ if (!(i->isAvailable())) {
+ available = false;
+ continue;
+ }
+ if (i->getType() != flType) {
+ available = false;
+ continue;
+ }
+
+ if (i->getRadius() < rad) {
+ available = false;
+ continue;
+ }
+
+ if (available) {
+ *lat = i->getLatitude();
+ *lon = i->getLongitude();
+ *heading = i->getHeading();
+ *gateId = i->getIndex();
+ i->setAvailable(false);
+ found = true;
+ }
+ }