using System; using System.Collections.Generic; using System.IO; using osu.Framework.OS; namespace osu.Game.Beatmaps.IO { public abstract class ArchiveReader { private class Reader { public Func Test { get; set; } public Type Type { get; set; } } private static List Readers { get; set; } = new List(); public static ArchiveReader GetReader(BasicStorage storage, string path) { foreach (var reader in Readers) { if (reader.Test(storage, path)) return (ArchiveReader)Activator.CreateInstance(reader.Type); } throw new IOException("Unknown file format"); } protected static void AddReader(Func test) where T : ArchiveReader { Readers.Add(new Reader { Test = test, Type = typeof(T) }); } /// /// Reads the beatmap metadata from this archive. /// public abstract BeatmapMetadata ReadMetadata(); /// /// Gets a list of beatmap file names. /// public abstract string[] ReadBeatmaps(); /// /// Opens a stream for reading a specific file from this archive. /// public abstract Stream ReadFile(string name); } }