using ServerManagerTool.Common.Model; using ServerManagerTool.Common.Utils; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Windows; namespace ServerManagerTool.Lib { /// /// This class is responsible for managing all of the servers the tool knows about. /// public class ServerManager : DependencyObject { static ServerManager() { ServerManager.Instance = new ServerManager(); } public static ServerManager Instance { get; private set; } public static readonly DependencyProperty ServersProperty = DependencyProperty.Register(nameof(Servers), typeof(SortableObservableCollection), typeof(ServerManager), new PropertyMetadata(new SortableObservableCollection())); public SortableObservableCollection Servers { get { return (SortableObservableCollection)GetValue(ServersProperty); } set { SetValue(ServersProperty, value); } } public ServerManager() { this.Servers.CollectionChanged += Servers_CollectionChanged; } void Servers_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if(e.Action == NotifyCollectionChangedAction.Remove) { foreach(Server server in e.OldItems) { server.Dispose(); } } } public int AddFromPath(string path) { var server = Server.FromPath(path); if (server == null) return this.Servers.Count - 1; this.Servers.Add(server); return this.Servers.Count - 1; } public int AddNew() { var server = Server.FromDefaults(); if (server == null) return this.Servers.Count - 1; this.Servers.Add(server); return this.Servers.Count - 1; } public void Remove(Server server, bool deleteProfile) { if (server == null) return; // save the profile before deleting, just in case something needed has changed if (server.Profile != null) server.Profile.Save(false, false, null); if (deleteProfile) { var profileFile = server.Profile?.GetProfileFile(); if (!string.IsNullOrWhiteSpace(profileFile) && File.Exists(profileFile)) { // set the file permissions SecurityUtils.SetFileOwnershipForAllUsers(profileFile); try { File.Delete(profileFile); } catch (Exception) { } } var profileIniDir = server.Profile?.GetProfileConfigDir_Old(); if (!string.IsNullOrWhiteSpace(profileIniDir) && Directory.Exists(profileIniDir)) { // set the folder permissions SecurityUtils.SetDirectoryOwnershipForAllUsers(profileIniDir); try { Directory.Delete(profileIniDir, true); } catch (Exception) { } } } server.Runtime?.DeleteFirewallRules(); server.Dispose(); this.Servers.Remove(server); } public void CheckProfiles() { var serverIds = new Dictionary(); foreach (var server in Servers) { if (server == null || server.Profile == null) continue; while (serverIds.ContainsKey(server.Profile.ProfileID)) { server.Profile.ResetProfileId(); } serverIds.Add(server.Profile.ProfileID, true); } } public void SortServers() { Servers.Sort(s => s.Profile?.SortKey); } } }