| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- //------------------------------------------------------------
- // 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();
- }
- }
- }
|