Skip to content

Commit c5523f0

Browse files
committed
resolve merge conflict
1 parent 10fbca3 commit c5523f0

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

src/DocumentFormat.OpenXml.Framework/OpenXmlPartReader.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
using System.Linq;
1313
using System.Text;
1414
using System.Xml;
15+
#if NET6_0_OR_GREATER
16+
using System.Threading.Tasks;
17+
#endif
1518

1619
namespace DocumentFormat.OpenXml
1720
{
@@ -97,7 +100,11 @@ public OpenXmlPartReader(Stream partStream, IFeatureCollection features, OpenXml
97100

98101
_resolver = features.GetRequired<IOpenXmlNamespaceResolver>();
99102
_rootElements = features.GetRequired<IRootElementFeature>();
103+
#if NET6_0_OR_GREATER
104+
_xmlReader = CreateReader(partStream, options, out bool? standalone, out string? encoding);
105+
#else
100106
_xmlReader = CreateReader(partStream, options.CloseStream, options.MaxCharactersInPart, ignoreWhitespace: options.IgnoreWhitespace, out bool? standalone, out string? encoding);
107+
#endif
101108
_openXmlPartReaderState = new OpenXmlPartReaderState(standalone, encoding);
102109
}
103110

@@ -712,6 +719,61 @@ private XmlReader CreateReader(Stream partStream, bool closeInput, long maxChara
712719
return xmlReader;
713720
}
714721

722+
private XmlReader CreateReader(Stream partStream, OpenXmlPartReaderOptions options, out bool? standalone, out string? encoding)
723+
{
724+
XmlReaderSettings settings = new()
725+
{
726+
MaxCharactersInDocument = options.MaxCharactersInPart,
727+
CloseInput = options.CloseStream,
728+
IgnoreWhitespace = options.IgnoreWhitespace,
729+
#if NET35
730+
ProhibitDtd = true,
731+
#else
732+
DtdProcessing = DtdProcessing.Prohibit,
733+
#endif
734+
#if NET6_0_OR_GREATER
735+
Async = options.Async,
736+
#endif
737+
};
738+
739+
740+
#if NET6_0_OR_GREATER
741+
XmlReader xmlReader = XmlConvertingReaderFactory.CreateAsync(partStream, _resolver, settings);
742+
//XmlReader xmlReader = XmlReader.Create(partStream, settings);
743+
xmlReader.ReadAsync();
744+
#else
745+
var xmlReader = XmlConvertingReaderFactory.Create(partStream, _resolver, settings);
746+
xmlReader.Read();
747+
#endif
748+
749+
if (xmlReader.NodeType == XmlNodeType.XmlDeclaration)
750+
{
751+
encoding = xmlReader["encoding"];
752+
753+
var standaloneRaw = xmlReader["standalone"];
754+
755+
if (string.Equals("yes", standaloneRaw, StringComparison.Ordinal))
756+
{
757+
standalone = true;
758+
}
759+
else if (string.Equals("no", standaloneRaw, StringComparison.Ordinal))
760+
{
761+
standalone = false;
762+
}
763+
else
764+
{
765+
standalone = null;
766+
}
767+
}
768+
else
769+
{
770+
encoding = null;
771+
standalone = null;
772+
}
773+
774+
return xmlReader;
775+
}
776+
715777
private bool ReadRoot()
716778
{
717779
Debug.Assert(_elementState == ElementState.Null);
@@ -880,6 +942,20 @@ private OpenXmlElement CreateChildElement()
880942
return element.ElementFactory(_xmlReader);
881943
}
882944

945+
#region Async methods
946+
947+
#if NET6_0_OR_GREATER
948+
/// <summary>
949+
/// Asynchronously reads the next element.
950+
/// </summary>
951+
/// <returns>A task that represents the asynchronous read operation. The value of the TResult parameter contains true if the next element was read successfully; false if there are no more elements to read.</returns>
952+
public override Task<bool> ReadAsync()
953+
{
954+
return _xmlReader.ReadAsync();
955+
}
956+
#endif
957+
#endregion
958+
883959
private void ThrowIfNull()
884960
{
885961
if (_elementState == ElementState.Null)

src/DocumentFormat.OpenXml.Framework/OpenXmlPartReaderOptions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,21 @@ public struct OpenXmlPartReaderOptions
3131
/// </summary>
3232
public bool CloseStream { get; set; }
3333

34+
#if NET6_0_OR_GREATER
35+
/// <summary>
36+
/// Gets or sets a value indicating whether asynchronous reading is enabled.
37+
/// </summary>
38+
public bool Async { get; set; }
39+
#endif
40+
3441
internal OpenXmlPartReaderOptions UpdateForPart(OpenXmlPart part) => new()
3542
{
3643
ReadMiscellaneousNodes = ReadMiscellaneousNodes,
3744
MaxCharactersInPart = MaxCharactersInPart != 0 ? MaxCharactersInPart : part.MaxCharactersInPart,
3845
IgnoreWhitespace = IgnoreWhitespace,
3946
CloseStream = true,
47+
#if NET6_0_OR_GREATER
48+
Async = Async,
49+
#endif
4050
};
4151
}

src/DocumentFormat.OpenXml.Framework/OpenXmlReader.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
using System.Collections.ObjectModel;
88
using System.IO;
99
using System.Xml;
10+
#if NET6_0_OR_GREATER
11+
using System.Threading.Tasks;
12+
#endif
1013

1114
namespace DocumentFormat.OpenXml
1215
{
@@ -246,6 +249,22 @@ protected virtual void ThrowIfObjectDisposed()
246249
}
247250
}
248251

