Exemple #1
0
        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));
        }