diff options
author | Francois Botha <igitur@gmail.com> | 2017-04-03 17:48:34 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2017-04-03 17:48:34 +0300 |
commit | 41fe812a81904f9c8b4124e2500ca70bf6d8ae2d (patch) | |
tree | 81c501633476b4c4e9574b950210915778009008 /mcs/class/WindowsBase | |
parent | ce2a8fcad1b69163fb4686cd607cdd9471518c32 (diff) |
Correctly detect relative Uri in package parts (#3630)
Diffstat (limited to 'mcs/class/WindowsBase')
-rw-r--r-- | mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs | 15 | ||||
-rw-r--r-- | mcs/class/WindowsBase/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();
+ }
}
}
|