#include "simdata/simDatabase.h" namespace germanairlinesva { namespace file { namespace simdata { SimDatabase::SimDatabase(int xPlaneVersion, const char *hash, std::unique_ptr &configuration, std::function toLog) { if (strcmp(configuration->getScenery().c_str(), hash) != 0 || !util::fileExists(XPLANE_PLUGIN_DIRECTORY SIMDATABASE)) { scan(xPlaneVersion < 12000 ? XPLANE11_BASE_SCENERY : XPLANE12_BASE_SCENERY, XPLANE_CUSTOM_SCENERY, XPLANE_PLUGIN_DIRECTORY "log.txt", airports); configuration->updateScenery(hash); this->toFile(); toLog("Sim Database updated"); } else { this->fromFile(); } } void SimDatabase::fromFile() { std::ifstream in(XPLANE_PLUGIN_DIRECTORY SIMDATABASE, std::ifstream::binary); // File Header std::string ident = readString(in, 5); if (ident.compare("VGAS") != 0) { throw std::invalid_argument("Wrong file"); } std::uint8_t version = read(in); if (version == 1) { this->readVersion1(in); } } void SimDatabase::readVersion1(std::ifstream &in) { std::uint16_t numAirports = read(in); for (int i = 0; i < numAirports; i++) { // ICAO std::string icao = readString(in); // Gates std::uint16_t numGates = read(in); for (int j = 0; j < numGates; j++) { std::string designator = readString(in); struct germanairlinesva::geodata::point center = read(in); std::uint8_t radius = read(in); this->airports[icao].first.emplace_back(designator, center, radius); } // Runways std::uint8_t numRunways = read(in); for (int j = 0; j < numRunways; j++) { std::string designator = readString(in); // Bounds struct germanairlinesva::geodata::box bounds = read(in); std::uint8_t width = read(in); std::uint16_t length = read(in); std::uint16_t trueHeading = read(in); this->airports[icao].second.emplace_back(designator, bounds, width, length, trueHeading); } } in.close(); } void SimDatabase::toFile() const { std::ofstream out(XPLANE_PLUGIN_DIRECTORY SIMDATABASE, std::fstream::binary); // File Header, Last member is version std::uint8_t header[] = {'V', 'G', 'A', 'S', '\0', 1}; out.write(reinterpret_cast(header), 6); // Num Airports write(out, airports.size()); // Airport for (const std::pair, std::vector>> &airport : airports) { std::string icao = airport.first; const std::vector gates = airport.second.first; const std::vector runways = airport.second.second; // ICAO writeString(out, icao); // Gates write(out, gates.size()); for (const Gate &gate : gates) { gate.toFile(out); } // Runways write(out, runways.size()); for (const Runway &runway : runways) { runway.toFile(out); } } out.close(); } } // namespace simdata } // namespace file } // namespace germanairlinesva