From 41fe812a81904f9c8b4124e2500ca70bf6d8ae2d Mon Sep 17 00:00:00 2001 From: Francois Botha Date: Mon, 3 Apr 2017 16:48:34 +0200 Subject: [PATCH] Correctly detect relative Uri in package parts (#3630) --- .../WindowsBase/System.IO.Packaging/PackagePart.cs | 15 +++++---- .../Test/System.IO.Packaging/FakePackageTests.cs | 37 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs b/mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs index 06546720d6c..4ad41e5a65e 100644 --- a/mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs +++ b/mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs @@ -165,12 +165,15 @@ namespace System.IO.Packaging { TargetMode mode = TargetMode.Internal; if (node.Attributes["TargetMode"] != null) mode = (TargetMode) Enum.Parse (typeof(TargetMode), node.Attributes ["TargetMode"].Value); - - CreateRelationship (new Uri (node.Attributes["Target"].Value.ToString(), UriKind.RelativeOrAbsolute), - mode, - node.Attributes["Type"].Value.ToString (), - node.Attributes["Id"].Value.ToString (), - true); + + // Workaround for Mono relative paths + // http://www.mono-project.com/docs/faq/known-issues/urikind-relativeorabsolute/ + var kind = (UriKind) 300; + CreateRelationship (new Uri (node.Attributes["Target"].Value.ToString(), kind), + mode, + node.Attributes["Type"].Value.ToString (), + node.Attributes["Id"].Value.ToString (), + true); } } diff --git a/mcs/class/WindowsBase/Test/System.IO.Packaging/FakePackageTests.cs b/mcs/class/WindowsBase/Test/System.IO.Packaging/FakePackageTests.cs index bfea3c84973..7ee53ac327a 100644 --- a/mcs/class/WindowsBase/Test/System.IO.Packaging/FakePackageTests.cs +++ b/mcs/class/WindowsBase/Test/System.IO.Packaging/FakePackageTests.cs @@ -215,5 +215,42 @@ namespace MonoTests.System.IO.Packaging return pack; } + + Package CreateSpreadsheet(Stream stream) + { + Package pack = Package.Open(stream, FileMode.Create); + + // Create package parts. + PackagePart workbookPart = pack.CreatePart(new Uri("/xl/workbook.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); + PackagePart sharedStringsPart = pack.CreatePart(new Uri("/xl/sharedStrings.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"); + + workbookPart.CreateRelationship(new Uri("/xl/sharedStrings.xml", UriKind.Relative), TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", "rel1"); + + // Load some basic data into the different parts. + foreach (PackagePart part in package.GetParts()) + using (Stream s = part.GetStream()) + s.Write(new byte[10], 0, 10); + + return pack; + } + + [Test] + public void TestExcelWorkbook() + { + MemoryStream stream = new MemoryStream(); + Package package = CreateSpreadsheet(stream); + Assert.IsTrue(package.PartExists(new Uri("/xl/workbook.xml", UriKind.Relative)), "#1"); + Assert.IsTrue(package.PartExists(new Uri("/xl/sharedStrings.xml", UriKind.Relative)), "#2"); + + package.Close(); + package = Package.Open(new MemoryStream(stream.ToArray()), FileMode.Open); + + PackagePart workbookPart = package.GetPart(new Uri("/xl/workbook.xml", UriKind.Relative)); + Assert.IsTrue(workbookPart.RelationshipExists("rel1"), "#3"); + + var r = workbookPart.GetRelationship("rel1"); + Assert.IsFalse(r.TargetUri.IsAbsoluteUri, "#4"); + package.Close(); + } } } -- 2.11.4.GIT