Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois Botha <igitur@gmail.com>2017-04-03 17:48:34 +0300
committerMarek Safar <marek.safar@gmail.com>2017-04-03 17:48:34 +0300
commit41fe812a81904f9c8b4124e2500ca70bf6d8ae2d (patch)
tree81c501633476b4c4e9574b950210915778009008 /mcs/class/WindowsBase
parentce2a8fcad1b69163fb4686cd607cdd9471518c32 (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.cs15
-rw-r--r--mcs/class/WindowsBase/Test/System.IO.Packaging/FakePackageTests.cs37
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();
+ }
}
}