using System; using System.Globalization; using System.Xml; namespace Google.ProtocolBuffers.Serialization { /// /// Provides a base class for text-parsing readers /// public abstract class AbstractTextReader : AbstractReader { /// Constructs a new reader protected AbstractTextReader() { } /// /// Reads a typed field as a string /// protected abstract bool ReadAsText(ref string textValue, Type type); /// /// Returns true if it was able to read a String from the input /// protected override bool Read(ref string value) { string text = null; if (ReadAsText(ref text, typeof(string))) { value = text; return true; } return false; } /// /// Returns true if it was able to read a Boolean from the input /// protected override bool Read(ref bool value) { string text = null; if (ReadAsText(ref text, typeof(bool))) { value = XmlConvert.ToBoolean(text); return true; } return false; } /// /// Returns true if it was able to read a Int32 from the input /// protected override bool Read(ref int value) { string text = null; if (ReadAsText(ref text, typeof(int))) { value = XmlConvert.ToInt32(text); return true; } return false; } /// /// Returns true if it was able to read a UInt32 from the input /// [CLSCompliant(false)] protected override bool Read(ref uint value) { string text = null; if (ReadAsText(ref text, typeof(uint))) { value = XmlConvert.ToUInt32(text); return true; } return false; } /// /// Returns true if it was able to read a Int64 from the input /// protected override bool Read(ref long value) { string text = null; if (ReadAsText(ref text, typeof(long))) { value = XmlConvert.ToInt64(text); return true; } return false; } /// /// Returns true if it was able to read a UInt64 from the input /// [CLSCompliant(false)] protected override bool Read(ref ulong value) { string text = null; if (ReadAsText(ref text, typeof(ulong))) { value = XmlConvert.ToUInt64(text); return true; } return false; } /// /// Returns true if it was able to read a Single from the input /// protected override bool Read(ref float value) { string text = null; if (ReadAsText(ref text, typeof(float))) { value = XmlConvert.ToSingle(text); return true; } return false; } /// /// Returns true if it was able to read a Double from the input /// protected override bool Read(ref double value) { string text = null; if (ReadAsText(ref text, typeof(double))) { value = XmlConvert.ToDouble(text); return true; } return false; } /// /// Provides decoding of bytes read from the input stream /// protected virtual ByteString DecodeBytes(string bytes) { return ByteString.FromBase64(bytes); } /// /// Returns true if it was able to read a ByteString from the input /// protected override bool Read(ref ByteString value) { string text = null; if (ReadAsText(ref text, typeof(ByteString))) { value = DecodeBytes(text); return true; } return false; } /// /// returns true if it was able to read a single value into the value reference. The value /// stored may be of type System.String, System.Int32, or an IEnumLite from the IEnumLiteMap. /// protected override bool ReadEnum(ref object value) { string text = null; if (ReadAsText(ref text, typeof(Enum))) { int number; if (FrameworkPortability.TryParseInt32(text, NumberStyles.Integer, FrameworkPortability.InvariantCulture, out number)) { value = number; return true; } value = text; return true; } return false; } } }