+\fclass AircraftResourceProvider : public simgear::ResourceProvider
+{
+public:
+ AircraftResourceProvider() :
+ simgear::ResourceProvider(simgear::ResourceManager::PRIORITY_HIGH)
+ {
+ }
+
+ virtual SGPath resolve(const std::string& aResource, SGPath&) const
+ {
+ string_list pieces(sgPathBranchSplit(aResource));
+ if ((pieces.size() < 3) || (pieces.front() != "Aircraft")) {
+ return SGPath(); // not an Aircraft path
+ }
+
+ // test against the aircraft-dir property
+ const char* aircraftDir = fgGetString("/sim/aircraft-dir");
+ string_list aircraftDirPieces(sgPathBranchSplit(aircraftDir));
+ if (aircraftDirPieces.empty() || (aircraftDirPieces.back() != pieces[1])) {
+ return SGPath(); // current aircraft-dir does not match resource aircraft
+ }
+
+ SGPath r(aircraftDir);
+ for (unsigned int i=2; i<pieces.size(); ++i) {
+ r.append(pieces[i]);
+ }
+
+ if (r.exists()) {
+ SG_LOG(SG_IO, SG_INFO, "found path:" << aResource << " via /sim/aircraft-dir: " << r.str());
+ return r;
+ }
+
+ // try each aircaft dir in turn
+ std::string res(aResource, 9); // resource path with 'Aircraft/' removed
+ const string_list& dirs(globals->get_aircraft_paths());
+ string_list::const_iterator it = dirs.begin();
+ for (; it != dirs.end(); ++it) {
+ SGPath p(*it, res);
+ if (p.exists()) {
+ SG_LOG(SG_IO, SG_INFO, "found path:" << aResource << " in aircraft dir: " << r.str());
+ return p;
+ }
+ } // of aircraft path iteration
+
+ return SGPath(); // not found
+ }
+};
+