From 87f3e2e1dbf6f03bf20a32b8051f7ce0bea9334b Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 4 Oct 2016 17:08:43 -0400 Subject: [PATCH] Implement OszArchiveReader --- .../Beatmaps/IO/LegacyFilesystemReader.cs | 9 ++--- osu.Game/Beatmaps/IO/OszArchiveReader.cs | 33 +++++++++++++++---- osu.Game/osu.Game.csproj | 3 ++ osu.Game/packages.config | 1 + 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs index 711607b9df..31c7b4c365 100644 --- a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs +++ b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs @@ -19,15 +19,16 @@ namespace osu.Desktop.Beatmaps.IO } private string BasePath { get; set; } + private string[] Beatmaps { get; set; } private Beatmap FirstMap { get; set; } public LegacyFilesystemReader(string path) { BasePath = path; - var maps = ReadBeatmaps(); - if (maps.Length == 0) + Beatmaps = Directory.GetFiles(BasePath, "*.osu").Select(f => Path.GetFileName(f)).ToArray(); + if (Beatmaps.Length == 0) throw new FileNotFoundException("This directory contains no beatmaps"); - using (var stream = new StreamReader(ReadFile(maps[0]))) + using (var stream = new StreamReader(ReadFile(Beatmaps[0]))) { var decoder = BeatmapDecoder.GetDecoder(stream); FirstMap = decoder.Decode(stream); @@ -36,7 +37,7 @@ namespace osu.Desktop.Beatmaps.IO public override string[] ReadBeatmaps() { - return Directory.GetFiles(BasePath, "*.osu").Select(f => Path.GetFileName(f)).ToArray(); + return Beatmaps; } public override Stream ReadFile(string name) diff --git a/osu.Game/Beatmaps/IO/OszArchiveReader.cs b/osu.Game/Beatmaps/IO/OszArchiveReader.cs index 13a4db5db5..036ce07128 100644 --- a/osu.Game/Beatmaps/IO/OszArchiveReader.cs +++ b/osu.Game/Beatmaps/IO/OszArchiveReader.cs @@ -1,5 +1,8 @@ using System; using System.IO; +using System.Linq; +using Ionic.Zip; +using osu.Game.Beatmaps.Formats; namespace osu.Game.Beatmaps.IO { @@ -11,32 +14,48 @@ namespace osu.Game.Beatmaps.IO { using (var stream = storage.GetStream(path)) { - // TODO: detect if osz - return false; + if (!ZipFile.IsZipFile(stream, false)) + return false; + using (ZipFile zip = ZipFile.Read(stream)) + return zip.Entries.Any(e => e.FileName.EndsWith(".osu")); } }); } - private Stream Archive { get; set; } + private ZipFile Archive { get; set; } + private string[] Beatmaps { get; set; } + private Beatmap FirstMap { get; set; } public OszArchiveReader(Stream archive) { - Archive = archive; + Archive = ZipFile.Read(archive); + Beatmaps = Archive.Entries.Where(e => e.FileName.EndsWith(".osu")) + .Select(e => e.FileName).ToArray(); + if (Beatmaps.Length == 0) + throw new FileNotFoundException("This directory contains no beatmaps"); + using (var stream = new StreamReader(ReadFile(Beatmaps[0]))) + { + var decoder = BeatmapDecoder.GetDecoder(stream); + FirstMap = decoder.Decode(stream); + } } public override string[] ReadBeatmaps() { - throw new NotImplementedException(); + return Beatmaps; } public override Stream ReadFile(string name) { - throw new NotImplementedException(); + ZipEntry entry = Archive.Entries.SingleOrDefault(e => e.FileName == name); + if (entry == null) + throw new FileNotFoundException(); + return entry.OpenReader(); } public override Metadata ReadMetadata() { - throw new NotImplementedException(); + return FirstMap.Metadata; } } } \ No newline at end of file diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index ed8d91d6e7..e50e0847d8 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -55,6 +55,9 @@ ..\packages\sqlite-net-pcl.1.2.0\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll + + ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll + diff --git a/osu.Game/packages.config b/osu.Game/packages.config index d40da68750..1f14b0038d 100644 --- a/osu.Game/packages.config +++ b/osu.Game/packages.config @@ -4,6 +4,7 @@ Copyright (c) 2007-2016 ppy Pty Ltd . Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE --> +