| #region Copyright notice and license | |
| // Protocol Buffers - Google's data interchange format | |
| // Copyright 2008 Google Inc. All rights reserved. | |
| // http://github.com/jskeet/dotnet-protobufs/ | |
| // Original C++/Java/Python code: | |
| // http://code.google.com/p/protobuf/ | |
| // | |
| // Redistribution and use in source and binary forms, with or without | |
| // modification, are permitted provided that the following conditions are | |
| // met: | |
| // | |
| // * Redistributions of source code must retain the above copyright | |
| // notice, this list of conditions and the following disclaimer. | |
| // * Redistributions in binary form must reproduce the above | |
| // copyright notice, this list of conditions and the following disclaimer | |
| // in the documentation and/or other materials provided with the | |
| // distribution. | |
| // * Neither the name of Google Inc. nor the names of its | |
| // contributors may be used to endorse or promote products derived from | |
| // this software without specific prior written permission. | |
| // | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| #endregion | |
| using System; | |
| using System.Collections.Generic; | |
| using System.Globalization; | |
| using System.IO; | |
| using System.Text; | |
| namespace Google.ProtocolBuffers | |
| { | |
| /// <summary> | |
| /// All generated protocol message classes extend this class. It implements | |
| /// most of the IMessage interface using reflection. Users | |
| /// can ignore this class as an implementation detail. | |
| /// </summary> | |
| public abstract partial class GeneratedMessageLite<TMessage, TBuilder> : AbstractMessageLite<TMessage, TBuilder> | |
| where TMessage : GeneratedMessageLite<TMessage, TBuilder> | |
| where TBuilder : GeneratedBuilderLite<TMessage, TBuilder> | |
| { | |
| protected abstract TMessage ThisMessage { get; } | |
| public override sealed string ToString() | |
| { | |
| using (StringWriter wtr = new StringWriter()) | |
| { | |
| PrintTo(wtr); | |
| return wtr.ToString(); | |
| } | |
| } | |
| /// <summary> | |
| /// PrintTo() helper methods for Lite Runtime | |
| /// </summary> | |
| protected static void PrintField<T>(string name, IList<T> value, TextWriter writer) | |
| { | |
| foreach (T item in value) | |
| { | |
| PrintField(name, true, (object) item, writer); | |
| } | |
| } | |
| /// <summary> | |
| /// PrintTo() helper methods for Lite Runtime | |
| /// </summary> | |
| protected static void PrintField(string name, bool hasValue, object value, TextWriter writer) | |
| { | |
| if (!hasValue) | |
| { | |
| return; | |
| } | |
| if (value is IMessageLite) | |
| { | |
| writer.WriteLine("{0} {{", name); | |
| ((IMessageLite) value).PrintTo(writer); | |
| writer.WriteLine("}"); | |
| } | |
| else if (value is ByteString || value is String) | |
| { | |
| writer.Write("{0}: \"", name); | |
| if (value is String) | |
| { | |
| EscapeBytes(Encoding.UTF8.GetBytes((string) value), writer); | |
| } | |
| else | |
| { | |
| EscapeBytes(((ByteString) value), writer); | |
| } | |
| writer.WriteLine("\""); | |
| } | |
| else if (value is bool) | |
| { | |
| writer.WriteLine("{0}: {1}", name, (bool) value ? "true" : "false"); | |
| } | |
| else if (value is IEnumLite) | |
| { | |
| writer.WriteLine("{0}: {1}", name, ((IEnumLite) value).Name); | |
| } | |
| else | |
| { | |
| writer.WriteLine("{0}: {1}", name, ((IConvertible)value).ToString(FrameworkPortability.InvariantCulture)); | |
| } | |
| } | |
| /// <summary> | |
| /// COPIED from TextFormat | |
| /// Escapes bytes in the format used in protocol buffer text format, which | |
| /// is the same as the format used for C string literals. All bytes | |
| /// that are not printable 7-bit ASCII characters are escaped, as well as | |
| /// backslash, single-quote, and double-quote characters. Characters for | |
| /// which no defined short-hand escape sequence is defined will be escaped | |
| /// using 3-digit octal sequences. | |
| /// The returned value is guaranteed to be entirely ASCII. | |
| /// </summary> | |
| private static void EscapeBytes(IEnumerable<byte> input, TextWriter writer) | |
| { | |
| foreach (byte b in input) | |
| { | |
| switch (b) | |
| { | |
| // C# does not use \a or \v | |
| case 0x07: | |
| writer.Write("\\a"); | |
| break; | |
| case (byte) '\b': | |
| writer.Write("\\b"); | |
| break; | |
| case (byte) '\f': | |
| writer.Write("\\f"); | |
| break; | |
| case (byte) '\n': | |
| writer.Write("\\n"); | |
| break; | |
| case (byte) '\r': | |
| writer.Write("\\r"); | |
| break; | |
| case (byte) '\t': | |
| writer.Write("\\t"); | |
| break; | |
| case 0x0b: | |
| writer.Write("\\v"); | |
| break; | |
| case (byte) '\\': | |
| writer.Write("\\\\"); | |
| break; | |
| case (byte) '\'': | |
| writer.Write("\\\'"); | |
| break; | |
| case (byte) '"': | |
| writer.Write("\\\""); | |
| break; | |
| default: | |
| if (b >= 0x20 && b < 128) | |
| { | |
| writer.Write((char) b); | |
| } | |
| else | |
| { | |
| writer.Write('\\'); | |
| writer.Write((char) ('0' + ((b >> 6) & 3))); | |
| writer.Write((char) ('0' + ((b >> 3) & 7))); | |
| writer.Write((char) ('0' + (b & 7))); | |
| } | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } |