static bool Commit(FileRepository &repository, AvailableFile &file) { if (file.IsEmpty()) return true; if (!file.IsValid()) return false; repository.files.emplace_back(std::move(file)); file.Clear(); return true; }
bool ParseFileRepository(FileRepository &repository, NLineReader &reader) { AvailableFile file; file.Clear(); char *line; while ((line = reader.ReadLine()) != NULL) { line = const_cast<char *>(TrimLeft(line)); if (*line == 0 || *line == '#') continue; const char *name = line, *value = ParseLine(line); if (value == NULL) return false; if (StringIsEqual(name, "name")) { if (!Commit(repository, file)) return false; file.name.assign(value); } else if (file.IsEmpty()) { /* ignore */ } else if (StringIsEqual(name, "uri")) { file.uri.assign(value); } else if (StringIsEqual(name, "area")) { file.area = value; } else if (StringIsEqual(name, "type")) { if (StringIsEqual(value, "airspace")) file.type = AvailableFile::Type::AIRSPACE; else if (StringIsEqual(value, "waypoint")) file.type = AvailableFile::Type::WAYPOINT; else if (StringIsEqual(value, "map")) file.type = AvailableFile::Type::MAP; else if (StringIsEqual(value, "flarmnet")) file.type = AvailableFile::Type::FLARMNET; } } return Commit(repository, file); }