| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.Xml
- {
- using System.Runtime;
- enum StringHandleConstStringType
- {
- Type = 0,
- Root = 1,
- Item = 2
- }
- class StringHandle
- {
- XmlBufferReader bufferReader;
- StringHandleType type;
- int key;
- int offset;
- int length;
- static string[] constStrings = {
- "type",
- "root",
- "item"
- };
- public StringHandle(XmlBufferReader bufferReader)
- {
- this.bufferReader = bufferReader;
- SetValue(0, 0);
- }
- public void SetValue(int offset, int length)
- {
- this.type = StringHandleType.UTF8;
- this.offset = offset;
- this.length = length;
- }
- public void SetConstantValue(StringHandleConstStringType constStringType)
- {
- type = StringHandleType.ConstString;
- key = (int)constStringType;
- }
- public void SetValue(int offset, int length, bool escaped)
- {
- this.type = (escaped ? StringHandleType.EscapedUTF8 : StringHandleType.UTF8);
- this.offset = offset;
- this.length = length;
- }
- public void SetValue(int key)
- {
- this.type = StringHandleType.Dictionary;
- this.key = key;
- }
- public void SetValue(StringHandle value)
- {
- this.type = value.type;
- this.key = value.key;
- this.offset = value.offset;
- this.length = value.length;
- }
- public bool IsEmpty
- {
- get
- {
- if (type == StringHandleType.UTF8)
- return length == 0;
- return Equals2(string.Empty);
- }
- }
- public bool IsXmlns
- {
- get
- {
- if (type == StringHandleType.UTF8)
- {
- if (this.length != 5)
- return false;
- byte[] buffer = bufferReader.Buffer;
- int offset = this.offset;
- return buffer[offset + 0] == 'x' &&
- buffer[offset + 1] == 'm' &&
- buffer[offset + 2] == 'l' &&
- buffer[offset + 3] == 'n' &&
- buffer[offset + 4] == 's';
- }
- return Equals2("xmlns");
- }
- }
- public void ToPrefixHandle(PrefixHandle prefix)
- {
- Fx.Assert(type == StringHandleType.UTF8, "");
- prefix.SetValue(offset, length);
- }
- public string GetString(XmlNameTable nameTable)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.UTF8)
- return bufferReader.GetString(offset, length, nameTable);
- if (type == StringHandleType.Dictionary)
- return nameTable.Add(bufferReader.GetDictionaryString(key).Value);
- if (type == StringHandleType.ConstString)
- return nameTable.Add(constStrings[key]);
- Fx.Assert(type == StringHandleType.EscapedUTF8, "");
- return bufferReader.GetEscapedString(offset, length, nameTable);
- }
- public string GetString()
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.UTF8)
- return bufferReader.GetString(offset, length);
- if (type == StringHandleType.Dictionary)
- return bufferReader.GetDictionaryString(key).Value;
- if (type == StringHandleType.ConstString)
- return constStrings[key];
- Fx.Assert(type == StringHandleType.EscapedUTF8, "");
- return bufferReader.GetEscapedString(offset, length);
- }
- public byte[] GetString(out int offset, out int length)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.UTF8)
- {
- offset = this.offset;
- length = this.length;
- return bufferReader.Buffer;
- }
- if (type == StringHandleType.Dictionary)
- {
- byte[] buffer = bufferReader.GetDictionaryString(this.key).ToUTF8();
- offset = 0;
- length = buffer.Length;
- return buffer;
- }
- if (type == StringHandleType.ConstString)
- {
- byte[] buffer = XmlConverter.ToBytes(constStrings[key]);
- offset = 0;
- length = buffer.Length;
- return buffer;
- }
- else
- {
- Fx.Assert(type == StringHandleType.EscapedUTF8, "");
- byte[] buffer = XmlConverter.ToBytes(bufferReader.GetEscapedString(this.offset, this.length));
- offset = 0;
- length = buffer.Length;
- return buffer;
- }
- }
- public bool TryGetDictionaryString(out XmlDictionaryString value)
- {
- if (type == StringHandleType.Dictionary)
- {
- value = bufferReader.GetDictionaryString(key);
- return true;
- }
- else if (IsEmpty)
- {
- value = XmlDictionaryString.Empty;
- return true;
- }
- value = null;
- return false;
- }
- public override string ToString()
- {
- return GetString();
- }
- bool Equals2(int key2, XmlBufferReader bufferReader2)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.Dictionary)
- return bufferReader.Equals2(this.key, key2, bufferReader2);
- if (type == StringHandleType.UTF8)
- return bufferReader.Equals2(this.offset, this.length, bufferReader2.GetDictionaryString(key2).Value);
- Fx.Assert(type == StringHandleType.EscapedUTF8 || type == StringHandleType.ConstString, "");
- return GetString() == bufferReader.GetDictionaryString(key2).Value;
- }
- bool Equals2(XmlDictionaryString xmlString2)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.Dictionary)
- return bufferReader.Equals2(this.key, xmlString2);
- if (type == StringHandleType.UTF8)
- return bufferReader.Equals2(this.offset, this.length, xmlString2.ToUTF8());
- Fx.Assert(type == StringHandleType.EscapedUTF8 || type == StringHandleType.ConstString, "");
- return GetString() == xmlString2.Value;
- }
- bool Equals2(string s2)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.Dictionary)
- return bufferReader.GetDictionaryString(this.key).Value == s2;
- if (type == StringHandleType.UTF8)
- return bufferReader.Equals2(this.offset, this.length, s2);
- Fx.Assert(type == StringHandleType.EscapedUTF8 || type == StringHandleType.ConstString, "");
- return GetString() == s2;
- }
- bool Equals2(int offset2, int length2, XmlBufferReader bufferReader2)
- {
- StringHandleType type = this.type;
- if (type == StringHandleType.Dictionary)
- return bufferReader2.Equals2(offset2, length2, bufferReader.GetDictionaryString(this.key).Value);
- if (type == StringHandleType.UTF8)
- return bufferReader.Equals2(this.offset, this.length, bufferReader2, offset2, length2);
- Fx.Assert(type == StringHandleType.EscapedUTF8 || type == StringHandleType.ConstString, "");
- return GetString() == bufferReader.GetString(offset2, length2);
- }
- bool Equals2(StringHandle s2)
- {
- StringHandleType type = s2.type;
- if (type == StringHandleType.Dictionary)
- return Equals2(s2.key, s2.bufferReader);
- if (type == StringHandleType.UTF8)
- return Equals2(s2.offset, s2.length, s2.bufferReader);
- Fx.Assert(type == StringHandleType.EscapedUTF8 || type == StringHandleType.ConstString, "");
- return Equals2(s2.GetString());
- }
- static public bool operator ==(StringHandle s1, XmlDictionaryString xmlString2)
- {
- return s1.Equals2(xmlString2);
- }
- static public bool operator !=(StringHandle s1, XmlDictionaryString xmlString2)
- {
- return !s1.Equals2(xmlString2);
- }
- static public bool operator ==(StringHandle s1, string s2)
- {
- return s1.Equals2(s2);
- }
- static public bool operator !=(StringHandle s1, string s2)
- {
- return !s1.Equals2(s2);
- }
- static public bool operator ==(StringHandle s1, StringHandle s2)
- {
- return s1.Equals2(s2);
- }
- static public bool operator !=(StringHandle s1, StringHandle s2)
- {
- return !s1.Equals2(s2);
- }
- public int CompareTo(StringHandle that)
- {
- if (this.type == StringHandleType.UTF8 && that.type == StringHandleType.UTF8)
- return bufferReader.Compare(this.offset, this.length, that.offset, that.length);
- else
- return string.Compare(this.GetString(), that.GetString(), StringComparison.Ordinal);
- }
- public override bool Equals(object obj)
- {
- StringHandle that = obj as StringHandle;
- if (object.ReferenceEquals(that, null))
- return false;
- return this == that;
- }
- public override int GetHashCode()
- {
- return GetString().GetHashCode();
- }
- enum StringHandleType
- {
- Dictionary,
- UTF8,
- EscapedUTF8,
- ConstString
- }
- }
- }
|