e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
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();
|
|
}
|
|
}
|
|
}
|