252+
#region Async methods
253+
254+
#if NET6_0_OR_GREATER
255+
/// <summary>
256+
/// Asynchronously reads the next element.
257+
/// </summary>
258+
/// <returns>A task that represents the asynchronous read operation. The value of the TResult parameter contains true if the next element was read successfully; false if there are no more elements to read.</returns>
259+
public virtual Task<bool> ReadAsync()
260+
{
261+
bool res = Read();
262+
263+
return Task.FromResult(res);
264+
}
265+
#endif
266+
#endregion
267+
249268
/// <summary>
250269
/// Closes the reader, and releases all resources.
251270
/// </summary>

src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,3 +1009,9 @@ DocumentFormat.OpenXml.OpenXmlPartWriterSettings.Encoding.set -> void
10091009
DocumentFormat.OpenXml.OpenXmlPartWriterSettings.OpenXmlPartWriterSettings() -> void
10101010
DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(DocumentFormat.OpenXml.Packaging.OpenXmlPart! openXmlPart, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void
10111011
DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(System.IO.Stream! partStream, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void
1012+
1013+
1014+
DocumentFormat.OpenXml.OpenXmlPartReaderOptions.Async.get -> bool
1015+
DocumentFormat.OpenXml.OpenXmlPartReaderOptions.Async.set -> void
1016+
virtual DocumentFormat.OpenXml.OpenXmlReader.ReadAsync() -> System.Threading.Tasks.Task<bool>!
1017+
override DocumentFormat.OpenXml.OpenXmlReader.ReadAsync() -> System.Threading.Tasks.Task<bool>!

src/DocumentFormat.OpenXml.Framework/XmlConvertingReaderFactory.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,19 @@ public static XmlReader Create(TextReader textReader, IOpenXmlNamespaceResolver
3939

4040
return new XmlConvertingReader(xmlReader, resolver, true);
4141
}
42+
43+
#if NET6_0_OR_GREATER
44+
public static XmlReader CreateAsync(Stream partStream, IOpenXmlNamespaceResolver resolver, XmlReaderSettings settings)
45+
{
46+
return CreateAsync(partStream, resolver, settings, true);
47+
}
48+
49+
public static XmlReader CreateAsync(Stream partStream, IOpenXmlNamespaceResolver resolver, XmlReaderSettings settings, bool strictRelationshipFound)
50+
{
51+
var xmlReader = XmlReader.Create(partStream, settings);
52+
53+
return new XmlConvertingReader(xmlReader, resolver, strictRelationshipFound);
54+
}
55+
#endif
4256
}
4357
}

0 commit comments

Comments
 (0)