diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2008-08-30 10:56:42 -0700 |
---|---|---|
committer | Andrew <andrewarnott@gmail.com> | 2008-09-01 11:02:39 -0700 |
commit | 5df67c5b5bbd0c7463cec9b1f594d18de345a7d5 (patch) | |
tree | ed64936e0bda1b28bd0fff1208df810c4395c5b2 /src | |
parent | 5010504266d6e7fddfedf49ecbc572a2baba5e0a (diff) | |
download | DotNetOpenAuth-5df67c5b5bbd0c7463cec9b1f594d18de345a7d5.zip DotNetOpenAuth-5df67c5b5bbd0c7463cec9b1f594d18de345a7d5.tar.gz DotNetOpenAuth-5df67c5b5bbd0c7463cec9b1f594d18de345a7d5.tar.bz2 |
Added another test, and changed the way spoofed dictionary xml I/O works to fix the bug it revealed.
Diffstat (limited to 'src')
-rw-r--r-- | src/DotNetOAuth.Test/MessageSerializerTest.cs | 16 | ||||
-rw-r--r-- | src/DotNetOAuth/DictionaryXmlReader.cs | 250 | ||||
-rw-r--r-- | src/DotNetOAuth/DictionaryXmlWriter.cs | 141 | ||||
-rw-r--r-- | src/DotNetOAuth/DotNetOAuth.csproj | 4 | ||||
-rw-r--r-- | src/DotNetOAuth/ProtocolMessageSerializer.cs | 315 |
5 files changed, 418 insertions, 308 deletions
diff --git a/src/DotNetOAuth.Test/MessageSerializerTest.cs b/src/DotNetOAuth.Test/MessageSerializerTest.cs index 2db8343..e105ded 100644 --- a/src/DotNetOAuth.Test/MessageSerializerTest.cs +++ b/src/DotNetOAuth.Test/MessageSerializerTest.cs @@ -31,7 +31,21 @@ namespace DotNetOAuth.Test { var actual = serializer.Deserialize(fields);
Assert.AreEqual(15, actual.Age);
Assert.AreEqual("Andrew", actual.Name);
- Assert.AreEqual(null, actual.EmptyMember);
+ Assert.IsNull(actual.EmptyMember);
+ }
+
+ [TestMethod]
+ public void DeserializeWithExtraFields() {
+ var serializer = new ProtocolMessageSerializer<Mocks.TestMessage>();
+ Dictionary<string, string> fields = new Dictionary<string, string>(StringComparer.Ordinal);
+ fields["age"] = "15";
+ // Add some field that is not recognized by the class. This simulates a querystring with
+ // more parameters than are actually interesting to the protocol message.
+ fields["someExtraField"] = "asdf";
+ var actual = serializer.Deserialize(fields);
+ Assert.AreEqual(15, actual.Age);
+ Assert.IsNull(actual.Name);
+ Assert.IsNull(actual.EmptyMember);
}
/// <summary>
diff --git a/src/DotNetOAuth/DictionaryXmlReader.cs b/src/DotNetOAuth/DictionaryXmlReader.cs new file mode 100644 index 0000000..38e27cb --- /dev/null +++ b/src/DotNetOAuth/DictionaryXmlReader.cs @@ -0,0 +1,250 @@ +using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+
+namespace DotNetOAuth {
+ /// <summary>
+ /// An XmlReader-looking object that actually reads from a dictionary.
+ /// </summary>
+ class DictionaryXmlReader {
+ /// <summary>
+ /// Creates an XmlReader that reads data out of a dictionary instead of XML.
+ /// </summary>
+ /// <param name="rootElement">The name of the root XML element.</param>
+ /// <param name="fields">The dictionary to read data from.</param>
+ /// <returns>The XmlReader that will read the data out of the given dictionary.</returns>
+ internal static XmlReader Create(XName rootElement, IDictionary<string, string> fields) {
+ if (fields == null) throw new ArgumentNullException("fields");
+
+ return CreateRoundtripReader(rootElement, fields);
+ // The pseudo reader MAY be more efficient, but it's buggy.
+ //return CreatePseudoReader(rootElement, fields);
+ }
+
+ private static XmlReader CreateRoundtripReader(XName rootElement, IDictionary<string, string> fields) {
+ MemoryStream stream = new MemoryStream();
+ XmlWriter writer = XmlWriter.Create(stream);
+ SerializeDictionaryToXml(writer, rootElement, fields);
+ writer.Flush();
+ stream.Seek(0, SeekOrigin.Begin);
+
+ // For debugging purposes.
+ StreamReader sr = new StreamReader(stream);
+ Trace.WriteLine(sr.ReadToEnd());
+ stream.Seek(0, SeekOrigin.Begin);
+
+ return XmlReader.Create(stream);
+ }
+
+ static XmlReader CreatePseudoReader(XName rootElement, IDictionary<string, string> fields) {
+ return new PseudoXmlReader(fields);
+ }
+
+ static void SerializeDictionaryToXml(XmlWriter writer, XName rootElement, IDictionary<string, string> fields) {
+ if (writer == null) throw new ArgumentNullException("writer");
+ if (fields == null) throw new ArgumentNullException("fields");
+
+ writer.WriteStartElement(rootElement.LocalName, rootElement.NamespaceName);
+ // The elements must be serialized in alphabetical order so the DataContractSerializer will see them.
+ foreach (var pair in fields.OrderBy(pair => pair.Key, StringComparer.Ordinal)) {
+ writer.WriteStartElement(pair.Key, rootElement.NamespaceName);
+ writer.WriteValue(pair.Value);
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ }
+
+ /// <summary>
+ /// Reads in a dictionary as if it were XML.
+ /// </summary>
+ class PseudoXmlReader : XmlReader {
+ IDictionary<string, string> dictionary;
+ IEnumerator<string> keyEnumerator;
+ bool isFinished;
+ int depth;
+ XmlNodeType currentNode = XmlNodeType.None;
+
+ internal PseudoXmlReader(IDictionary<string, string> dictionary) {
+ this.dictionary = dictionary;
+ keyEnumerator = dictionary.Keys.OrderBy(key => key, StringComparer.Ordinal).GetEnumerator();
+ }
+
+ public override int AttributeCount {
+ get { return 0; }
+ }
+
+ public override bool IsEmptyElement {
+ get {
+ if (keyEnumerator.Current == null) {
+ return isFinished;
+ }
+ string value;
+ bool result = !dictionary.TryGetValue(keyEnumerator.Current, out value) || String.IsNullOrEmpty(value);
+ return result;
+ }
+ }
+
+ public override string LocalName {
+ get { return keyEnumerator.Current; }
+ }
+
+ public override bool MoveToElement() {
+ Trace.WriteLine("MoveToElement()");
+ bool result = currentNode != XmlNodeType.Element && depth > 0;
+ currentNode = depth > 0 ? XmlNodeType.Element : XmlNodeType.None;
+ return result;
+ }
+
+ public override bool MoveToNextAttribute() {
+ Trace.WriteLine("MoveToNextAttribute()");
+ if (depth == 1 && currentNode != XmlNodeType.Attribute) {
+ currentNode = XmlNodeType.Attribute;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public override string NamespaceURI {
+ get {
+ string result = depth == 1 && currentNode == XmlNodeType.Attribute ?
+ "http://www.w3.org/2000/xmlns/" : Protocol.DataContractNamespace;
+ return result;
+ }
+ }
+
+ public override XmlNodeType NodeType {
+ get { return currentNode; }
+ }
+
+ public override bool Read() {
+ Trace.WriteLine("Read()");
+ if (isFinished) {
+ if (depth > 0) {
+ depth--;
+ }
+ return depth > 0;
+ }
+ switch (depth) {
+ case 0: // moving to root node
+ depth++; // -> 1
+ currentNode = XmlNodeType.Element;
+ return true;
+ case 1: // moving to first content node
+ depth++; // -> 2
+ isFinished = !keyEnumerator.MoveNext();
+ currentNode = isFinished ? XmlNodeType.EndElement : XmlNodeType.Element;
+ return true;
+ case 2: // content node
+ switch (currentNode) {
+ case XmlNodeType.Element:
+ currentNode = XmlNodeType.Text;
+ return true;
+ case XmlNodeType.Text:
+ currentNode = XmlNodeType.EndElement;
+ return true;
+ case XmlNodeType.EndElement:
+ bool result = keyEnumerator.MoveNext();
+ if (!result) {
+ isFinished = true;
+ depth--;
+ currentNode = XmlNodeType.EndElement;
+ } else {
+ currentNode = XmlNodeType.Element;
+ }
+ return true;
+ }
+ break;
+ }
+ throw new InvalidOperationException();
+ }
+
+ public override string Value {
+ get { return dictionary[keyEnumerator.Current]; }
+ }
+
+ #region Unimplemented methods
+
+ public override string BaseURI {
+ get { throw new NotImplementedException(); }
+ }
+
+ public override void Close() {
+ throw new NotImplementedException();
+ }
+
+ public override int Depth {
+ get {
+ Trace.WriteLine("Depth: " + (depth - 1));
+ return depth - 1;
+ }
+ }
+
+ public override bool EOF {
+ get { throw new NotImplementedException(); }
+ }
+
+ public override string GetAttribute(int i) {
+ throw new NotImplementedException();
+ }
+
+ public override string GetAttribute(string name, string namespaceURI) {
+ throw new NotImplementedException();
+ }
+
+ public override string GetAttribute(string name) {
+ throw new NotImplementedException();
+ }
+
+ public override bool HasValue {
+ get { throw new NotImplementedException(); }
+ }
+
+ public override string LookupNamespace(string prefix) {
+ throw new NotImplementedException();
+ }
+
+ public override bool MoveToAttribute(string name, string ns) {
+ throw new NotImplementedException();
+ }
+
+ public override bool MoveToAttribute(string name) {
+ throw new NotImplementedException();
+ }
+
+ public override bool MoveToFirstAttribute() {
+ throw new NotImplementedException();
+ }
+
+ public override XmlNameTable NameTable {
+ get { throw new NotImplementedException(); }
+ }
+
+ public override string Prefix {
+ get { throw new NotImplementedException(); }
+ }
+
+ public override ReadState ReadState {
+ get {
+ Trace.WriteLine("ReadState");
+ return ReadState.Interactive;
+ }
+ }
+
+ public override bool ReadAttributeValue() {
+ throw new NotImplementedException();
+ }
+
+ public override void ResolveEntity() {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+ }
+ }
+}
diff --git a/src/DotNetOAuth/DictionaryXmlWriter.cs b/src/DotNetOAuth/DictionaryXmlWriter.cs new file mode 100644 index 0000000..8312d5b --- /dev/null +++ b/src/DotNetOAuth/DictionaryXmlWriter.cs @@ -0,0 +1,141 @@ +using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+
+namespace DotNetOAuth {
+ /// <summary>
+ /// An XmlWriter-looking object that actually saves data to a dictionary.
+ /// </summary>
+ class DictionaryXmlWriter {
+ /// <summary>
+ /// Creates an <see cref="XmlWriter"/> that actually writes to an <see cref="IDictionary<string, string>"/> instance.
+ /// </summary>
+ /// <param name="dictionary">The dictionary to save the written XML to.</param>
+ /// <returns>The XmlWriter that will save data to the given dictionary.</returns>
+ internal static XmlWriter Create(IDictionary<string, string> dictionary) {
+ return new PseudoXmlWriter(dictionary);
+ }
+
+ /// <summary>
+ /// Writes out a dictionary as if it were XML.
+ /// </summary>
+ class PseudoXmlWriter : XmlWriter {
+ IDictionary<string, string> dictionary;
+ string key;
+ StringBuilder value = new StringBuilder();
+
+ internal PseudoXmlWriter(IDictionary<string, string> dictionary) {
+ this.dictionary = dictionary;
+ }
+
+ public override void WriteStartElement(string prefix, string localName, string ns) {
+ key = localName;
+ value.Length = 0;
+ }
+
+ public override void WriteString(string text) {
+ if (!string.IsNullOrEmpty(key)) {
+ value.Append(text);
+ }
+ }
+
+ public override void WriteEndElement() {
+ if (key != null) {
+ dictionary[key] = value.ToString();
+ key = null;
+ value.Length = 0;
+ }
+ }
+
+ public override WriteState WriteState {
+ get { return WriteState.Element; }
+ }
+
+ public override void WriteStartAttribute(string prefix, string localName, string ns) {
+ key = null;
+ }
+
+ public override void WriteEndAttribute() { }
+
+ public override void Close() { }
+
+ #region Unimplemented methods
+
+ public override void Flush() {
+ throw new NotImplementedException();
+ }
+
+ public override string LookupPrefix(string ns) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteBase64(byte[] buffer, int index, int count) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteCData(string text) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteCharEntity(char ch) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteChars(char[] buffer, int index, int count) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteComment(string text) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteDocType(string name, string pubid, string sysid, string subset) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteEndDocument() {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteEntityRef(string name) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteFullEndElement() {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteProcessingInstruction(string name, string text) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteRaw(string data) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteRaw(char[] buffer, int index, int count) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteStartDocument(bool standalone) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteStartDocument() {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteSurrogateCharEntity(char lowChar, char highChar) {
+ throw new NotImplementedException();
+ }
+
+ public override void WriteWhitespace(string ws) {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+ }
+ }
+}
diff --git a/src/DotNetOAuth/DotNetOAuth.csproj b/src/DotNetOAuth/DotNetOAuth.csproj index 06a6227..5e17d89 100644 --- a/src/DotNetOAuth/DotNetOAuth.csproj +++ b/src/DotNetOAuth/DotNetOAuth.csproj @@ -3,7 +3,7 @@ <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>9.0.21022</ProductVersion>
+ <ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3191B653-F76D-4C1A-9A5A-347BC3AAAAB7}</ProjectGuid>
<OutputType>Library</OutputType>
@@ -67,6 +67,8 @@ </ItemGroup>
<ItemGroup>
<Compile Include="Consumer.cs" />
+ <Compile Include="DictionaryXmlReader.cs" />
+ <Compile Include="DictionaryXmlWriter.cs" />
<Compile Include="DirectMessageChannel.cs" />
<Compile Include="IndirectMessage.cs" />
<Compile Include="IndirectMessageEncoder.cs" />
diff --git a/src/DotNetOAuth/ProtocolMessageSerializer.cs b/src/DotNetOAuth/ProtocolMessageSerializer.cs index da564d2..14422dd 100644 --- a/src/DotNetOAuth/ProtocolMessageSerializer.cs +++ b/src/DotNetOAuth/ProtocolMessageSerializer.cs @@ -4,6 +4,9 @@ using System.Linq; using System.Runtime.Serialization;
using System.Text;
using System.Xml;
+using System.Diagnostics;
+using System.IO;
+using System.Xml.Linq;
namespace DotNetOAuth {
/// <summary>
@@ -11,10 +14,10 @@ namespace DotNetOAuth { /// </summary>
internal class ProtocolMessageSerializer<T> where T : IProtocolMessage {
DataContractSerializer serializer;
- const string rootName = "root";
+ readonly XName rootElement = XName.Get("root", Protocol.DataContractNamespace);
internal ProtocolMessageSerializer() {
- serializer = new DataContractSerializer(typeof(T), rootName, Protocol.DataContractNamespace);
+ serializer = new DataContractSerializer(typeof(T), rootElement.LocalName, rootElement.NamespaceName);
}
/// <summary>
@@ -25,9 +28,9 @@ namespace DotNetOAuth { if (message == null) throw new ArgumentNullException("message");
var fields = new Dictionary<string, string>();
- XmlWriter writer = new ProtocolMessageSerializer<T>.PseudoXmlWriter(fields);
- serializer.WriteObjectContent(writer, message);
- writer.Close();
+ using (XmlWriter writer = DictionaryXmlWriter.Create(fields)) {
+ serializer.WriteObjectContent(writer, message);
+ }
return fields;
}
@@ -38,309 +41,9 @@ namespace DotNetOAuth { internal T Deserialize(IDictionary<string, string> fields) {
if (fields == null) throw new ArgumentNullException("fields");
- var reader = new PseudoXmlReader(fields);
- //var reader = new XmlTextReader(new StringReader("<root xmlns='http://oauth.net/core/1.0/'><Name>Andrew</Name><age>15</age></root>"));
+ var reader = DictionaryXmlReader.Create(rootElement, fields);
T result = (T)serializer.ReadObject(reader, false);
return result;
}
-
- /// <summary>
- /// Writes out a dictionary as if it were XML.
- /// </summary>
- class PseudoXmlWriter : XmlWriter {
- Dictionary<string, string> dictionary;
- string key;
- StringBuilder value = new StringBuilder();
-
- internal PseudoXmlWriter(Dictionary<string, string> dictionary) {
- this.dictionary = dictionary;
- }
-
- public override void WriteStartElement(string prefix, string localName, string ns) {
- key = localName;
- value.Length = 0;
- }
-
- public override void WriteString(string text) {
- if (!string.IsNullOrEmpty(key)) {
- value.Append(text);
- }
- }
-
- public override void WriteEndElement() {
- if (key != null) {
- dictionary[key] = value.ToString();
- key = null;
- value.Length = 0;
- }
- }
-
- public override WriteState WriteState {
- get { return WriteState.Element; }
- }
-
- public override void WriteStartAttribute(string prefix, string localName, string ns) {
- key = null;
- }
-
- public override void WriteEndAttribute() { }
-
- public override void Close() { }
-
- #region Unimplemented methods
-
- public override void Flush() {
- throw new NotImplementedException();
- }
-
- public override string LookupPrefix(string ns) {
- throw new NotImplementedException();
- }
-
- public override void WriteBase64(byte[] buffer, int index, int count) {
- throw new NotImplementedException();
- }
-
- public override void WriteCData(string text) {
- throw new NotImplementedException();
- }
-
- public override void WriteCharEntity(char ch) {
- throw new NotImplementedException();
- }
-
- public override void WriteChars(char[] buffer, int index, int count) {
- throw new NotImplementedException();
- }
-
- public override void WriteComment(string text) {
- throw new NotImplementedException();
- }
-
- public override void WriteDocType(string name, string pubid, string sysid, string subset) {
- throw new NotImplementedException();
- }
-
- public override void WriteEndDocument() {
- throw new NotImplementedException();
- }
-
- public override void WriteEntityRef(string name) {
- throw new NotImplementedException();
- }
-
- public override void WriteFullEndElement() {
- throw new NotImplementedException();
- }
-
- public override void WriteProcessingInstruction(string name, string text) {
- throw new NotImplementedException();
- }
-
- public override void WriteRaw(string data) {
- throw new NotImplementedException();
- }
-
- public override void WriteRaw(char[] buffer, int index, int count) {
- throw new NotImplementedException();
- }
-
- public override void WriteStartDocument(bool standalone) {
- throw new NotImplementedException();
- }
-
- public override void WriteStartDocument() {
- throw new NotImplementedException();
- }
-
- public override void WriteSurrogateCharEntity(char lowChar, char highChar) {
- throw new NotImplementedException();
- }
-
- public override void WriteWhitespace(string ws) {
- throw new NotImplementedException();
- }
-
- #endregion
- }
-
- /// <summary>
- /// Reads in a dictionary as if it were XML.
- /// </summary>
- class PseudoXmlReader : XmlReader {
- IDictionary<string, string> dictionary;
- IEnumerator<string> keyEnumerator;
- bool isFinished;
- int depth;
- XmlNodeType currentNode = XmlNodeType.None;
-
- internal PseudoXmlReader(IDictionary<string, string> dictionary) {
- this.dictionary = dictionary;
- keyEnumerator = dictionary.Keys.OrderBy(key => key, StringComparer.Ordinal).GetEnumerator();
- }
-
- public override int AttributeCount {
- get { return 0; }
- }
-
- public override bool IsEmptyElement {
- get {
- if (keyEnumerator.Current == null) {
- return isFinished;
- }
- string value;
- bool result = !dictionary.TryGetValue(keyEnumerator.Current, out value) || String.IsNullOrEmpty(value);
- return result;
- }
- }
-
- public override string LocalName {
- get { return keyEnumerator.Current; }
- }
-
- public override bool MoveToElement() {
- bool result = currentNode != XmlNodeType.Element && depth > 0;
- currentNode = depth > 0 ? XmlNodeType.Element : XmlNodeType.None;
- return result;
- }
-
- public override bool MoveToNextAttribute() {
- if (depth == 1 && currentNode != XmlNodeType.Attribute) {
- currentNode = XmlNodeType.Attribute;
- return true;
- } else {
- return false;
- }
- }
-
- public override string NamespaceURI {
- get {
- string result = depth == 1 && currentNode == XmlNodeType.Attribute ?
- "http://www.w3.org/2000/xmlns/" : Protocol.DataContractNamespace;
- return result;
- }
- }
-
- public override XmlNodeType NodeType {
- get { return currentNode; }
- }
-
- public override bool Read() {
- if (isFinished) {
- if (depth > 0) {
- depth--;
- }
- return depth > 0;
- }
- switch (depth) {
- case 0: // moving to root node
- depth++; // -> 1
- currentNode = XmlNodeType.Element;
- return true;
- case 1: // moving to first content node
- depth++; // -> 2
- isFinished = !keyEnumerator.MoveNext();
- currentNode = isFinished ? XmlNodeType.EndElement : XmlNodeType.Element;
- return true;
- case 2: // content node
- switch (currentNode) {
- case XmlNodeType.Element:
- currentNode = XmlNodeType.Text;
- return true;
- case XmlNodeType.Text:
- currentNode = XmlNodeType.EndElement;
- return true;
- case XmlNodeType.EndElement:
- bool result = keyEnumerator.MoveNext();
- if (!result) {
- isFinished = true;
- depth--;
- currentNode = XmlNodeType.EndElement;
- } else {
- currentNode = XmlNodeType.Element;
- }
- return true;
- }
- break;
- }
- throw new InvalidOperationException();
- }
-
- public override string Value {
- get { return dictionary[keyEnumerator.Current]; }
- }
-
- #region Unimplemented methods
-
- public override string BaseURI {
- get { throw new NotImplementedException(); }
- }
-
- public override void Close() {
- throw new NotImplementedException();
- }
-
- public override int Depth {
- get { throw new NotImplementedException(); }
- }
-
- public override bool EOF {
- get { throw new NotImplementedException(); }
- }
-
- public override string GetAttribute(int i) {
- throw new NotImplementedException();
- }
-
- public override string GetAttribute(string name, string namespaceURI) {
- throw new NotImplementedException();
- }
-
- public override string GetAttribute(string name) {
- throw new NotImplementedException();
- }
-
- public override bool HasValue {
- get { throw new NotImplementedException(); }
- }
-
- public override string LookupNamespace(string prefix) {
- throw new NotImplementedException();
- }
-
- public override bool MoveToAttribute(string name, string ns) {
- throw new NotImplementedException();
- }
-
- public override bool MoveToAttribute(string name) {
- throw new NotImplementedException();
- }
-
- public override bool MoveToFirstAttribute() {
- throw new NotImplementedException();
- }
-
- public override XmlNameTable NameTable {
- get { throw new NotImplementedException(); }
- }
-
- public override string Prefix {
- get { throw new NotImplementedException(); }
- }
-
- public override ReadState ReadState {
- get { throw new NotImplementedException(); }
- }
-
- public override bool ReadAttributeValue() {
- throw new NotImplementedException();
- }
-
- public override void ResolveEntity() {
- throw new NotImplementedException();
- }
-
- #endregion
- }
}
}
|