From 1f6e5f4d329934d06b5423481806e1fc8c78ddb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Mon, 14 Dec 2020 20:11:53 +0100 Subject: [PATCH] Copy archive contents to memory stream --- osu.Android/OsuGameActivity.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/osu.Android/OsuGameActivity.cs b/osu.Android/OsuGameActivity.cs index fe9b292389..f531b79d92 100644 --- a/osu.Android/OsuGameActivity.cs +++ b/osu.Android/OsuGameActivity.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.IO; using System.Threading.Tasks; using Android.App; using Android.Content; @@ -69,9 +70,21 @@ namespace osu.Android var filenameColumn = cursor.GetColumnIndex(OpenableColumns.DisplayName); var stream = ContentResolver.OpenInputStream(uri); + string filename = cursor.GetString(filenameColumn); if (stream != null) - Task.Factory.StartNew(() => game.Import(stream, cursor.GetString(filenameColumn)), TaskCreationOptions.LongRunning); + Task.Factory.StartNew(() => runImport(stream, filename), TaskCreationOptions.LongRunning); + } + + private Task runImport(Stream stream, string filename) + { + // SharpCompress requires archive streams to be seekable, which the stream opened by + // OpenInputStream() seems to not necessarily be. + // copy to an arbitrary-access memory stream to be able to proceed with the import. + var copy = new MemoryStream(); + stream.CopyTo(copy); + + return game.Import(copy, filename); } } }