public MountResult ImportMissions <T>(string directoryPath, out Registry <T, MissionSet[]> sortedMissions, Func <MissionSet, T> filter) { sortedMissions = new Registry <T, MissionSet[]>(); Registry <T, List <MissionSet> > temp = new Registry <T, List <MissionSet> >(); if (directoryPath == null || !Directory.Exists(directoryPath) || File.Exists(directoryPath)) { return(new MountResult(MountErrorType.INVALID_DIRECTORY, Resource.Strings.MountError_INVALID_DIRECTORY.F(directoryPath))); } List <string> errorList = new List <string>(); foreach (string p in Directory.GetFiles(directoryPath, "*" + RULESFILE_EXT, SearchOption.AllDirectories)) { try { string dir = Path.GetDirectoryName(p); string name = Path.GetFileNameWithoutExtension(p); string sMap = MAPFILE_FORMAT.F(dir, name); string sMis = MISFILE_FORMAT.F(dir, name); string sMod = MODFILE_FORMAT.F(dir, name); // Ignore the set if either the map or the mis file does not exist if (!File.Exists(sMap) || !File.Exists(sMis)) { continue; } // The mod file is optional, exclude it if not present if (!File.Exists(sMod)) { sMod = null; } MissionSourceInfo srcInfo = new MissionSourceInfo(sMap, sMis, p, sMod); // load rules file into memory (if some error occurs, ignore this set) MapRulesFile rulf = new MapRulesFile(); try { rulf.ReadFromFile(p); MissionInfo misInfo = rulf.RetrieveInfo(); MissionSet set = new MissionSet(misInfo, srcInfo); T t = filter(set); if (t != null) { if (temp.Contains(t)) { temp[t].Add(set); } else { temp.Add(t, new List <MissionSet> { set }); } } } catch { errorList.Add(p); continue; } } catch { errorList.Add(p); continue; } } foreach (T t in temp.GetKeys()) { sortedMissions.Put(t, temp[t].ToArray()); } if (errorList.Count > 0) { return(new MountResult(MountErrorType.PARTIAL_ERROR, Resource.Strings.MountError_PARTIAL_ERROR.F(errorList.Count))); } return(new MountResult(MountErrorType.SUCCESS)); }