You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------
 | |
| // Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| //------------------------------------------------------------
 | |
| using StringHandle = System.Int64;
 | |
| 
 | |
| namespace System.Xml
 | |
| {
 | |
|     using System.Xml;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Runtime.Serialization;
 | |
| 
 | |
|     public class XmlBinaryReaderSession : IXmlDictionary
 | |
|     {
 | |
|         const int MaxArrayEntries = 2048;
 | |
| 
 | |
|         XmlDictionaryString[] strings;
 | |
|         Dictionary<int, XmlDictionaryString> stringDict;
 | |
| 
 | |
|         public XmlBinaryReaderSession()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public XmlDictionaryString Add(int id, string value)
 | |
|         {
 | |
|             if (id < 0)
 | |
|                 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(SR.GetString(SR.XmlInvalidID)));
 | |
|             if (value == null)
 | |
|                 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
 | |
|             XmlDictionaryString xmlString;
 | |
|             if (TryLookup(id, out xmlString))
 | |
|                 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.XmlIDDefined)));
 | |
| 
 | |
|             xmlString = new XmlDictionaryString(this, value, id);
 | |
|             if (id >= MaxArrayEntries)
 | |
|             {
 | |
|                 if (stringDict == null)
 | |
|                     this.stringDict = new Dictionary<int, XmlDictionaryString>();
 | |
| 
 | |
|                 this.stringDict.Add(id, xmlString);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (strings == null)
 | |
|                 {
 | |
|                     strings = new XmlDictionaryString[Math.Max(id + 1, 16)];
 | |
|                 }
 | |
|                 else if (id >= strings.Length)
 | |
|                 {
 | |
|                     XmlDictionaryString[] newStrings = new XmlDictionaryString[Math.Min(Math.Max(id + 1, strings.Length * 2), MaxArrayEntries)];
 | |
|                     Array.Copy(strings, newStrings, strings.Length);
 | |
|                     strings = newStrings;
 | |
|                 }
 | |
|                 strings[id] = xmlString;
 | |
|             }
 | |
|             return xmlString;
 | |
|         }
 | |
| 
 | |
|         public bool TryLookup(int key, out XmlDictionaryString result)
 | |
|         {
 | |
|             if (strings != null && key >= 0 && key < strings.Length)
 | |
|             {
 | |
|                 result = strings[key];
 | |
|                 return result != null;
 | |
|             }
 | |
|             else if (key >= MaxArrayEntries)
 | |
|             {
 | |
|                 if (this.stringDict != null)
 | |
|                     return this.stringDict.TryGetValue(key, out result);
 | |
|             }
 | |
|             result = null;
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public bool TryLookup(string value, out XmlDictionaryString result)
 | |
|         {
 | |
|             if (value == null)
 | |
|                 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
 | |
| 
 | |
|             if (strings != null)
 | |
|             {
 | |
|                 for (int i = 0; i < strings.Length; i++)
 | |
|                 {
 | |
|                     XmlDictionaryString s = strings[i];
 | |
|                     if (s != null && s.Value == value)
 | |
|                     {
 | |
|                         result = s;
 | |
|                         return true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (this.stringDict != null)
 | |
|             {
 | |
|                 foreach (XmlDictionaryString s in this.stringDict.Values)
 | |
|                 {
 | |
|                     if (s.Value == value)
 | |
|                     {
 | |
|                         result = s;
 | |
|                         return true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             result = null;
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public bool TryLookup(XmlDictionaryString value, out XmlDictionaryString result)
 | |
|         {
 | |
|             if (value == null)
 | |
|                 throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("value"));
 | |
|             if (value.Dictionary != this)
 | |
|             {
 | |
|                 result = null;
 | |
|                 return false;
 | |
|             }
 | |
|             result = value;
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         public void Clear()
 | |
|         {
 | |
|             if (strings != null)
 | |
|                 Array.Clear(strings, 0, strings.Length);
 | |
| 
 | |
|             if (this.stringDict != null)
 | |
|                 this.stringDict.Clear();
 | |
|         }
 | |
|     }
 | |
| }
 |