FFXIVLauncher-Netmaui
70 строк · 2.2 Кб
1using System;2using System.Collections.Generic;3using System.Threading;4using Serilog;5
6namespace XIVLauncher.Common.Addon7{
8public class AddonManager9{10private List<Tuple<IAddon, Thread, CancellationTokenSource>> _runningAddons;11
12public bool IsRunning { get; private set; }13
14public void RunAddons(int gamePid, List<IAddon> addonEntries)15{16if (_runningAddons != null)17throw new Exception("Addons still running?");18
19_runningAddons = new List<Tuple<IAddon, Thread, CancellationTokenSource>>();20
21foreach (var addonEntry in addonEntries)22{23addonEntry.Setup(gamePid);24
25if (addonEntry is IPersistentAddon persistentAddon)26{27Log.Information("Starting PersistentAddon {0}", persistentAddon.Name);28var cancellationTokenSource = new CancellationTokenSource();29
30var addonThread = new Thread(persistentAddon.DoWork);31addonThread.Start(cancellationTokenSource.Token);32
33_runningAddons.Add(new Tuple<IAddon, Thread, CancellationTokenSource>(persistentAddon, addonThread, cancellationTokenSource));34}35
36if (addonEntry is IRunnableAddon runnableAddon)37{38Log.Information("Starting RunnableAddon {0}", runnableAddon.Name);39runnableAddon.Run();40}41
42if (addonEntry is INotifyAddonAfterClose notifiedAddon)43_runningAddons.Add(new Tuple<IAddon, Thread, CancellationTokenSource>(notifiedAddon, null, null));44}45
46IsRunning = true;47}48
49public void StopAddons()50{51Log.Information("Stopping addons...");52
53if (_runningAddons != null)54{55foreach (var addon in _runningAddons)56{57addon.Item3?.Cancel();58addon.Item2?.Join();59
60if (addon.Item1 is INotifyAddonAfterClose notifiedAddon)61notifiedAddon.GameClosed();62}63
64_runningAddons = null;65}66
67IsRunning = false;68}69}70}