From: Gerardo Hurtado Lozano Date: Tue, 27 Jun 2017 00:09:50 +0000 (-0700) Subject: saving changes X-Git-Tag: submit/tizen/20210909.063632~11031^2~6239^2~128^2~1^2~29 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=89fe6b0903f81f5137d3cc3ccd3e5231da79b082;p=platform%2Fupstream%2Fdotnet%2Fruntime.git saving changes Commit migrated from https://github.com/dotnet/corefx/commit/77738fd57b3310327affdadc5679e166b3dac244 --- diff --git a/src/libraries/Atom10FeedFormatter.cs b/src/libraries/Atom10FeedFormatter.cs index f331ca2..b948a51 100644 --- a/src/libraries/Atom10FeedFormatter.cs +++ b/src/libraries/Atom10FeedFormatter.cs @@ -8,13 +8,11 @@ namespace Microsoft.ServiceModel.Syndication using System; using System.Collections.Generic; using System.Collections.ObjectModel; - using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.CompilerServices; using System.ServiceModel.Channels; using System.Threading.Tasks; using System.Xml; - using System.Xml.Schema; using System.Xml.Serialization; [XmlRoot(ElementName = Atom10Constants.FeedTag, Namespace = Atom10Constants.Atom10Namespace)] @@ -126,27 +124,44 @@ namespace Microsoft.ServiceModel.Syndication writer.WriteEndElement(); } - internal static void ReadCategory(XmlReaderWrapper reader, SyndicationCategory category, string version, bool preserveAttributeExtensions, bool preserveElementExtensions, int maxExtensionSize) + internal static async Task ReadCategoryAsync(XmlReaderWrapper reader, SyndicationCategory category, string version, bool preserveAttributeExtensions, bool preserveElementExtensions, int _maxExtensionSize) { - MoveToStartElement(reader); + await MoveToStartElementAsync(reader); bool isEmpty = reader.IsEmptyElement; if (reader.HasAttributes) { while (reader.MoveToNextAttribute()) { - if (reader.LocalName == Atom10Constants.TermTag && reader.NamespaceURI == string.Empty) - { - category.Name = reader.Value; - } - else if (reader.LocalName == Atom10Constants.SchemeTag && reader.NamespaceURI == string.Empty) + string value = await reader.GetValueAsync(); + bool notHandled = false; + + if(reader.NamespaceURI == string.Empty) { - category.Scheme = reader.Value; + switch (reader.LocalName) + { + case Atom10Constants.TermTag: + category.Name = value; + break; + + case Atom10Constants.SchemeTag: + category.Scheme = value; + break; + + case Atom10Constants.LabelTag: + category.Label = value; + break; + + default: + notHandled = true; + break; + } } - else if (reader.LocalName == Atom10Constants.LabelTag && reader.NamespaceURI == string.Empty) + else { - category.Label = reader.Value; + notHandled = true; } - else + + if (notHandled) { string ns = reader.NamespaceURI; string name = reader.LocalName; @@ -154,13 +169,12 @@ namespace Microsoft.ServiceModel.Syndication { continue; } - string val = reader.Value; - if (!TryParseAttribute(name, ns, val, category, version)) + if (!TryParseAttribute(name, ns, value, category, version)) { if (preserveAttributeExtensions) { - category.AttributeExtensions.Add(new XmlQualifiedName(name, ns), val); + category.AttributeExtensions.Add(new XmlQualifiedName(name, ns), value); } } } @@ -169,12 +183,12 @@ namespace Microsoft.ServiceModel.Syndication if (!isEmpty) { - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); XmlBuffer buffer = null; XmlDictionaryWriter extWriter = null; try { - while (reader.IsStartElement()) + while (await reader.IsStartElementAsync()) { if (TryParseElement(reader, category, version)) { @@ -182,13 +196,21 @@ namespace Microsoft.ServiceModel.Syndication } else if (!preserveElementExtensions) { - reader.Skip(); + await reader.SkipAsync(); } else { - CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } } + LoadElementExtensions(buffer, extWriter, category); } finally @@ -198,21 +220,22 @@ namespace Microsoft.ServiceModel.Syndication ((IDisposable)extWriter).Dispose(); } } - reader.ReadEndElement(); + + await reader.ReadEndElementAsync(); } else { - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); } } - internal static TextSyndicationContent ReadTextContentFrom(XmlReaderWrapper reader, string context, bool preserveAttributeExtensions) + internal static async Task ReadTextContentFromAsync(XmlReaderWrapper reader, string context, bool preserveAttributeExtensions) { string type = reader.GetAttribute(Atom10Constants.TypeTag); - return ReadTextContentFromHelper(reader, type, context, preserveAttributeExtensions); + return await ReadTextContentFromHelper(reader, type, context, preserveAttributeExtensions); } - internal static void WriteCategory(XmlWriter writer, SyndicationCategory category, string version) + internal static void WriteCategory(XmlWriter writer, SyndicationCategory category, string version) { writer.WriteStartElement(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace); WriteAttributeExtensions(writer, category, version); @@ -233,58 +256,58 @@ namespace Microsoft.ServiceModel.Syndication writer.WriteEndElement(); } - internal void ReadItemFrom(XmlReaderWrapper reader, SyndicationItem result) + internal async Task ReadItemFrom(XmlReaderWrapper reader, SyndicationItem result) { - ReadItemFrom(reader, result, null); + await ReadItemFromAsync(reader, result, null); } - internal bool TryParseFeedElementFrom(XmlReaderWrapper reader, SyndicationFeed result) + internal async Task TryParseFeedElementFromAsync(XmlReaderWrapper reader, SyndicationFeed result) { - if (reader.IsStartElement(Atom10Constants.AuthorTag, Atom10Constants.Atom10Namespace)) + if (await reader.IsStartElementAsync(Atom10Constants.AuthorTag, Atom10Constants.Atom10Namespace)) { - result.Authors.Add(ReadPersonFrom(reader, result)); + result.Authors.Add(await ReadPersonFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace)) { - result.Categories.Add(ReadCategoryFrom(reader, result)); + result.Categories.Add(await ReadCategoryFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.ContributorTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.ContributorTag, Atom10Constants.Atom10Namespace)) { - result.Contributors.Add(ReadPersonFrom(reader, result)); + result.Contributors.Add(await ReadPersonFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.GeneratorTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.GeneratorTag, Atom10Constants.Atom10Namespace)) { - result.Generator = reader.ReadElementString(); + result.Generator = await reader.ReadElementStringAsync(); } - else if (reader.IsStartElement(Atom10Constants.IdTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.IdTag, Atom10Constants.Atom10Namespace)) { - result.Id = reader.ReadElementString(); + result.Id = await reader.ReadElementStringAsync(); } - else if (reader.IsStartElement(Atom10Constants.LinkTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.LinkTag, Atom10Constants.Atom10Namespace)) { - result.Links.Add(ReadLinkFrom(reader, result)); + result.Links.Add(await ReadLinkFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.LogoTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.LogoTag, Atom10Constants.Atom10Namespace)) { - result.ImageUrl = new Uri(reader.ReadElementString(), UriKind.RelativeOrAbsolute); + result.ImageUrl = new Uri(await reader.ReadElementStringAsync(), UriKind.RelativeOrAbsolute); } - else if (reader.IsStartElement(Atom10Constants.RightsTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.RightsTag, Atom10Constants.Atom10Namespace)) { - result.Copyright = ReadTextContentFrom(reader, "//atom:feed/atom:rights[@type]"); + result.Copyright = await ReadTextContentFromAsync(reader, "//atom:feed/atom:rights[@type]"); } - else if (reader.IsStartElement(Atom10Constants.SubtitleTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.SubtitleTag, Atom10Constants.Atom10Namespace)) { - result.Description = ReadTextContentFrom(reader, "//atom:feed/atom:subtitle[@type]"); + result.Description = await ReadTextContentFromAsync(reader, "//atom:feed/atom:subtitle[@type]"); } - else if (reader.IsStartElement(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) { - result.Title = ReadTextContentFrom(reader, "//atom:feed/atom:title[@type]"); + result.Title = await ReadTextContentFromAsync(reader, "//atom:feed/atom:title[@type]"); } - else if (reader.IsStartElement(Atom10Constants.UpdatedTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.UpdatedTag, Atom10Constants.Atom10Namespace)) { - reader.ReadStartElement(); - result.LastUpdatedTime = DateFromString(reader.ReadString(), reader); - reader.ReadEndElement(); + await reader.ReadStartElementAsync(); + result.LastUpdatedTime = DateFromString(await reader.ReadStringAsync(), reader); + await reader.ReadEndElementAsync(); } else { @@ -293,61 +316,61 @@ namespace Microsoft.ServiceModel.Syndication return true; } - internal bool TryParseItemElementFrom(XmlReaderWrapper reader, SyndicationItem result) + internal async Task TryParseItemElementFromAsync(XmlReaderWrapper reader, SyndicationItem result) { - if (reader.IsStartElement(Atom10Constants.AuthorTag, Atom10Constants.Atom10Namespace)) + if (await reader.IsStartElementAsync(Atom10Constants.AuthorTag, Atom10Constants.Atom10Namespace)) { - result.Authors.Add(ReadPersonFrom(reader, result)); + result.Authors.Add(await ReadPersonFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace)) { - result.Categories.Add(ReadCategoryFrom(reader, result)); + result.Categories.Add(await ReadCategoryFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.ContentTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.ContentTag, Atom10Constants.Atom10Namespace)) { - result.Content = ReadContentFrom(reader, result); + result.Content = await ReadContentFromAsync(reader, result); } - else if (reader.IsStartElement(Atom10Constants.ContributorTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.ContributorTag, Atom10Constants.Atom10Namespace)) { - result.Contributors.Add(ReadPersonFrom(reader, result)); + result.Contributors.Add(await ReadPersonFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.IdTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.IdTag, Atom10Constants.Atom10Namespace)) { - result.Id = reader.ReadElementString(); + result.Id = await reader.ReadElementStringAsync(); } - else if (reader.IsStartElement(Atom10Constants.LinkTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.LinkTag, Atom10Constants.Atom10Namespace)) { - result.Links.Add(ReadLinkFrom(reader, result)); + result.Links.Add(await ReadLinkFromAsync(reader, result)); } - else if (reader.IsStartElement(Atom10Constants.PublishedTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.PublishedTag, Atom10Constants.Atom10Namespace)) { - reader.ReadStartElement(); - result.PublishDate = DateFromString(reader.ReadString(), reader); - reader.ReadEndElement(); + await reader.ReadStartElementAsync(); + result.PublishDate = DateFromString(await reader.ReadStringAsync(), reader); + await reader.ReadEndElementAsync(); } - else if (reader.IsStartElement(Atom10Constants.RightsTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.RightsTag, Atom10Constants.Atom10Namespace)) { - result.Copyright = ReadTextContentFrom(reader, "//atom:feed/atom:entry/atom:rights[@type]"); + result.Copyright = await ReadTextContentFromAsync(reader, "//atom:feed/atom:entry/atom:rights[@type]"); } - else if (reader.IsStartElement(Atom10Constants.SourceFeedTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.SourceFeedTag, Atom10Constants.Atom10Namespace)) { - reader.ReadStartElement(); - result.SourceFeed = ReadFeedFrom(reader, new SyndicationFeed(), true); // isSourceFeed - reader.ReadEndElement(); + await reader.ReadStartElementAsync(); + result.SourceFeed = await ReadFeedFromAsync(reader, new SyndicationFeed(), true); // isSourceFeed + await reader.ReadEndElementAsync(); } - else if (reader.IsStartElement(Atom10Constants.SummaryTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.SummaryTag, Atom10Constants.Atom10Namespace)) { - result.Summary = ReadTextContentFrom(reader, "//atom:feed/atom:entry/atom:summary[@type]"); + result.Summary = await ReadTextContentFromAsync(reader, "//atom:feed/atom:entry/atom:summary[@type]"); } - else if (reader.IsStartElement(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) { - result.Title = ReadTextContentFrom(reader, "//atom:feed/atom:entry/atom:title[@type]"); + result.Title = await ReadTextContentFromAsync(reader, "//atom:feed/atom:entry/atom:title[@type]"); } - else if (reader.IsStartElement(Atom10Constants.UpdatedTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.UpdatedTag, Atom10Constants.Atom10Namespace)) { - reader.ReadStartElement(); - result.LastUpdatedTime = DateFromString(reader.ReadString(), reader); - reader.ReadEndElement(); + await reader.ReadStartElementAsync(); + result.LastUpdatedTime = DateFromString(await reader.ReadStringAsync(), reader); + await reader.ReadEndElementAsync(); } else { @@ -474,7 +497,7 @@ namespace Microsoft.ServiceModel.Syndication return SyndicationFeedFormatter.CreateFeedInstance(_feedType); } - protected virtual SyndicationItem ReadItem(XmlReaderWrapper reader, SyndicationFeed feed) + protected virtual async Task ReadItemAsync(XmlReaderWrapper reader, SyndicationFeed feed) { if (feed == null) { @@ -485,12 +508,11 @@ namespace Microsoft.ServiceModel.Syndication throw new ArgumentNullException("reader"); } SyndicationItem item = CreateItem(feed); - ReadItemFrom(reader, item, feed.BaseUri); + await ReadItemFromAsync(reader, item, feed.BaseUri); return item; } - [SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "2#", Justification = "The out parameter is needed to enable implementations that read in items from the stream on demand")] - protected virtual IEnumerable ReadItems(XmlReaderWrapper reader, SyndicationFeed feed, out bool areAllItemsRead) + protected virtual async Task> ReadItemsAsync(XmlReaderWrapper reader, SyndicationFeed feed) { if (feed == null) { @@ -501,11 +523,11 @@ namespace Microsoft.ServiceModel.Syndication throw new ArgumentNullException("reader"); } NullNotAllowedCollection items = new NullNotAllowedCollection(); - while (reader.IsStartElement(Atom10Constants.EntryTag, Atom10Constants.Atom10Namespace)) + while (await reader.IsStartElementAsync(Atom10Constants.EntryTag, Atom10Constants.Atom10Namespace)) { - items.Add(ReadItem(reader, feed)); + items.Add(await ReadItemAsync(reader, feed)); } - areAllItemsRead = true; + return items; } @@ -528,7 +550,7 @@ namespace Microsoft.ServiceModel.Syndication } } - private static TextSyndicationContent ReadTextContentFromHelper(XmlReaderWrapper reader, string type, string context, bool preserveAttributeExtensions) + private static async Task ReadTextContentFromHelper(XmlReaderWrapper reader, string type, string context, bool preserveAttributeExtensions) { if (string.IsNullOrEmpty(type)) { @@ -568,7 +590,7 @@ namespace Microsoft.ServiceModel.Syndication } if (preserveAttributeExtensions) { - string value = reader.Value; + string value = await reader.GetValueAsync(); if (attrs == null) { attrs = new Dictionary(); @@ -578,7 +600,7 @@ namespace Microsoft.ServiceModel.Syndication } } reader.MoveToElement(); - string val = (kind == TextSyndicationContentKind.XHtml) ? reader.ReadInnerXml() : reader.ReadElementString(); + string val = (kind == TextSyndicationContentKind.XHtml) ? await reader.ReadInnerXmlAsync() : await reader.ReadElementStringAsync(); TextSyndicationContent result = new TextSyndicationContent(val, kind); if (attrs != null) { @@ -643,28 +665,28 @@ namespace Microsoft.ServiceModel.Syndication throw new XmlException(FeedUtils.AddLineInfo(reader, SR.ErrorParsingDateTime)); } - private void ReadCategory(XmlReaderWrapper reader, SyndicationCategory category) + private async Task ReadCategory(XmlReaderWrapper reader, SyndicationCategory category) { - ReadCategory(reader, category, this.Version, this.PreserveAttributeExtensions, this.PreserveElementExtensions, _maxExtensionSize); + await ReadCategoryAsync(reader, category, this.Version, this.PreserveAttributeExtensions, this.PreserveElementExtensions, _maxExtensionSize); } - private SyndicationCategory ReadCategoryFrom(XmlReaderWrapper reader, SyndicationFeed feed) + private async Task ReadCategoryFromAsync(XmlReaderWrapper reader, SyndicationFeed feed) { SyndicationCategory result = CreateCategory(feed); - ReadCategory(reader, result); + await ReadCategory(reader, result); return result; } - private SyndicationCategory ReadCategoryFrom(XmlReaderWrapper reader, SyndicationItem item) + private async Task ReadCategoryFromAsync(XmlReaderWrapper reader, SyndicationItem item) { SyndicationCategory result = CreateCategory(item); - ReadCategory(reader, result); + await ReadCategory(reader, result); return result; } - private SyndicationContent ReadContentFrom(XmlReaderWrapper reader, SyndicationItem item) + private async Task ReadContentFromAsync(XmlReaderWrapper reader, SyndicationItem item) { - MoveToStartElement(reader); + await MoveToStartElementAsync(reader); string type = reader.GetAttribute(Atom10Constants.TypeTag, string.Empty); SyndicationContent result; @@ -704,21 +726,21 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveAttributeExtensions) { - result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), reader.Value); + result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), await reader.GetValueAsync()); } } } } - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); if (!isEmpty) { - reader.ReadEndElement(); + await reader.ReadEndElementAsync(); } return result; } else { - return ReadTextContentFromHelper(reader, type, "//atom:feed/atom:entry/atom:content[@type]", _preserveAttributeExtensions); + return await ReadTextContentFromHelper(reader, type, "//atom:feed/atom:entry/atom:content[@type]", _preserveAttributeExtensions); } } @@ -738,11 +760,11 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.LocalName == "lang" && reader.NamespaceURI == XmlNs) { - result.Language = reader.Value; + result.Language = await reader.GetValueAsync(); } else if (reader.LocalName == "base" && reader.NamespaceURI == XmlNs) { - result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, reader.Value); + result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, await reader.GetValueAsync()); } else { @@ -759,7 +781,7 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveAttributeExtensions) { - result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), reader.Value); + result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), await reader.GetValueAsync()); } } } @@ -779,7 +801,7 @@ namespace Microsoft.ServiceModel.Syndication { while (await reader.IsStartElementAsync()) { - if (TryParseFeedElementFrom(reader, result)) //JERRY MAKE THIS ASYNC + if (await TryParseFeedElementFromAsync(reader, result)) //JERRY MAKE THIS ASYNC { // nothing, we parsed something, great } @@ -790,7 +812,8 @@ namespace Microsoft.ServiceModel.Syndication throw new InvalidOperationException(String.Format(SR.FeedHasNonContiguousItems, this.GetType().ToString())); } - result.Items = ReadItems(reader, result, out areAllItemsRead); // JERRY MAKE THIS ASYNC + result.Items = await ReadItemsAsync(reader, result); ; // JERRY MAKE THIS ASYNC + areAllItemsRead = true; readItemsAtLeastOnce = true; // if the derived class is reading the items lazily, then stop reading from the stream if (!areAllItemsRead) @@ -839,16 +862,16 @@ namespace Microsoft.ServiceModel.Syndication return result; } - private SyndicationFeed ReadFeedFrom(XmlReaderWrapper reader, SyndicationFeed result, bool isSourceFeed) //JERRY REMOVE THIS METHOD AND USE THE ONE ABOVE + private async Task ReadFeedFrom(XmlReaderWrapper reader, SyndicationFeed result, bool isSourceFeed) //JERRY REMOVE THIS METHOD AND USE THE ONE ABOVE { - reader.MoveToContent(); + await reader.MoveToContentAsync(); try { bool elementIsEmpty = false; if (!isSourceFeed) { - MoveToStartElement(reader); + await MoveToStartElementAsync(reader); elementIsEmpty = reader.IsEmptyElement; if (reader.HasAttributes) { @@ -856,11 +879,11 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.LocalName == "lang" && reader.NamespaceURI == XmlNs) { - result.Language = reader.Value; + result.Language = await reader.GetValueAsync(); } else if (reader.LocalName == "base" && reader.NamespaceURI == XmlNs) { - result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, reader.Value); + result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, await reader.GetValueAsync()); } else { @@ -870,7 +893,7 @@ namespace Microsoft.ServiceModel.Syndication { continue; } - string val = reader.Value; + string val = await reader.GetValueAsync(); if (!TryParseAttribute(name, ns, val, result, this.Version)) { if (_preserveAttributeExtensions) @@ -881,7 +904,7 @@ namespace Microsoft.ServiceModel.Syndication } } } - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); } XmlBuffer buffer = null; @@ -893,19 +916,22 @@ namespace Microsoft.ServiceModel.Syndication { try { - while (reader.IsStartElement()) + while (await reader.IsStartElementAsync()) { - if (TryParseFeedElementFrom(reader, result)) + if (await TryParseFeedElementFromAsync(reader, result)) { // nothing, we parsed something, great } - else if (reader.IsStartElement(Atom10Constants.EntryTag, Atom10Constants.Atom10Namespace) && !isSourceFeed) + else if (await reader.IsStartElementAsync(Atom10Constants.EntryTag, Atom10Constants.Atom10Namespace) && !isSourceFeed) { if (readItemsAtLeastOnce) { throw new InvalidOperationException(String.Format(SR.FeedHasNonContiguousItems, this.GetType().ToString())); } - result.Items = ReadItems(reader, result, out areAllItemsRead); + + //result.Items = ReadItems(reader, result, out areAllItemsRead); + result.Items = await ReadItemsAsync(reader, result); + areAllItemsRead = true; readItemsAtLeastOnce = true; // if the derived class is reading the items lazily, then stop reading from the stream if (!areAllItemsRead) @@ -919,11 +945,18 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveElementExtensions) { - CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } @@ -940,7 +973,7 @@ namespace Microsoft.ServiceModel.Syndication } if (!isSourceFeed && areAllItemsRead) { - reader.ReadEndElement(); // feed + await reader.ReadEndElementAsync(); // feed } } catch (FormatException e) @@ -954,12 +987,12 @@ namespace Microsoft.ServiceModel.Syndication return result; } - private void ReadItemFrom(XmlReaderWrapper reader, SyndicationItem result, Uri feedBaseUri) + private async Task ReadItemFromAsync(XmlReaderWrapper reader, SyndicationItem result, Uri feedBaseUri) { try { result.BaseUri = feedBaseUri; - MoveToStartElement(reader); + await MoveToStartElementAsync(reader); bool isEmpty = reader.IsEmptyElement; if (reader.HasAttributes) { @@ -969,14 +1002,16 @@ namespace Microsoft.ServiceModel.Syndication string name = reader.LocalName; if (name == "base" && ns == XmlNs) { - result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, reader.Value); + result.BaseUri = FeedUtils.CombineXmlBase(result.BaseUri, await reader.GetValueAsync()); continue; } + if (FeedUtils.IsXmlns(name, ns) || FeedUtils.IsXmlSchemaType(name, ns)) { continue; } - string val = reader.Value; + + string val = await reader.GetValueAsync(); if (!TryParseAttribute(name, ns, val, result, this.Version)) { if (_preserveAttributeExtensions) @@ -986,16 +1021,17 @@ namespace Microsoft.ServiceModel.Syndication } } } - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); + if (!isEmpty) { XmlBuffer buffer = null; XmlDictionaryWriter extWriter = null; try { - while (reader.IsStartElement()) + while (await reader.IsStartElementAsync()) { - if (TryParseItemElementFrom(reader, result)) + if (await TryParseItemElementFromAsync(reader, result)) { // nothing, we parsed something, great } @@ -1005,11 +1041,18 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveElementExtensions) { - CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } @@ -1023,12 +1066,13 @@ namespace Microsoft.ServiceModel.Syndication ((IDisposable)extWriter).Dispose(); } } - reader.ReadEndElement(); // item + await reader.ReadEndElementAsync(); // item } } catch (FormatException e) { throw new XmlException(FeedUtils.AddLineInfo(reader, SR.ErrorParsingItem), e); + } catch (ArgumentException e) { @@ -1036,7 +1080,7 @@ namespace Microsoft.ServiceModel.Syndication } } - private void ReadLink(XmlReaderWrapper reader, SyndicationLink link, Uri baseUri) + private async Task ReadLinkAsync(XmlReaderWrapper reader, SyndicationLink link, Uri baseUri) { bool isEmpty = reader.IsEmptyElement; string mediaType = null; @@ -1049,37 +1093,84 @@ namespace Microsoft.ServiceModel.Syndication { while (reader.MoveToNextAttribute()) { + bool notHandled = false; if (reader.LocalName == "base" && reader.NamespaceURI == XmlNs) { - link.BaseUri = FeedUtils.CombineXmlBase(link.BaseUri, reader.Value); + link.BaseUri = FeedUtils.CombineXmlBase(link.BaseUri, await reader.GetValueAsync()); } - else if (reader.LocalName == Atom10Constants.TypeTag && reader.NamespaceURI == string.Empty) + else if(reader.NamespaceURI == string.Empty) { - mediaType = reader.Value; - } - else if (reader.LocalName == Atom10Constants.RelativeTag && reader.NamespaceURI == string.Empty) - { - relationship = reader.Value; - } - else if (reader.LocalName == Atom10Constants.TitleTag && reader.NamespaceURI == string.Empty) - { - title = reader.Value; - } - else if (reader.LocalName == Atom10Constants.LengthTag && reader.NamespaceURI == string.Empty) - { - lengthStr = reader.Value; + switch (reader.LocalName) + { + case Atom10Constants.TypeTag: + mediaType = await reader.GetValueAsync(); + break; + + case Atom10Constants.RelativeTag: + relationship = await reader.GetValueAsync(); + break; + + case Atom10Constants.TitleTag: + title = await reader.GetValueAsync(); + break; + + case Atom10Constants.LengthTag: + lengthStr = await reader.GetValueAsync(); + break; + + case Atom10Constants.HrefTag: + val = await reader.GetValueAsync(); + break; + + default: + notHandled = true; + break; + } } - else if (reader.LocalName == Atom10Constants.HrefTag && reader.NamespaceURI == string.Empty) + else { - val = reader.Value; + notHandled = true; } - else if (!FeedUtils.IsXmlns(reader.LocalName, reader.NamespaceURI)) + + if (notHandled && !FeedUtils.IsXmlns(reader.LocalName, reader.NamespaceURI)) { if (_preserveAttributeExtensions) { - link.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), reader.Value); + link.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), await reader.GetValueAsync()); } } + + //if (reader.LocalName == "base" && reader.NamespaceURI == XmlNs) + //{ + // link.BaseUri = FeedUtils.CombineXmlBase(link.BaseUri, await reader.GetValueAsync()); + //} + //else if (reader.LocalName == Atom10Constants.TypeTag && reader.NamespaceURI == string.Empty) + //{ + // mediaType = await reader.GetValueAsync(); + //} + //else if (reader.LocalName == Atom10Constants.RelativeTag && reader.NamespaceURI == string.Empty) + //{ + // relationship = await reader.GetValueAsync(); + //} + //else if (reader.LocalName == Atom10Constants.TitleTag && reader.NamespaceURI == string.Empty) + //{ + // title = await reader.GetValueAsync(); + //} + //else if (reader.LocalName == Atom10Constants.LengthTag && reader.NamespaceURI == string.Empty) + //{ + // lengthStr = await reader.GetValueAsync(); + //} + //else if (reader.LocalName == Atom10Constants.HrefTag && reader.NamespaceURI == string.Empty) + //{ + // val = await reader.GetValueAsync(); + //} + //else if (!FeedUtils.IsXmlns(reader.LocalName, reader.NamespaceURI)) + //{ + // if (_preserveAttributeExtensions) + // { + // link.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), await reader.GetValueAsync()); + // } + //} } } @@ -1088,14 +1179,15 @@ namespace Microsoft.ServiceModel.Syndication { length = Convert.ToInt64(lengthStr, CultureInfo.InvariantCulture.NumberFormat); } - reader.ReadStartElement(); + + await reader.ReadStartElementAsync(); if (!isEmpty) { XmlBuffer buffer = null; XmlDictionaryWriter extWriter = null; try { - while (reader.IsStartElement()) + while (await reader.IsStartElementAsync()) { if (TryParseElement(reader, link, this.Version)) { @@ -1103,11 +1195,18 @@ namespace Microsoft.ServiceModel.Syndication } else if (!_preserveElementExtensions) { - reader.Skip(); + await reader.SkipAsync(); } else { - CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } } LoadElementExtensions(buffer, extWriter, link); @@ -1119,7 +1218,7 @@ namespace Microsoft.ServiceModel.Syndication ((IDisposable)extWriter).Dispose(); } } - reader.ReadEndElement(); + await reader.ReadEndElementAsync(); } link.Length = length; link.MediaType = mediaType; @@ -1128,35 +1227,35 @@ namespace Microsoft.ServiceModel.Syndication link.Uri = (val != null) ? new Uri(val, UriKind.RelativeOrAbsolute) : null; } - private SyndicationLink ReadLinkFrom(XmlReaderWrapper reader, SyndicationFeed feed) + private async Task ReadLinkFromAsync(XmlReaderWrapper reader, SyndicationFeed feed) { SyndicationLink result = CreateLink(feed); - ReadLink(reader, result, feed.BaseUri); + await ReadLinkAsync(reader, result, feed.BaseUri); return result; } - private SyndicationLink ReadLinkFrom(XmlReaderWrapper reader, SyndicationItem item) + private async Task ReadLinkFromAsync(XmlReaderWrapper reader, SyndicationItem item) { SyndicationLink result = CreateLink(item); - ReadLink(reader, result, item.BaseUri); + await ReadLinkAsync(reader, result, item.BaseUri); return result; } - private SyndicationPerson ReadPersonFrom(XmlReaderWrapper reader, SyndicationFeed feed) + private async Task ReadPersonFromAsync(XmlReaderWrapper reader, SyndicationFeed feed) { SyndicationPerson result = CreatePerson(feed); - ReadPersonFrom(reader, result); + await ReadPersonFromAsync(reader, result); return result; } - private SyndicationPerson ReadPersonFrom(XmlReaderWrapper reader, SyndicationItem item) + private async Task ReadPersonFromAsync(XmlReaderWrapper reader, SyndicationItem item) { SyndicationPerson result = CreatePerson(item); - ReadPersonFrom(reader, result); + await ReadPersonFromAsync(reader, result); return result; } - private void ReadPersonFrom(XmlReaderWrapper reader, SyndicationPerson result) + private async Task ReadPersonFromAsync(XmlReaderWrapper reader, SyndicationPerson result) { bool isEmpty = reader.IsEmptyElement; if (reader.HasAttributes) @@ -1169,36 +1268,36 @@ namespace Microsoft.ServiceModel.Syndication { continue; } - string val = reader.Value; + string val = await reader.GetValueAsync(); if (!TryParseAttribute(name, ns, val, result, this.Version)) { if (_preserveAttributeExtensions) { - result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), reader.Value); + result.AttributeExtensions.Add(new XmlQualifiedName(reader.LocalName, reader.NamespaceURI), await reader.GetValueAsync()); } } } } - reader.ReadStartElement(); + await reader.ReadStartElementAsync(); if (!isEmpty) { XmlBuffer buffer = null; XmlDictionaryWriter extWriter = null; try { - while (reader.IsStartElement()) + while (await reader.IsStartElementAsync()) { - if (reader.IsStartElement(Atom10Constants.NameTag, Atom10Constants.Atom10Namespace)) + if (await reader.IsStartElementAsync(Atom10Constants.NameTag, Atom10Constants.Atom10Namespace)) { - result.Name = reader.ReadElementString(); + result.Name = await reader.ReadElementStringAsync(); } - else if (reader.IsStartElement(Atom10Constants.UriTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.UriTag, Atom10Constants.Atom10Namespace)) { - result.Uri = reader.ReadElementString(); + result.Uri = await reader.ReadElementStringAsync(); } - else if (reader.IsStartElement(Atom10Constants.EmailTag, Atom10Constants.Atom10Namespace)) + else if (await reader.IsStartElementAsync(Atom10Constants.EmailTag, Atom10Constants.Atom10Namespace)) { - result.Email = reader.ReadElementString(); + result.Email = await reader.ReadElementStringAsync(); } else { @@ -1206,11 +1305,18 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveElementExtensions) { - CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } @@ -1224,13 +1330,13 @@ namespace Microsoft.ServiceModel.Syndication ((IDisposable)extWriter).Dispose(); } } - reader.ReadEndElement(); + await reader.ReadEndElementAsync(); } } - private TextSyndicationContent ReadTextContentFrom(XmlReaderWrapper reader, string context) + private async Task ReadTextContentFromAsync(XmlReaderWrapper reader, string context) { - return ReadTextContentFrom(reader, context, this.PreserveAttributeExtensions); + return await ReadTextContentFromAsync(reader, context, this.PreserveAttributeExtensions); } private void WriteCategoriesTo(XmlWriter writer, Collection categories) @@ -1360,7 +1466,6 @@ namespace Microsoft.ServiceModel.Syndication } } - [TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] [XmlRoot(ElementName = Atom10Constants.FeedTag, Namespace = Atom10Constants.Atom10Namespace)] public class Atom10FeedFormatter : Atom10FeedFormatter where TSyndicationFeed : SyndicationFeed, new() diff --git a/src/libraries/Atom10ItemFormatter.cs b/src/libraries/Atom10ItemFormatter.cs index 0a63c24..fced1bf 100644 --- a/src/libraries/Atom10ItemFormatter.cs +++ b/src/libraries/Atom10ItemFormatter.cs @@ -109,7 +109,7 @@ namespace Microsoft.ServiceModel.Syndication throw new XmlException(String.Format(SR.UnknownItemXml, reader.LocalName, reader.NamespaceURI)); } - ReadItem(reader); + await ReadItem(reader); } public override void WriteTo(XmlWriter writer) @@ -128,10 +128,10 @@ namespace Microsoft.ServiceModel.Syndication return SyndicationItemFormatter.CreateItemInstance(_itemType); } - private void ReadItem(XmlReader reader) + private async Task ReadItem(XmlReader reader) { SetItem(CreateItemInstance()); - _feedSerializer.ReadItemFrom(XmlReaderWrapper.CreateFromReader(XmlDictionaryReader.CreateDictionaryReader(reader)), this.Item); + await _feedSerializer.ReadItemFrom(XmlReaderWrapper.CreateFromReader(XmlDictionaryReader.CreateDictionaryReader(reader)), this.Item); } private void WriteItem(XmlWriter writer) diff --git a/src/libraries/AtomPub10CategoriesDocumentFormatter.cs b/src/libraries/AtomPub10CategoriesDocumentFormatter.cs index 59585ed..55136ea 100644 --- a/src/libraries/AtomPub10CategoriesDocumentFormatter.cs +++ b/src/libraries/AtomPub10CategoriesDocumentFormatter.cs @@ -8,10 +8,9 @@ namespace Microsoft.ServiceModel.Syndication using Microsoft.ServiceModel.Syndication.Resources; using System; - using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; + using System.Threading.Tasks; using System.Xml; - using System.Xml.Schema; using System.Xml.Serialization; [TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] @@ -79,24 +78,25 @@ namespace Microsoft.ServiceModel.Syndication get { return App10Constants.Namespace; } } - public override bool CanRead(XmlReaderWrapper reader) - { + public override async Task CanReadAsync(XmlReader reader) + { if (reader == null) { throw new ArgumentNullException("reader"); } - return reader.IsStartElement(App10Constants.Categories, App10Constants.Namespace); + XmlReaderWrapper wrappedReader = XmlReaderWrapper.CreateFromReader(reader); + return await wrappedReader.IsStartElementAsync(App10Constants.Categories, App10Constants.Namespace); } - void ReadXml(XmlReaderWrapper reader) + async Task ReadXmlAsync(XmlReaderWrapper reader) { if (reader == null) { throw new ArgumentNullException("reader"); } - ReadDocument(reader); + await ReadDocumentAsync(reader); } void WriteXml(XmlWriter writer) @@ -112,17 +112,18 @@ namespace Microsoft.ServiceModel.Syndication WriteDocument(writer); } - public override void ReadFrom(XmlReaderWrapper reader) + public override async Task ReadFrom(XmlReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } - if (!CanRead(reader)) + if (!await CanReadAsync(reader)) { throw new XmlException(String.Format(SR.UnknownDocumentXml, reader.LocalName, reader.NamespaceURI)); } - ReadDocument(reader); + + await ReadDocumentAsync(XmlReaderWrapper.CreateFromReader(reader)); } public override void WriteTo(XmlWriter writer) @@ -164,11 +165,11 @@ namespace Microsoft.ServiceModel.Syndication } } - private void ReadDocument(XmlReaderWrapper reader) + private async Task ReadDocumentAsync(XmlReaderWrapper reader) { try { - SyndicationFeedFormatter.MoveToStartElement(reader); + await SyndicationFeedFormatter.MoveToStartElementAsync(reader); SetDocument(AtomPub10ServiceDocumentFormatter.ReadCategories(reader, null, delegate () { @@ -182,7 +183,7 @@ namespace Microsoft.ServiceModel.Syndication this.Version, _preserveElementExtensions, _preserveAttributeExtensions, - _maxExtensionSize)); + _maxExtensionSize).Result); } catch (FormatException e) { diff --git a/src/libraries/AtomPub10ServiceDocumentFormatter.cs b/src/libraries/AtomPub10ServiceDocumentFormatter.cs index e10b781..cfa41ee 100644 --- a/src/libraries/AtomPub10ServiceDocumentFormatter.cs +++ b/src/libraries/AtomPub10ServiceDocumentFormatter.cs @@ -9,6 +9,7 @@ namespace Microsoft.ServiceModel.Syndication using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; + using System.Threading.Tasks; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; @@ -61,24 +62,24 @@ namespace Microsoft.ServiceModel.Syndication get { return App10Constants.Namespace; } } - public override bool CanRead(XmlReaderWrapper reader) + public override async Task CanReadAsync(XmlReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } - return reader.IsStartElement(App10Constants.Service, App10Constants.Namespace); - } - + XmlReaderWrapper readerWrapper = XmlReaderWrapper.CreateFromReader(reader); + return await readerWrapper.IsStartElementAsync(App10Constants.Service, App10Constants.Namespace); + } - void ReadXml(XmlReaderWrapper reader) + async Task ReadXml(XmlReaderWrapper reader) { if (reader == null) { throw new ArgumentNullException("reader"); } - ReadDocument(reader); + await ReadDocumentAsync(reader); } void WriteXml(XmlWriter writer) @@ -94,18 +95,22 @@ namespace Microsoft.ServiceModel.Syndication WriteDocument(writer); } - public override void ReadFrom(XmlReaderWrapper reader) + public override async Task ReadFromAsync(XmlReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } - reader.MoveToContent(); - if (!CanRead(reader)) + + XmlReaderWrapper wrappedReader = XmlReaderWrapper.CreateFromReader(reader); + await wrappedReader.MoveToContentAsync(); + + if (!await CanReadAsync(reader)) { throw new XmlException(String.Format(SR.UnknownDocumentXml, reader.LocalName, reader.NamespaceURI)); } - ReadDocument(reader); + + await ReadDocumentAsync(wrappedReader); } public override void WriteTo(XmlWriter writer) @@ -123,19 +128,19 @@ namespace Microsoft.ServiceModel.Syndication writer.WriteEndElement(); } - internal static CategoriesDocument ReadCategories(XmlReaderWrapper reader, Uri baseUri, CreateInlineCategoriesDelegate inlineCategoriesFactory, CreateReferencedCategoriesDelegate referencedCategoriesFactory, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) + internal static async Task ReadCategories(XmlReaderWrapper reader, Uri baseUri, CreateInlineCategoriesDelegate inlineCategoriesFactory, CreateReferencedCategoriesDelegate referencedCategoriesFactory, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) { string link = reader.GetAttribute(App10Constants.Href, string.Empty); if (string.IsNullOrEmpty(link)) { InlineCategoriesDocument inlineCategories = inlineCategoriesFactory(); - ReadInlineCategories(reader, inlineCategories, baseUri, version, preserveElementExtensions, preserveAttributeExtensions, maxExtensionSize); + await ReadInlineCategoriesAsync(reader, inlineCategories, baseUri, version, preserveElementExtensions, preserveAttributeExtensions, maxExtensionSize); return inlineCategories; } else { ReferencedCategoriesDocument referencedCategories = referencedCategoriesFactory(); - ReadReferencedCategories(reader, referencedCategories, baseUri, new Uri(link, UriKind.RelativeOrAbsolute), version, preserveElementExtensions, preserveAttributeExtensions, maxExtensionSize); + await ReadReferencedCategories(reader, referencedCategories, baseUri, new Uri(link, UriKind.RelativeOrAbsolute), version, preserveElementExtensions, preserveAttributeExtensions, maxExtensionSize); return referencedCategories; } } @@ -175,7 +180,7 @@ namespace Microsoft.ServiceModel.Syndication } } - private static void ReadInlineCategories(XmlReaderWrapper reader, InlineCategoriesDocument inlineCategories, Uri baseUri, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) + private static async Task ReadInlineCategoriesAsync(XmlReaderWrapper reader, InlineCategoriesDocument inlineCategories, Uri baseUri, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) { inlineCategories.BaseUri = baseUri; if (reader.HasAttributes) @@ -217,7 +222,7 @@ namespace Microsoft.ServiceModel.Syndication } } } - SyndicationFeedFormatter.MoveToStartElement(reader); + await SyndicationFeedFormatter.MoveToStartElementAsync(reader); bool isEmptyElement = reader.IsEmptyElement; reader.ReadStartElement(); if (!isEmptyElement) @@ -231,7 +236,7 @@ namespace Microsoft.ServiceModel.Syndication if (reader.IsStartElement(Atom10Constants.CategoryTag, Atom10Constants.Atom10Namespace)) { SyndicationCategory category = CreateCategory(inlineCategories); - Atom10FeedFormatter.ReadCategory(reader, category, version, preserveAttributeExtensions, preserveElementExtensions, maxExtensionSize); + await Atom10FeedFormatter.ReadCategoryAsync(reader, category, version, preserveAttributeExtensions, preserveElementExtensions, maxExtensionSize); if (category.Scheme == null) { category.Scheme = inlineCategories.Scheme; @@ -242,11 +247,18 @@ namespace Microsoft.ServiceModel.Syndication { if (preserveElementExtensions) { - SyndicationFeedFormatter.CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } @@ -263,7 +275,7 @@ namespace Microsoft.ServiceModel.Syndication } } - private static void ReadReferencedCategories(XmlReaderWrapper reader, ReferencedCategoriesDocument referencedCategories, Uri baseUri, Uri link, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) + private static async Task ReadReferencedCategories(XmlReaderWrapper reader, ReferencedCategoriesDocument referencedCategories, Uri baseUri, Uri link, string version, bool preserveElementExtensions, bool preserveAttributeExtensions, int maxExtensionSize) { referencedCategories.BaseUri = baseUri; referencedCategories.Link = link; @@ -317,7 +329,14 @@ namespace Microsoft.ServiceModel.Syndication { if (preserveElementExtensions) { - SyndicationFeedFormatter.CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } } } @@ -380,7 +399,7 @@ namespace Microsoft.ServiceModel.Syndication writer.WriteAttributeString("xml", "lang", Atom10FeedFormatter.XmlNs, lang); } - private ResourceCollectionInfo ReadCollection(XmlReaderWrapper reader, Workspace workspace) + private async Task ReadCollection(XmlReaderWrapper reader, Workspace workspace) { ResourceCollectionInfo result = CreateCollection(workspace); result.BaseUri = workspace.BaseUri; @@ -426,7 +445,7 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.IsStartElement(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) { - result.Title = Atom10FeedFormatter.ReadTextContentFrom(reader, "//app:service/app:workspace/app:collection/atom:title[@type]", _preserveAttributeExtensions); + result.Title = await Atom10FeedFormatter.ReadTextContentFromAsync(reader, "//app:service/app:workspace/app:collection/atom:title[@type]", _preserveAttributeExtensions); } else if (reader.IsStartElement(App10Constants.Categories, App10Constants.Namespace)) { @@ -444,7 +463,7 @@ namespace Microsoft.ServiceModel.Syndication this.Version, _preserveElementExtensions, _preserveAttributeExtensions, - _maxExtensionSize)); + _maxExtensionSize).Result); } else if (reader.IsStartElement(App10Constants.Accept, App10Constants.Namespace)) { @@ -454,7 +473,14 @@ namespace Microsoft.ServiceModel.Syndication { if (_preserveElementExtensions) { - SyndicationFeedFormatter.CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { @@ -475,12 +501,12 @@ namespace Microsoft.ServiceModel.Syndication return result; } - private void ReadDocument(XmlReaderWrapper reader) + private async Task ReadDocumentAsync(XmlReaderWrapper reader) { ServiceDocument result = CreateDocumentInstance(); try { - SyndicationFeedFormatter.MoveToStartElement(reader); + await SyndicationFeedFormatter.MoveToStartElementAsync(reader); bool elementIsEmpty = reader.IsEmptyElement; if (reader.HasAttributes) { @@ -525,17 +551,24 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.IsStartElement(App10Constants.Workspace, App10Constants.Namespace)) { - result.Workspaces.Add(ReadWorkspace(reader, result)); + result.Workspaces.Add(ReadWorkspace(reader, result).Result); } else if (!TryParseElement(reader, result, this.Version)) { if (_preserveElementExtensions) { - SyndicationFeedFormatter.CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } @@ -562,7 +595,7 @@ namespace Microsoft.ServiceModel.Syndication SetDocument(result); } - private Workspace ReadWorkspace(XmlReaderWrapper reader, ServiceDocument document) + private async Task ReadWorkspace(XmlReaderWrapper reader, ServiceDocument document) { Workspace result = CreateWorkspace(document); result.BaseUri = document.BaseUri; @@ -604,21 +637,28 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.IsStartElement(Atom10Constants.TitleTag, Atom10Constants.Atom10Namespace)) { - result.Title = Atom10FeedFormatter.ReadTextContentFrom(reader, "//app:service/app:workspace/atom:title[@type]", _preserveAttributeExtensions); + result.Title = await Atom10FeedFormatter.ReadTextContentFromAsync(reader, "//app:service/app:workspace/atom:title[@type]", _preserveAttributeExtensions); } else if (reader.IsStartElement(App10Constants.Collection, App10Constants.Namespace)) { - result.Collections.Add(ReadCollection(reader, result)); + result.Collections.Add(ReadCollection(reader, result).Result); } else if (!TryParseElement(reader, result, this.Version)) { if (_preserveElementExtensions) { - SyndicationFeedFormatter.CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); + if (buffer == null) + { + buffer = new XmlBuffer(_maxExtensionSize); + extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + } + + await XmlReaderWrapper.WriteNodeAsync(extWriter, reader, false); } else { - reader.Skip(); + await reader.SkipAsync(); } } } diff --git a/src/libraries/CategoriesDocumentFormatter.cs b/src/libraries/CategoriesDocumentFormatter.cs index 2353c1f..af8b925 100644 --- a/src/libraries/CategoriesDocumentFormatter.cs +++ b/src/libraries/CategoriesDocumentFormatter.cs @@ -7,10 +7,9 @@ namespace Microsoft.ServiceModel.Syndication using System; using System.Runtime.CompilerServices; using System.Runtime.Serialization; + using System.Threading.Tasks; using System.Xml; - [TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] - [DataContract] public abstract class CategoriesDocumentFormatter { private CategoriesDocument _document; @@ -35,8 +34,8 @@ namespace Microsoft.ServiceModel.Syndication public abstract string Version { get; } - public abstract bool CanRead(XmlReaderWrapper reader); - public abstract void ReadFrom(XmlReaderWrapper reader); + public abstract Task CanReadAsync(XmlReader reader); + public abstract Task ReadFrom(XmlReader reader); public abstract void WriteTo(XmlWriter writer); protected virtual InlineCategoriesDocument CreateInlineCategoriesDocument() diff --git a/src/libraries/Rss20FeedFormatter.cs b/src/libraries/Rss20FeedFormatter.cs index beebe6c..a9f714b 100644 --- a/src/libraries/Rss20FeedFormatter.cs +++ b/src/libraries/Rss20FeedFormatter.cs @@ -409,7 +409,7 @@ namespace Microsoft.ServiceModel.Syndication if (notHandled) { - bool parsedExtension = _serializeExtensionsAsAtom && _atomSerializer.TryParseItemElementFrom(reader, result); + bool parsedExtension = _serializeExtensionsAsAtom && _atomSerializer.TryParseItemElementFromAsync(reader, result).Result; if (!parsedExtension) { @@ -671,7 +671,7 @@ namespace Microsoft.ServiceModel.Syndication { if (reader.LocalName == "base" && reader.NamespaceURI == Atom10FeedFormatter.XmlNs) { - link.BaseUri = FeedUtils.CombineXmlBase(link.BaseUri, reader.Value); + link.BaseUri = FeedUtils.CombineXmlBase(link.BaseUri, await reader.GetValueAsync()); } else if (!FeedUtils.IsXmlns(reader.LocalName, reader.NamespaceURI)) { @@ -1199,7 +1199,7 @@ namespace Microsoft.ServiceModel.Syndication if (notHandled) { - bool parsedExtension = _serializeExtensionsAsAtom && _atomSerializer.TryParseFeedElementFrom(reader, result); + bool parsedExtension = _serializeExtensionsAsAtom && await _atomSerializer.TryParseFeedElementFromAsync(reader, result); if (!parsedExtension) { @@ -1247,179 +1247,7 @@ namespace Microsoft.ServiceModel.Syndication } } - //private void ReadXml(XmlReaderWrapper reader, SyndicationFeed result) - //{ - // try - // { - // string baseUri = null; - // reader.MoveToContent(); - // string version = reader.GetAttribute(Rss20Constants.VersionTag, Rss20Constants.Rss20Namespace); - // if (version != Rss20Constants.Version) - // { - // throw new NotSupportedException(FeedUtils.AddLineInfo(reader, (String.Format(SR.UnsupportedRssVersion, version)))); - // } - // if (reader.AttributeCount > 1) - // { - // string tmp = reader.GetAttribute("base", Atom10FeedFormatter.XmlNs); - // if (!string.IsNullOrEmpty(tmp)) - // { - // baseUri = tmp; - // } - // } - // reader.ReadStartElement(); - // reader.MoveToContent(); - // if (reader.HasAttributes) - // { - // while (reader.MoveToNextAttribute()) - // { - // string ns = reader.NamespaceURI; - // string name = reader.LocalName; - // if (name == "base" && ns == Atom10FeedFormatter.XmlNs) - // { - // baseUri = reader.Value; - // continue; - // } - // if (FeedUtils.IsXmlns(name, ns) || FeedUtils.IsXmlSchemaType(name, ns)) - // { - // continue; - // } - // string val = reader.Value; - // if (!TryParseAttribute(name, ns, val, result, this.Version)) - // { - // if (_preserveAttributeExtensions) - // { - // result.AttributeExtensions.Add(new XmlQualifiedName(name, ns), val); - // } - // } - // } - // } - // if (!string.IsNullOrEmpty(baseUri)) - // { - // result.BaseUri = new Uri(baseUri, UriKind.RelativeOrAbsolute); - // } - // bool areAllItemsRead = true; - // bool readItemsAtLeastOnce = false; - // reader.ReadStartElement(Rss20Constants.ChannelTag, Rss20Constants.Rss20Namespace); - - // XmlBuffer buffer = null; - // XmlDictionaryWriter extWriter = null; - // try - // { - // while (reader.IsStartElement()) - // { - // string s = reader.Value + " " + reader.Name; - // if (reader.IsStartElement(Rss20Constants.TitleTag, Rss20Constants.Rss20Namespace)) - // { - // result.Title = TitleParser(reader); - // } - // else if (reader.IsStartElement(Rss20Constants.LinkTag, Rss20Constants.Rss20Namespace)) - // { - // //result.Links.Add(ReadAlternateLink(reader, result.BaseUri)); - // result.Links.Add(OnReadLink(reader, result.BaseUri)); - // } - // else if (reader.IsStartElement(Rss20Constants.DescriptionTag, Rss20Constants.Rss20Namespace)) - // { - // result.Description = DescriptionParser(reader); - // } - // else if (reader.IsStartElement(Rss20Constants.LanguageTag, Rss20Constants.Rss20Namespace)) - // { - // result.Language = LanguageParser(reader); - // } - // else if (reader.IsStartElement(Rss20Constants.CopyrightTag, Rss20Constants.Rss20Namespace)) - // { - // result.Copyright = CopyrightParser(reader); - // } - // else if (reader.IsStartElement(Rss20Constants.ManagingEditorTag, Rss20Constants.Rss20Namespace)) - // { - // //result.Authors.Add(ReadPerson(reader, result)); //original - // result.Authors.Add(ManagingEditorParser(reader, result)); - // } - // else if (reader.IsStartElement(Rss20Constants.LastBuildDateTag, Rss20Constants.Rss20Namespace)) - // { - // //The code below is now handled by a delegate in CustomParsers - // bool canReadContent = !reader.IsEmptyElement; - // reader.ReadStartElement(); - // if (canReadContent) - // { - // string str = reader.ReadString(); - // if (!string.IsNullOrEmpty(str)) - // { - // result.LastUpdatedTime = DateParser(str, reader); // <<=== here | original DateFromString(str, reader); - // } - // reader.ReadEndElement(); - // } - // } - // else if (reader.IsStartElement(Rss20Constants.CategoryTag, Rss20Constants.Rss20Namespace)) - // { - // result.Categories.Add(ReadCategory(reader, result)); - // } - // else if (reader.IsStartElement(Rss20Constants.GeneratorTag, Rss20Constants.Rss20Namespace)) - // { - // result.Generator = GeneratorParser(reader); - // } - // else if (reader.IsStartElement(Rss20Constants.ImageTag, Rss20Constants.Rss20Namespace)) - // { - // ImageParser(reader, result); - // } - // else if (reader.IsStartElement(Rss20Constants.ItemTag, Rss20Constants.Rss20Namespace)) - // { - // if (readItemsAtLeastOnce) - // { - // throw new InvalidOperationException(String.Format(SR.FeedHasNonContiguousItems, this.GetType().ToString())); - // } - - // result.Items = ReadItems(reader, result, out areAllItemsRead); - // readItemsAtLeastOnce = true; - // // if the derived class is reading the items lazily, then stop reading from the stream - // if (!areAllItemsRead) - // { - // break; - // } - // } - // else - // { - // bool parsedExtension = _serializeExtensionsAsAtom && _atomSerializer.TryParseFeedElementFrom(reader, result); - // if (!parsedExtension) - // { - // parsedExtension = TryParseElement(reader, result, this.Version); - // } - // if (!parsedExtension) - // { - // if (_preserveElementExtensions) - // { - // CreateBufferIfRequiredAndWriteNode(ref buffer, ref extWriter, reader, _maxExtensionSize); - // } - // else - // { - // reader.Skip(); - // } - // } - // } - // } - // LoadElementExtensions(buffer, extWriter, result); - // } - // finally - // { - // if (extWriter != null) - // { - // ((IDisposable)extWriter).Dispose(); - // } - // } - // if (areAllItemsRead) - // { - // reader.ReadEndElement(); // channel - // reader.ReadEndElement(); // rss - // } - // } - // catch (FormatException e) - // { - // new XmlException(FeedUtils.AddLineInfo(reader, SR.ErrorParsingFeed), e); - // } - // catch (ArgumentException e) - // { - // new XmlException(FeedUtils.AddLineInfo(reader, SR.ErrorParsingFeed), e); - // } - //} + private void WriteAlternateLink(XmlWriter writer, SyndicationLink link, Uri baseUri) { diff --git a/src/libraries/ServiceDocument.cs b/src/libraries/ServiceDocument.cs index 06e0889..219e02d 100644 --- a/src/libraries/ServiceDocument.cs +++ b/src/libraries/ServiceDocument.cs @@ -77,7 +77,7 @@ namespace Microsoft.ServiceModel.Syndication where TServiceDocument : ServiceDocument, new() { AtomPub10ServiceDocumentFormatter formatter = new AtomPub10ServiceDocumentFormatter(); - formatter.ReadFrom(reader); + formatter.ReadFromAsync(reader); return (TServiceDocument)(object)formatter.Document; } diff --git a/src/libraries/ServiceDocumentFormatter.cs b/src/libraries/ServiceDocumentFormatter.cs index 5fc46d8..67632ce 100644 --- a/src/libraries/ServiceDocumentFormatter.cs +++ b/src/libraries/ServiceDocumentFormatter.cs @@ -7,6 +7,7 @@ namespace Microsoft.ServiceModel.Syndication using System; using System.Runtime.CompilerServices; using System.Runtime.Serialization; + using System.Threading.Tasks; using System.Xml; [TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] @@ -35,8 +36,8 @@ namespace Microsoft.ServiceModel.Syndication public abstract string Version { get; } - public abstract bool CanRead(XmlReaderWrapper reader); - public abstract void ReadFrom(XmlReaderWrapper reader); + public abstract Task CanReadAsync(XmlReader reader); + public abstract Task ReadFromAsync(XmlReader reader); public abstract void WriteTo(XmlWriter writer); internal static void LoadElementExtensions(XmlBuffer buffer, XmlDictionaryWriter writer, CategoriesDocument categories) @@ -116,40 +117,44 @@ namespace Microsoft.ServiceModel.Syndication return document.CreateWorkspace(); } - protected static void LoadElementExtensions(XmlReaderWrapper reader, CategoriesDocument categories, int maxExtensionSize) + protected static void LoadElementExtensions(XmlReader reader, CategoriesDocument categories, int maxExtensionSize) { if (categories == null) { throw new ArgumentNullException("categories"); } - categories.LoadElementExtensions(reader, maxExtensionSize); + + categories.LoadElementExtensions(XmlReaderWrapper.CreateFromReader(reader), maxExtensionSize); } - protected static void LoadElementExtensions(XmlReaderWrapper reader, ResourceCollectionInfo collection, int maxExtensionSize) + protected static void LoadElementExtensions(XmlReader reader, ResourceCollectionInfo collection, int maxExtensionSize) { if (collection == null) { throw new ArgumentNullException("collection"); } - collection.LoadElementExtensions(reader, maxExtensionSize); + + collection.LoadElementExtensions(XmlReaderWrapper.CreateFromReader(reader), maxExtensionSize); } - protected static void LoadElementExtensions(XmlReaderWrapper reader, Workspace workspace, int maxExtensionSize) + protected static void LoadElementExtensions(XmlReader reader, Workspace workspace, int maxExtensionSize) { if (workspace == null) { throw new ArgumentNullException("workspace"); } - workspace.LoadElementExtensions(reader, maxExtensionSize); + + workspace.LoadElementExtensions(XmlReaderWrapper.CreateFromReader(reader), maxExtensionSize); } - protected static void LoadElementExtensions(XmlReaderWrapper reader, ServiceDocument document, int maxExtensionSize) + protected static void LoadElementExtensions(XmlReader reader, ServiceDocument document, int maxExtensionSize) { if (document == null) { throw new ArgumentNullException("document"); } - document.LoadElementExtensions(reader, maxExtensionSize); + + document.LoadElementExtensions(XmlReaderWrapper.CreateFromReader(reader), maxExtensionSize); } protected static bool TryParseAttribute(string name, string ns, string value, ServiceDocument document, string version) @@ -158,6 +163,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("document"); } + return document.TryParseAttribute(name, ns, value, version); } @@ -167,6 +173,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("collection"); } + return collection.TryParseAttribute(name, ns, value, version); } @@ -176,6 +183,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("categories"); } + return categories.TryParseAttribute(name, ns, value, version); } @@ -185,43 +193,48 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("workspace"); } + return workspace.TryParseAttribute(name, ns, value, version); } - protected static bool TryParseElement(XmlReaderWrapper reader, ResourceCollectionInfo collection, string version) + protected static bool TryParseElement(XmlReader reader, ResourceCollectionInfo collection, string version) { if (collection == null) { throw new ArgumentNullException("collection"); } - return collection.TryParseElement(reader, version); + + return collection.TryParseElement(XmlReaderWrapper.CreateFromReader(reader), version); } - protected static bool TryParseElement(XmlReaderWrapper reader, ServiceDocument document, string version) + protected static bool TryParseElement(XmlReader reader, ServiceDocument document, string version) { if (document == null) { throw new ArgumentNullException("document"); } - return document.TryParseElement(reader, version); + + return document.TryParseElement(XmlReaderWrapper.CreateFromReader(reader), version); } - protected static bool TryParseElement(XmlReaderWrapper reader, Workspace workspace, string version) + protected static bool TryParseElement(XmlReader reader, Workspace workspace, string version) { if (workspace == null) { throw new ArgumentNullException("workspace"); } - return workspace.TryParseElement(reader, version); + + return workspace.TryParseElement(XmlReaderWrapper.CreateFromReader(reader), version); } - protected static bool TryParseElement(XmlReaderWrapper reader, CategoriesDocument categories, string version) + protected static bool TryParseElement(XmlReader reader, CategoriesDocument categories, string version) { if (categories == null) { throw new ArgumentNullException("categories"); } - return categories.TryParseElement(reader, version); + + return categories.TryParseElement(XmlReaderWrapper.CreateFromReader(reader), version); } protected static void WriteAttributeExtensions(XmlWriter writer, ServiceDocument document, string version) @@ -230,6 +243,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("document"); } + document.WriteAttributeExtensions(writer, version); } @@ -239,6 +253,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("workspace"); } + workspace.WriteAttributeExtensions(writer, version); } @@ -248,6 +263,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("collection"); } + collection.WriteAttributeExtensions(writer, version); } @@ -257,6 +273,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("categories"); } + categories.WriteAttributeExtensions(writer, version); } @@ -266,6 +283,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("document"); } + document.WriteElementExtensions(writer, version); } @@ -275,6 +293,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("workspace"); } + workspace.WriteElementExtensions(writer, version); } @@ -284,6 +303,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("collection"); } + collection.WriteElementExtensions(writer, version); } @@ -293,6 +313,7 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("categories"); } + categories.WriteElementExtensions(writer, version); } diff --git a/src/libraries/SyndicationFeedFormatter.cs b/src/libraries/SyndicationFeedFormatter.cs index ad81c34..f00c0b3 100644 --- a/src/libraries/SyndicationFeedFormatter.cs +++ b/src/libraries/SyndicationFeedFormatter.cs @@ -365,29 +365,26 @@ namespace Microsoft.ServiceModel.Syndication { throw new ArgumentNullException("person"); } + person.WriteElementExtensions(writer, version); } internal protected virtual void SetFeed(SyndicationFeed feed) { - if (feed == null) - { - throw new ArgumentNullException("feed"); - } - _feed = feed; + _feed = feed ?? throw new ArgumentNullException("feed"); } - internal static async Task CloseBufferAsync(XmlBuffer buffer, XmlDictionaryWriter extWriter) - { - if (buffer == null) - { - return; - } + //internal static async Task CloseBufferAsync(XmlBuffer buffer, extWriter) + //{ + // if (buffer == null) + // { + // return; + // } - await extWriter.WriteEndElementAsync(); - buffer.CloseSection(); - buffer.Close(); - } + // await extWriter.WriteEndElementAsync(); // the method is not implemented + // buffer.CloseSection(); + // buffer.Close(); + //} internal static void CloseBuffer(XmlBuffer buffer, XmlDictionaryWriter extWriter) { @@ -401,17 +398,17 @@ namespace Microsoft.ServiceModel.Syndication buffer.Close(); } - internal static void CreateBufferIfRequiredAndWriteNode(ref XmlBuffer buffer, ref XmlDictionaryWriter extWriter, XmlReaderWrapper reader, int maxExtensionSize) - { - //JERRY REMOVE THIS METHOD AND USE PATTERN THAT I USED IN Rss20FeedFormatter. - if (buffer == null) - { - buffer = new XmlBuffer(maxExtensionSize); - extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); - extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); - } - extWriter.WriteNode(reader, false); - } + //internal static void CreateBufferIfRequiredAndWriteNode(ref XmlBuffer buffer, ref XmlDictionaryWriter extWriter, XmlReaderWrapper reader, int maxExtensionSize) + //{ + // //JERRY REMOVE THIS METHOD AND USE PATTERN THAT I USED IN Rss20FeedFormatter. + // if (buffer == null) + // { + // buffer = new XmlBuffer(maxExtensionSize); + // extWriter = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); + // extWriter.WriteStartElement(Rss20Constants.ExtensionWrapperTag); + // } + // extWriter.WriteNode(reader, false); + //} internal static SyndicationFeed CreateFeedInstance(Type feedType) { @@ -425,9 +422,23 @@ namespace Microsoft.ServiceModel.Syndication } } + //internal static void LoadElementExtensions(XmlBuffer buffer, XmlDictionaryWriter writer, SyndicationFeed feed) + //{ + // //JERRY MAKE THIS METHOD FULLY ASYNC AND TEST IT OUT. Rename and add Async postfix. + // if (feed == null) + // { + // throw new ArgumentNullException("feed"); + // } + + // CloseBuffer(buffer, writer); + // feed.LoadElementExtensions(buffer); + //} + + + internal static void LoadElementExtensions(XmlBuffer buffer, XmlDictionaryWriter writer, SyndicationFeed feed) { - //JERRY MAKE THIS METHOD FULLY ASYNC AND TEST IT OUT. Rename and add Async postfix. + //JERRY MAKE THIS METHOD FULLY ASYNC AND TEST IT OUT. Rename and add Async postfix. --- ?? if (feed == null) { throw new ArgumentNullException("feed"); @@ -437,6 +448,7 @@ namespace Microsoft.ServiceModel.Syndication feed.LoadElementExtensions(buffer); } + internal static void LoadElementExtensions(XmlBuffer buffer, XmlDictionaryWriter writer, SyndicationItem item) { //JERRY MAKE THIS METHOD FULLY ASYNC AND TEST IT OUT. Rename and add Async postfix. @@ -491,7 +503,7 @@ namespace Microsoft.ServiceModel.Syndication } } - internal static void MoveToStartElement(XmlReader reader)//JERRY REMOVE + internal static void MoveToStartElement(XmlReader reader)//JERRY REMOVE ======== used in constructor and out { if (!reader.IsStartElement()) { diff --git a/src/libraries/XmlReaderWrapper.cs b/src/libraries/XmlReaderWrapper.cs index d9f8dc7..41a5835 100644 --- a/src/libraries/XmlReaderWrapper.cs +++ b/src/libraries/XmlReaderWrapper.cs @@ -4,7 +4,7 @@ using System.Xml; namespace Microsoft.ServiceModel.Syndication { - public class XmlReaderWrapper : XmlReader + internal class XmlReaderWrapper : XmlReader { private XmlReader reader; @@ -19,6 +19,7 @@ namespace Microsoft.ServiceModel.Syndication private Func> isStartElementFunc2; private Func skipFunc; private Func> readFunc; + private Func> readInnerXmlFunc; private XmlReaderWrapper(XmlReader reader) { @@ -59,6 +60,7 @@ namespace Microsoft.ServiceModel.Syndication this.isStartElementFunc2 = new Func>(async (localname, ns) => { return await IsStartElementAsync(this.reader, localname, ns); }); this.skipFunc = new Func(async () => { await this.reader.SkipAsync(); }); this.readFunc = new Func>(async () => { return await this.reader.ReadAsync(); }); + this.readInnerXmlFunc = new Func>(async () => { return await this.ReadInnerXmlAsync(); }); } private void Init() @@ -74,6 +76,7 @@ namespace Microsoft.ServiceModel.Syndication this.isStartElementFunc2 = new Func>((localname, ns) => { return Task.FromResult(this.reader.IsStartElement(localname, ns)); }); this.skipFunc = new Func(() => { this.reader.Skip(); return Task.CompletedTask; }); this.readFunc = new Func>(() => { return Task.FromResult(this.reader.Read()); }); + this.readInnerXmlFunc = new Func>(() => { return Task.FromResult(this.reader.ReadInnerXml()); }); } public override XmlNodeType NodeType @@ -286,7 +289,10 @@ namespace Microsoft.ServiceModel.Syndication { return this.readFunc(); } - + public override Task ReadInnerXmlAsync() + { + return readInnerXmlFunc(); + } private static async Task ReadStartElementAsync(XmlReader reader) { if (await reader.MoveToContentAsync() != XmlNodeType.Element) @@ -560,5 +566,7 @@ namespace Microsoft.ServiceModel.Syndication } } while (await reader.ReadAsync() && (d < reader.Depth || (d == reader.Depth && reader.NodeType == XmlNodeType.EndElement))); } + + } } diff --git a/src/libraries/tests/BasicScenarioTests.cs b/src/libraries/tests/BasicScenarioTests.cs index e08e1e0..fc3e427 100644 --- a/src/libraries/tests/BasicScenarioTests.cs +++ b/src/libraries/tests/BasicScenarioTests.cs @@ -12,6 +12,7 @@ namespace Microsoft.ServiceModel.Syndication.Tests using Microsoft.ServiceModel.Syndication; using System.Xml; using System.IO; + using System.Threading.Tasks; public static class BasicScenarioTests { @@ -46,7 +47,7 @@ namespace Microsoft.ServiceModel.Syndication.Tests } [Fact] - public static void SyndicationFeed_Load_Write_Feed() + public static void SyndicationFeed_Load_Write_RSS_Feed() { string path = "SyndicationFeed-Load-Write.xml"; @@ -74,7 +75,34 @@ namespace Microsoft.ServiceModel.Syndication.Tests } } + [Fact] + public static void SyndicationFeed_Load_Write_Atom_Feed() + { + string path = "SyndicationFeed-Load-Write-Atom.xml"; + + try + { + // *** SETUP *** \\\ + XmlReader xmlr = XmlReader.Create(@"TestFeeds\SimpleAtomFeed.xml"); + SyndicationFeed sf = SyndicationFeed.Load(xmlr); + Assert.True(sf != null); + + // *** EXECUTE *** \\ + //Write the same feed that was read. + XmlWriter xmlw = XmlWriter.Create(path); + Atom10FeedFormatter atomFeed = new Atom10FeedFormatter(sf); + atomFeed.WriteTo(xmlw); + xmlw.Close(); + // *** VALIDATE *** \\ + Assert.True(File.Exists(path)); + } + finally + { + // *** CLEANUP *** \\ + File.Delete(path); + } + } [Fact] public static void SyndicationFeed_Write_RSS_Atom() { @@ -130,8 +158,8 @@ namespace Microsoft.ServiceModel.Syndication.Tests finally { // *** CLEANUP *** \\ - File.Delete(RssPath); - File.Delete(AtomPath); + //File.Delete(RssPath); + //File.Delete(AtomPath); } } @@ -244,6 +272,30 @@ namespace Microsoft.ServiceModel.Syndication.Tests File.Delete(resultPath); } } + + + [Fact] + public static void SyndicationFeed_RSS20_Atom10_AsyncTest() + { + test().Wait(); + } + + public static async Task test() { + + XmlReaderSettings setting = new XmlReaderSettings(); + setting.Async = true; + XmlReader reader = XmlReader.Create(@"TestFeeds\SimpleAtomFeed.xml",setting); + XmlReader reader2 = XmlReader.Create(@"TestFeeds\SimpleRssFeed.xml", setting); + + + Task atom = SyndicationFeed.LoadAsync(reader); + Task rss = SyndicationFeed.LoadAsync(reader2); + + await Task.WhenAll(atom, rss); + + Assert.True(atom.Result.Items != null); + Assert.True(rss.Result.Items != null); + } } } diff --git a/src/libraries/tests/Microsoft.ServiceModel.Syndication.Tests.csproj b/src/libraries/tests/Microsoft.ServiceModel.Syndication.Tests.csproj index 71ca132..446b1a5 100644 --- a/src/libraries/tests/Microsoft.ServiceModel.Syndication.Tests.csproj +++ b/src/libraries/tests/Microsoft.ServiceModel.Syndication.Tests.csproj @@ -30,6 +30,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/libraries/tests/TestFeeds/RssFeedWithCustomImageName.xml b/src/libraries/tests/TestFeeds/RssFeedWithCustomImageName.xml index 7cdcafc..4b5b96f 100644 --- a/src/libraries/tests/TestFeeds/RssFeedWithCustomImageName.xml +++ b/src/libraries/tests/TestFeeds/RssFeedWithCustomImageName.xml @@ -4,7 +4,12 @@ Contoso News http://www.Contoso.com/news <div>Most recent news from Contoso</div> + en-us + Mon, 19 Jun 2017 11:52:39 -0700 jerry@Contoso.com + Newspaperts + SyndicationFeed Feature + Mon, 19 Jun 2017 11:52:39 -0700 http://2.bp.blogspot.com/-NA5Jb-64eUg/URx8CSdcj_I/AAAAAAAAAUo/eCx0irI0rq0/s1600/bg_Contoso_logo3-20120824073001907469-620x349.jpg @@ -17,6 +22,9 @@ http://Contoso.com/news/path SyndicationFeed released for .net Core A lot of text describing the release of .net core feature + Contoso Item author + Item Category + Mon, 19 Jun 2017 11:52:39 -0700 \ No newline at end of file diff --git a/src/libraries/tests/TestFeeds/SimpleAtomFeed.xml b/src/libraries/tests/TestFeeds/SimpleAtomFeed.xml new file mode 100644 index 0000000..824f2ba --- /dev/null +++ b/src/libraries/tests/TestFeeds/SimpleAtomFeed.xml @@ -0,0 +1,20 @@ + + + Contoso News + <div>Most recent news from Contoso</div> + 123FeedID + 2017-06-26T14:41:43-07:00 + http://2.bp.blogspot.com/-NA5Jb-64eUg/URx8CSdcj_I/AAAAAAAAAUo/eCx0irI0rq0/s1600/bg_Contoso_logo3-20120824073001907469-620x349.jpg + + jerry@Contoso.com + + + asd + + uuid:71d91f91-f5f9-4175-9065-4b7cb357fc4d;id=1 + SyndicationFeed released for .net Core + 2017-06-26T21:41:43Z + + A lot of text describing the release of .net core feature + + \ No newline at end of file diff --git a/src/libraries/tests/TestFeeds/SimpleRssFeed.xml b/src/libraries/tests/TestFeeds/SimpleRssFeed.xml index ab61a2d..9115414 100644 --- a/src/libraries/tests/TestFeeds/SimpleRssFeed.xml +++ b/src/libraries/tests/TestFeeds/SimpleRssFeed.xml @@ -4,12 +4,17 @@ Contoso News http://www.Contoso.com/news <div>Most recent news from Contoso</div> + en-us + Mon, 19 Jun 2017 11:52:39 -0700 jerry@Contoso.com + Newspaperts + SyndicationFeed Feature + Mon, 19 Jun 2017 11:52:39 -0700 http://2.bp.blogspot.com/-NA5Jb-64eUg/URx8CSdcj_I/AAAAAAAAAUo/eCx0irI0rq0/s1600/bg_Contoso_logo3-20120824073001907469-620x349.jpg - Contoso News - http://www.Contoso.com/news + The title is not the same to the original one + http://www.contoso.com/notnews 123FeedID asd @@ -17,6 +22,9 @@ http://Contoso.com/news/path SyndicationFeed released for .net Core A lot of text describing the release of .net core feature + Contoso Item author + Item Category + Mon, 19 Jun 2017 11:52:39 -0700 \ No newline at end of file