// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. #nullable disable using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using osu.Game.Database; namespace osu.Game { public partial class OsuGameBase { private readonly List fileImporters = new List(); /// /// Register a global handler for file imports. Most recently registered will have precedence. /// /// The handler to register. public void RegisterImportHandler(ICanAcceptFiles handler) => fileImporters.Insert(0, handler); /// /// Unregister a global handler for file imports. /// /// The previously registered handler. public void UnregisterImportHandler(ICanAcceptFiles handler) => fileImporters.Remove(handler); public async Task Import(params string[] paths) { if (paths.Length == 0) return; var filesPerExtension = paths.GroupBy(p => Path.GetExtension(p).ToLowerInvariant()); foreach (var groups in filesPerExtension) { foreach (var importer in fileImporters) { if (importer.HandledExtensions.Contains(groups.Key)) await importer.Import(groups.ToArray()).ConfigureAwait(false); } } } public virtual async Task Import(ImportTask[] tasks, ImportParameters parameters = default) { var tasksPerExtension = tasks.GroupBy(t => Path.GetExtension(t.Path).ToLowerInvariant()); await Task.WhenAll(tasksPerExtension.Select(taskGroup => { var importer = fileImporters.FirstOrDefault(i => i.HandledExtensions.Contains(taskGroup.Key)); return importer?.Import(taskGroup.ToArray(), parameters) ?? Task.CompletedTask; })).ConfigureAwait(false); } public IEnumerable HandledExtensions => fileImporters.SelectMany(i => i.HandledExtensions); } }