e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
275 lines
9.7 KiB
C#
275 lines
9.7 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Syndication
|
|
{
|
|
using System.Collections.ObjectModel;
|
|
using System.Runtime;
|
|
using System.Runtime.Serialization;
|
|
using System.Xml;
|
|
using System.Xml.Serialization;
|
|
using System.Runtime.CompilerServices;
|
|
|
|
// sealed because the ctor results in a call to the virtual InsertItem method
|
|
[TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
|
|
public sealed class SyndicationElementExtensionCollection : Collection<SyndicationElementExtension>
|
|
{
|
|
XmlBuffer buffer;
|
|
bool initialized;
|
|
|
|
internal SyndicationElementExtensionCollection()
|
|
: this((XmlBuffer) null)
|
|
{
|
|
}
|
|
|
|
internal SyndicationElementExtensionCollection(XmlBuffer buffer)
|
|
: base()
|
|
{
|
|
this.buffer = buffer;
|
|
if (this.buffer != null)
|
|
{
|
|
PopulateElements();
|
|
}
|
|
initialized = true;
|
|
}
|
|
|
|
internal SyndicationElementExtensionCollection(SyndicationElementExtensionCollection source)
|
|
: base()
|
|
{
|
|
this.buffer = source.buffer;
|
|
for (int i = 0; i < source.Items.Count; ++i)
|
|
{
|
|
base.Add(source.Items[i]);
|
|
}
|
|
initialized = true;
|
|
}
|
|
|
|
public void Add(object extension)
|
|
{
|
|
if (extension is SyndicationElementExtension)
|
|
{
|
|
base.Add((SyndicationElementExtension) extension);
|
|
}
|
|
else
|
|
{
|
|
this.Add(extension, (DataContractSerializer) null);
|
|
}
|
|
}
|
|
|
|
public void Add(string outerName, string outerNamespace, object dataContractExtension)
|
|
{
|
|
this.Add(outerName, outerNamespace, dataContractExtension, null);
|
|
}
|
|
|
|
public void Add(object dataContractExtension, DataContractSerializer serializer)
|
|
{
|
|
this.Add(null, null, dataContractExtension, serializer);
|
|
}
|
|
|
|
public void Add(string outerName, string outerNamespace, object dataContractExtension, XmlObjectSerializer dataContractSerializer)
|
|
{
|
|
if (dataContractExtension == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dataContractExtension");
|
|
}
|
|
if (dataContractSerializer == null)
|
|
{
|
|
dataContractSerializer = new DataContractSerializer(dataContractExtension.GetType());
|
|
}
|
|
base.Add(new SyndicationElementExtension(outerName, outerNamespace, dataContractExtension, dataContractSerializer));
|
|
}
|
|
|
|
public void Add(object xmlSerializerExtension, XmlSerializer serializer)
|
|
{
|
|
if (xmlSerializerExtension == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSerializerExtension");
|
|
}
|
|
if (serializer == null)
|
|
{
|
|
serializer = new XmlSerializer(xmlSerializerExtension.GetType());
|
|
}
|
|
base.Add(new SyndicationElementExtension(xmlSerializerExtension, serializer));
|
|
}
|
|
|
|
public void Add(XmlReader xmlReader)
|
|
{
|
|
if (xmlReader == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlReader");
|
|
}
|
|
base.Add(new SyndicationElementExtension(xmlReader));
|
|
}
|
|
|
|
public XmlReader GetReaderAtElementExtensions()
|
|
{
|
|
XmlBuffer extensionsBuffer = GetOrCreateBufferOverExtensions();
|
|
XmlReader reader = extensionsBuffer.GetReader(0);
|
|
reader.ReadStartElement();
|
|
return reader;
|
|
}
|
|
|
|
public Collection<TExtension> ReadElementExtensions<TExtension>(string extensionName, string extensionNamespace)
|
|
{
|
|
return ReadElementExtensions<TExtension>(extensionName, extensionNamespace, new DataContractSerializer(typeof(TExtension)));
|
|
}
|
|
|
|
public Collection<TExtension> ReadElementExtensions<TExtension>(string extensionName, string extensionNamespace, XmlObjectSerializer serializer)
|
|
{
|
|
if (serializer == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serializer");
|
|
}
|
|
return ReadExtensions<TExtension>(extensionName, extensionNamespace, serializer, null);
|
|
}
|
|
|
|
public Collection<TExtension> ReadElementExtensions<TExtension>(string extensionName, string extensionNamespace, XmlSerializer serializer)
|
|
{
|
|
if (serializer == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serializer");
|
|
}
|
|
return ReadExtensions<TExtension>(extensionName, extensionNamespace, null, serializer);
|
|
}
|
|
|
|
internal void WriteTo(XmlWriter writer)
|
|
{
|
|
if (this.buffer != null)
|
|
{
|
|
using (XmlDictionaryReader reader = this.buffer.GetReader(0))
|
|
{
|
|
reader.ReadStartElement();
|
|
while (reader.IsStartElement())
|
|
{
|
|
writer.WriteNode(reader, false);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < this.Items.Count; ++i)
|
|
{
|
|
this.Items[i].WriteTo(writer);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void ClearItems()
|
|
{
|
|
base.ClearItems();
|
|
// clear the cached buffer if the operation is happening outside the constructor
|
|
if (initialized)
|
|
{
|
|
this.buffer = null;
|
|
}
|
|
}
|
|
|
|
protected override void InsertItem(int index, SyndicationElementExtension item)
|
|
{
|
|
if (item == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("item");
|
|
}
|
|
base.InsertItem(index, item);
|
|
// clear the cached buffer if the operation is happening outside the constructor
|
|
if (initialized)
|
|
{
|
|
this.buffer = null;
|
|
}
|
|
}
|
|
|
|
protected override void RemoveItem(int index)
|
|
{
|
|
base.RemoveItem(index);
|
|
// clear the cached buffer if the operation is happening outside the constructor
|
|
if (initialized)
|
|
{
|
|
this.buffer = null;
|
|
}
|
|
}
|
|
|
|
protected override void SetItem(int index, SyndicationElementExtension item)
|
|
{
|
|
if (item == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("item");
|
|
}
|
|
base.SetItem(index, item);
|
|
// clear the cached buffer if the operation is happening outside the constructor
|
|
if (initialized)
|
|
{
|
|
this.buffer = null;
|
|
}
|
|
}
|
|
|
|
XmlBuffer GetOrCreateBufferOverExtensions()
|
|
{
|
|
if (this.buffer != null)
|
|
{
|
|
return this.buffer;
|
|
}
|
|
XmlBuffer newBuffer = new XmlBuffer(int.MaxValue);
|
|
using (XmlWriter writer = newBuffer.OpenSection(XmlDictionaryReaderQuotas.Max))
|
|
{
|
|
writer.WriteStartElement(Rss20Constants.ExtensionWrapperTag);
|
|
for (int i = 0; i < this.Count; ++i)
|
|
{
|
|
this[i].WriteTo(writer);
|
|
}
|
|
writer.WriteEndElement();
|
|
}
|
|
newBuffer.CloseSection();
|
|
newBuffer.Close();
|
|
this.buffer = newBuffer;
|
|
return newBuffer;
|
|
}
|
|
|
|
void PopulateElements()
|
|
{
|
|
using (XmlDictionaryReader reader = this.buffer.GetReader(0))
|
|
{
|
|
reader.ReadStartElement();
|
|
int index = 0;
|
|
while (reader.IsStartElement())
|
|
{
|
|
base.Add(new SyndicationElementExtension(this.buffer, index, reader.LocalName, reader.NamespaceURI));
|
|
reader.Skip();
|
|
++index;
|
|
}
|
|
}
|
|
}
|
|
|
|
Collection<TExtension> ReadExtensions<TExtension>(string extensionName, string extensionNamespace, XmlObjectSerializer dcSerializer, XmlSerializer xmlSerializer)
|
|
{
|
|
if (string.IsNullOrEmpty(extensionName))
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.ExtensionNameNotSpecified));
|
|
}
|
|
Fx.Assert((dcSerializer == null) != (xmlSerializer == null), "exactly one serializer should be supplied");
|
|
// normalize the null and empty namespace
|
|
if (extensionNamespace == null)
|
|
{
|
|
extensionNamespace = string.Empty;
|
|
}
|
|
Collection<TExtension> results = new Collection<TExtension>();
|
|
for (int i = 0; i < this.Count; ++i)
|
|
{
|
|
if (extensionName != this[i].OuterName || extensionNamespace != this[i].OuterNamespace)
|
|
{
|
|
continue;
|
|
}
|
|
if (dcSerializer != null)
|
|
{
|
|
results.Add(this[i].GetObject<TExtension>(dcSerializer));
|
|
}
|
|
else
|
|
{
|
|
results.Add(this[i].GetObject<TExtension>(xmlSerializer));
|
|
}
|
|
}
|
|
return results;
|
|
}
|
|
}
|
|
}
|