FFXIVLauncher-Netmaui

Форк
0
70 строк · 2.2 Кб
1
using System;
2
using System.Collections.Generic;
3
using System.Threading;
4
using Serilog;
5

6
namespace XIVLauncher.Common.Addon
7
{
8
    public class AddonManager
9
    {
10
        private List<Tuple<IAddon, Thread, CancellationTokenSource>> _runningAddons;
11

12
        public bool IsRunning { get; private set; }
13

14
        public void RunAddons(int gamePid, List<IAddon> addonEntries)
15
        {
16
            if (_runningAddons != null)
17
                throw new Exception("Addons still running?");
18

19
            _runningAddons = new List<Tuple<IAddon, Thread, CancellationTokenSource>>();
20

21
            foreach (var addonEntry in addonEntries)
22
            {
23
                addonEntry.Setup(gamePid);
24

25
                if (addonEntry is IPersistentAddon persistentAddon)
26
                {
27
                    Log.Information("Starting PersistentAddon {0}", persistentAddon.Name);
28
                    var cancellationTokenSource = new CancellationTokenSource();
29

30
                    var addonThread = new Thread(persistentAddon.DoWork);
31
                    addonThread.Start(cancellationTokenSource.Token);
32

33
                    _runningAddons.Add(new Tuple<IAddon, Thread, CancellationTokenSource>(persistentAddon, addonThread, cancellationTokenSource));
34
                }
35

36
                if (addonEntry is IRunnableAddon runnableAddon)
37
                {
38
                    Log.Information("Starting RunnableAddon {0}", runnableAddon.Name);
39
                    runnableAddon.Run();
40
                }
41

42
                if (addonEntry is INotifyAddonAfterClose notifiedAddon)
43
                    _runningAddons.Add(new Tuple<IAddon, Thread, CancellationTokenSource>(notifiedAddon, null, null));
44
            }
45

46
            IsRunning = true;
47
        }
48

49
        public void StopAddons()
50
        {
51
            Log.Information("Stopping addons...");
52

53
            if (_runningAddons != null)
54
            {
55
                foreach (var addon in _runningAddons)
56
                {
57
                    addon.Item3?.Cancel();
58
                    addon.Item2?.Join();
59

60
                    if (addon.Item1 is INotifyAddonAfterClose notifiedAddon)
61
                        notifiedAddon.GameClosed();
62
                }
63

64
                _runningAddons = null;
65
            }
66

67
            IsRunning = false;
68
        }
69
    }
70
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.