using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Diagnostics; using StrixMusic.Sdk.CoreModels; using Windows.Storage; namespace StrixMusic.Services.CoreManagement { /// /// Manages added and removing core instances. /// public sealed class CoreManagementService : ICoreManagementService { private readonly AppSettings _settings; /// /// Creates a new instance of . /// /// Settings service used to store core information. public CoreManagementService(AppSettings settings) { _settings = settings; } /// public async Task RegisterCoreInstanceAsync(CoreMetadata coreMetadata) { Guard.IsTrue(IsInitialized, nameof(IsInitialized)); Guard.HasSizeGreaterThan(CoreRegistry.MetadataRegistry, 0, nameof(CoreRegistry.MetadataRegistry)); foreach (var metadata in CoreRegistry.MetadataRegistry) { if (metadata.Id != coreMetadata.Id) continue; var guid = Guid.NewGuid(); var instanceId = $"{metadata.Id}.{guid}"; _settings.CoreInstanceRegistry.Add(instanceId, metadata); _settings.CoreRanking.Add(instanceId); await _settings.SaveAsync(); CoreInstanceRegistered?.Invoke(this, new CoreInstanceEventArgs(instanceId, coreMetadata)); return instanceId; } return ThrowHelper.ThrowArgumentException($"Could not find core with ID {coreMetadata.Id} in the registry."); } /// public async Task UnregisterCoreInstanceAsync(string instanceId) { Guard.IsTrue(IsInitialized, nameof(IsInitialized)); Guard.HasSizeGreaterThan(CoreRegistry.MetadataRegistry, 0, nameof(CoreRegistry.MetadataRegistry)); Guard.IsGreaterThan(_settings.CoreInstanceRegistry.Count, 0, nameof(_settings.CoreInstanceRegistry)); Guard.IsGreaterThan(_settings.CoreRanking.Count, 0, nameof(_settings.CoreRanking)); if (_settings.CoreInstanceRegistry.TryGetValue(instanceId, out var value)) { _settings.CoreInstanceRegistry.Remove(instanceId); _settings.CoreRanking.Remove(instanceId); // TODO: Wait to fully dispose of core. CoreInstanceUnregistered?.Invoke(this, new CoreInstanceEventArgs(instanceId, value)); } var rootStorageFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(instanceId, CreationCollisionOption.OpenIfExists); await rootStorageFolder.DeleteAsync(); await _settings.SaveAsync(); } /// public CoreMetadata GetCoreMetadata(ICore core) { Guard.IsTrue(IsInitialized, nameof(IsInitialized)); return _settings.CoreInstanceRegistry.First(x => x.Key == core.InstanceId).Value; } /// public event EventHandler? CoreInstanceRegistered; /// public event EventHandler? CoreInstanceUnregistered; /// public bool IsInitialized { get; private set; } /// public async Task InitAsync(CancellationToken cancellationToken = default) { if (IsInitialized) return; IsInitialized = true; await _settings.LoadAsync(cancellationToken); } /// public async Task> GetCoreInstanceRegistryAsync() { await _settings.LoadAsync(); return _settings.CoreInstanceRegistry; } /// public async Task> GetCoreInstanceRanking() { await _settings.LoadAsync(); return _settings.CoreRanking; } } }