コード例 #1
0
        private void OnShown(object sender, EventArgs e)
        {
            DialogResult = DialogResult.OK;

            int modCount = mods.Count;
            int modIndex = 0;

            SetTaskCount(modCount);

            CancellationToken token = tokenSource.Token;
            var generator           = new ModManifestGenerator();

            void hashStart(object o, FileHashEventArgs args)
            {
                args.Cancel = token.IsCancellationRequested;
                SetStep($"Checking file {args.FileIndex}/{args.FileCount}: {args.FileName}");
                SetProgress(args.FileIndex / (double)args.FileCount);
            }

            void hashEnd(object o, FileHashEventArgs args)
            {
                args.Cancel = token.IsCancellationRequested;
            }

            generator.FileHashStart += hashStart;
            generator.FileHashEnd   += hashEnd;

            using (var task = new Task(() =>
            {
                foreach (Tuple <string, ModInfo> i in mods)
                {
                    string path = Path.Combine("mods", i.Item1);
                    ModInfo info = i.Item2;

                    SetTaskAndStep($"Verifying mod {++modIndex}/{modCount}: {info.Name}",
                                   "Loading local manifest...");

                    List <ModManifest> local = ModManifest.FromFile(Path.Combine(path, "mod.manifest"));
                    List <ModManifestDiff> diff = generator.Verify(path, local);

                    if (diff?.Any(x => x.State != ModManifestState.Unchanged) == true)
                    {
                        Failed.Add(new Tuple <string, ModInfo, List <ModManifestDiff> >(i.Item1, info, diff));
                    }

                    NextTask();
                }
            }))
            {
                task.Start();

                while (!task.IsCompleted && !task.IsCanceled)
                {
                    Application.DoEvents();
                }

                task.Wait(token);
            }
        }
コード例 #2
0
        private void OnShown(object sender, EventArgs e)
        {
            CancellationToken token = tokenSource.Token;
            var generator           = new ModManifestGenerator();

            generator.FilesIndexed += (o, args) =>
            {
                SetTask("Manifest generation complete!");
                SetTaskCount(args.FileCount);
            };

            generator.FileHashStart += (o, args) =>
            {
                args.Cancel = token.IsCancellationRequested;
                SetTaskAndStep($"Hashing file: {args.FileIndex}/{args.FileCount}", args.FileName);
                SetProgress(args.FileIndex / (double)args.FileCount);
            };

            generator.FileHashEnd += (o, args) =>
            {
                args.Cancel = token.IsCancellationRequested;
                NextTask();
            };

            using (var task = new Task(() =>
            {
                manifest = generator.Generate(modPath);

                if (!token.IsCancellationRequested)
                {
                    Diff = ModManifestGenerator.Diff(manifest, File.Exists(manifestPath) ? ModManifest.FromFile(manifestPath) : null);
                }
            }))
            {
                task.Start();

                while (!task.IsCompleted && !task.IsCanceled)
                {
                    Application.DoEvents();
                }

                task.Wait(token);
            }

            DialogResult = DialogResult.OK;
        }