You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			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;
 | |
|         }
 | |
|     }
 | |
| }
 |