diff --git a/litjson/litjson/JsonWriter.cs b/litjson/litjson/JsonWriter.cs index 7a410b3..babe9ca 100644 --- a/litjson/litjson/JsonWriter.cs +++ b/litjson/litjson/JsonWriter.cs @@ -29,445 +29,437 @@ namespace LitJson internal class WriterContext { - public int Count; - public bool InArray; - public bool InObject; - public bool ExpectingValue; - public int Padding; - } - - public class JsonWriter - { - #region Fields - private static readonly NumberFormatInfo number_format; - - private WriterContext context; - private Stack ctx_stack; - private bool has_reached_end; - private char[] hex_seq; - private int indentation; - private int indent_value; - private StringBuilder inst_string_builder; - private bool pretty_print; - private bool validate; - private bool lower_case_properties; - private TextWriter writer; - #endregion - - - #region Properties - public int IndentValue { - get { return indent_value; } - set { - indentation = (indentation / indent_value) * value; - indent_value = value; - } - } - - public bool PrettyPrint { - get { return pretty_print; } - set { pretty_print = value; } - } - - public TextWriter TextWriter { - get { return writer; } - } - - public bool Validate { - get { return validate; } - set { validate = value; } - } - - public bool LowerCaseProperties { - get { return lower_case_properties; } - set { lower_case_properties = value; } - } - #endregion - - - #region Constructors - static JsonWriter () - { - number_format = NumberFormatInfo.InvariantInfo; - } - - public JsonWriter () - { - inst_string_builder = new StringBuilder (); - writer = new StringWriter (inst_string_builder); - - Init (); - } - - public JsonWriter (StringBuilder sb) : - this (new StringWriter (sb)) - { - } - - public JsonWriter (TextWriter writer) - { - if (writer == null) - throw new ArgumentNullException ("writer"); - - this.writer = writer; - - Init (); - } - #endregion - - - #region Private Methods - private void DoValidation (Condition cond) - { - if (! context.ExpectingValue) - context.Count++; - - if (! validate) - return; - - if (has_reached_end) - throw new JsonException ( - "A complete JSON symbol has already been written"); - - switch (cond) { - case Condition.InArray: - if (! context.InArray) - throw new JsonException ( - "Can't close an array here"); - break; - - case Condition.InObject: - if (! context.InObject || context.ExpectingValue) - throw new JsonException ( - "Can't close an object here"); - break; - - case Condition.NotAProperty: - if (context.InObject && ! context.ExpectingValue) - throw new JsonException ( - "Expected a property"); - break; - - case Condition.Property: - if (! context.InObject || context.ExpectingValue) - throw new JsonException ( - "Can't add a property here"); - break; - - case Condition.Value: - if (! context.InArray && - (! context.InObject || ! context.ExpectingValue)) - throw new JsonException ( - "Can't add a value here"); - - break; - } - } - - private void Init () - { - has_reached_end = false; - hex_seq = new char[4]; - indentation = 0; - indent_value = 4; - pretty_print = false; - validate = true; - lower_case_properties = false; - - ctx_stack = new Stack (); - context = new WriterContext (); - ctx_stack.Push (context); - } - - private static void IntToHex (int n, char[] hex) - { - int num; - - for (int i = 0; i < 4; i++) { - num = n % 16; - - if (num < 10) - hex[3 - i] = (char) ('0' + num); - else - hex[3 - i] = (char) ('A' + (num - 10)); - - n >>= 4; - } - } - - private void Indent () - { - if (pretty_print) - indentation += indent_value; - } - - - private void Put (string str) - { - if (pretty_print && ! context.ExpectingValue) - for (int i = 0; i < indentation; i++) - writer.Write (' '); - - writer.Write (str); - } - - private void PutNewline () - { - PutNewline (true); - } - - private void PutNewline (bool add_comma) - { - if (add_comma && ! context.ExpectingValue && - context.Count > 1) - writer.Write (','); - - if (pretty_print && ! context.ExpectingValue) - writer.Write (Environment.NewLine); - } - - private void PutString (string str) - { - Put (String.Empty); - - writer.Write ('"'); - - int n = str.Length; - for (int i = 0; i < n; i++) { - switch (str[i]) { - case '\n': - writer.Write ("\\n"); - continue; - - case '\r': - writer.Write ("\\r"); - continue; - - case '\t': - writer.Write ("\\t"); - continue; - - case '"': - case '\\': - writer.Write ('\\'); - writer.Write (str[i]); - continue; - - case '\f': - writer.Write ("\\f"); - continue; - - case '\b': - writer.Write ("\\b"); - continue; - } - - if ((int) str[i] >= 32 && (int) str[i] <= 126) { - writer.Write (str[i]); - continue; - } - - // Default, turn into a \uXXXX sequence - IntToHex ((int) str[i], hex_seq); - writer.Write ("\\u"); - writer.Write (hex_seq); - } - - writer.Write ('"'); - } - - private void Unindent () - { - if (pretty_print) - indentation -= indent_value; - } - #endregion - - - public override string ToString () - { - if (inst_string_builder == null) - return String.Empty; - - return inst_string_builder.ToString (); - } - - public void Reset () - { - has_reached_end = false; - - ctx_stack.Clear (); - context = new WriterContext (); - ctx_stack.Push (context); - - if (inst_string_builder != null) - inst_string_builder.Remove (0, inst_string_builder.Length); - } - - public void Write (bool boolean) - { - DoValidation (Condition.Value); - PutNewline (); - - Put (boolean ? "true" : "false"); - - context.ExpectingValue = false; - } - - public void Write (decimal number) - { - DoValidation (Condition.Value); - PutNewline (); - - Put (Convert.ToString (number, number_format)); - - context.ExpectingValue = false; - } - - public void Write (double number) - { - DoValidation (Condition.Value); - PutNewline (); - - string str = Convert.ToString (number, number_format); - Put (str); - - if (str.IndexOf ('.') == -1 && - str.IndexOf ('E') == -1) - writer.Write (".0"); - - context.ExpectingValue = false; - } - - public void Write (int number) - { - DoValidation (Condition.Value); - PutNewline (); - - Put (Convert.ToString (number, number_format)); - - context.ExpectingValue = false; - } - - public void Write (long number) - { - DoValidation (Condition.Value); - PutNewline (); - - Put (Convert.ToString (number, number_format)); - - context.ExpectingValue = false; - } - - public void Write (string str) - { - DoValidation (Condition.Value); - PutNewline (); - - if (str == null) - Put ("null"); - else - PutString (str); - - context.ExpectingValue = false; - } - - [CLSCompliant(false)] - public void Write (ulong number) - { - DoValidation (Condition.Value); - PutNewline (); - - Put (Convert.ToString (number, number_format)); - - context.ExpectingValue = false; - } - - public void WriteArrayEnd () - { - DoValidation (Condition.InArray); - PutNewline (false); - - ctx_stack.Pop (); - if (ctx_stack.Count == 1) - has_reached_end = true; - else { - context = ctx_stack.Peek (); - context.ExpectingValue = false; - } - - Unindent (); - Put ("]"); - } - - public void WriteArrayStart () - { - DoValidation (Condition.NotAProperty); - PutNewline (); - - Put ("["); - - context = new WriterContext (); - context.InArray = true; - ctx_stack.Push (context); - - Indent (); - } - - public void WriteObjectEnd () - { - DoValidation (Condition.InObject); - PutNewline (false); - - ctx_stack.Pop (); - if (ctx_stack.Count == 1) - has_reached_end = true; - else { - context = ctx_stack.Peek (); - context.ExpectingValue = false; - } - - Unindent (); - Put ("}"); - } - - public void WriteObjectStart () - { - DoValidation (Condition.NotAProperty); - PutNewline (); - - Put ("{"); - - context = new WriterContext (); - context.InObject = true; - ctx_stack.Push (context); - - Indent (); - } - - public void WritePropertyName (string property_name) - { - DoValidation (Condition.Property); - PutNewline (); - string propertyName = (property_name == null || !lower_case_properties) - ? property_name - : property_name.ToLowerInvariant(); - - PutString (propertyName); - - if (pretty_print) { - if (propertyName.Length > context.Padding) - context.Padding = propertyName.Length; - - for (int i = context.Padding - propertyName.Length; - i >= 0; i--) - writer.Write (' '); - - writer.Write (": "); - } else - writer.Write (':'); - - context.ExpectingValue = true; - } - } + public Int32 Count; + public Boolean InArray; + public Boolean InObject; + public Boolean ExpectingValue; + public Int32 Padding; + } + + public class JsonWriter { + #region Fields + private static readonly NumberFormatInfo number_format; + + private WriterContext context; + private Stack ctx_stack; + private Boolean has_reached_end; + private Char[] hex_seq; + private Int32 indentation; + private Int32 indent_value; + private StringBuilder inst_string_builder; + private Boolean pretty_print; + private Boolean validate; + private Boolean lower_case_properties; + private TextWriter writer; + #endregion + + + #region Properties + public Int32 IndentValue { + get { return this.indent_value; } + set { + this.indentation = (this.indentation / this.indent_value) * value; + this.indent_value = value; + } + } + + public Boolean PrettyPrint { + get { return this.pretty_print; } + set { this.pretty_print = value; } + } + + public TextWriter TextWriter { + get { return this.writer; } + } + + public Boolean Validate { + get { return this.validate; } + set { this.validate = value; } + } + + public Boolean LowerCaseProperties { + get { return this.lower_case_properties; } + set { this.lower_case_properties = value; } + } + #endregion + + + #region Constructors + static JsonWriter() { + number_format = NumberFormatInfo.InvariantInfo; + } + + public JsonWriter() { + this.inst_string_builder = new StringBuilder(); + this.writer = new StringWriter(this.inst_string_builder); + + Init(); + } + + public JsonWriter(StringBuilder sb) : + this(new StringWriter(sb)) { + } + + public JsonWriter(TextWriter writer) { + this.writer = writer ?? throw new ArgumentNullException("writer"); + + Init(); + } + #endregion + + + #region Private Methods + private void DoValidation(Condition cond) { + if (!this.context.ExpectingValue) { + this.context.Count++; + } + + if (!this.validate) { + return; + } + + if (this.has_reached_end) { + throw new JsonException( + "A complete JSON symbol has already been written"); + } + + switch (cond) { + case Condition.InArray: + if (!this.context.InArray) { + throw new JsonException( + "Can't close an array here"); + } + + break; + + case Condition.InObject: + if (!this.context.InObject || this.context.ExpectingValue) { + throw new JsonException( + "Can't close an object here"); + } + + break; + + case Condition.NotAProperty: + if (this.context.InObject && !this.context.ExpectingValue) { + throw new JsonException( + "Expected a property"); + } + + break; + + case Condition.Property: + if (!this.context.InObject || this.context.ExpectingValue) { + throw new JsonException( + "Can't add a property here"); + } + + break; + + case Condition.Value: + if (!this.context.InArray && + (!this.context.InObject || !this.context.ExpectingValue)) { + throw new JsonException( + "Can't add a value here"); + } + + break; + } + } + + private void Init() { + this.has_reached_end = false; + this.hex_seq = new Char[4]; + this.indentation = 0; + this.indent_value = 4; + this.pretty_print = false; + this.validate = true; + this.lower_case_properties = false; + + this.ctx_stack = new Stack(); + this.context = new WriterContext(); + this.ctx_stack.Push(this.context); + } + + private static void IntToHex(Int32 n, Char[] hex) { + Int32 num; + + for (Int32 i = 0; i < 4; i++) { + num = n % 16; + + if (num < 10) { + hex[3 - i] = (Char)('0' + num); + } else { + hex[3 - i] = (Char)('A' + (num - 10)); + } + + n >>= 4; + } + } + + private void Indent() { + if (this.pretty_print) { + this.indentation += this.indent_value; + } + } + + private void Put(String str) { + if (this.pretty_print && !this.context.ExpectingValue) { + for (Int32 i = 0; i < this.indentation; i++) { + this.writer.Write(' '); + } + } + + this.writer.Write(str); + } + + private void PutNewline() { + PutNewline(true); + } + + private void PutNewline(Boolean add_comma) { + if (add_comma && !this.context.ExpectingValue && + this.context.Count > 1) { + this.writer.Write(','); + } + + if (this.pretty_print && !this.context.ExpectingValue) { + this.writer.Write(Environment.NewLine); + } + } + + private void PutString(String str) { + Put(String.Empty); + + this.writer.Write('"'); + + Int32 n = str.Length; + for (Int32 i = 0; i < n; i++) { + switch (str[i]) { + case '\n': + this.writer.Write("\\n"); + continue; + + case '\r': + this.writer.Write("\\r"); + continue; + + case '\t': + this.writer.Write("\\t"); + continue; + + case '"': + case '\\': + this.writer.Write('\\'); + this.writer.Write(str[i]); + continue; + + case '\f': + this.writer.Write("\\f"); + continue; + + case '\b': + this.writer.Write("\\b"); + continue; + } + + if (str[i] >= 32 && str[i] <= 126) { + this.writer.Write(str[i]); + continue; + } + + // Default, turn into a \uXXXX sequence + IntToHex(str[i], this.hex_seq); + this.writer.Write("\\u"); + this.writer.Write(this.hex_seq); + } + + this.writer.Write('"'); + } + + private void Unindent() { + if (this.pretty_print) { + this.indentation -= this.indent_value; + } + } + #endregion + + + public override String ToString() { + if (this.inst_string_builder == null) { + return String.Empty; + } + return this.inst_string_builder.ToString(); + } + + public void Reset() { + this.has_reached_end = false; + + this.ctx_stack.Clear(); + this.context = new WriterContext(); + this.ctx_stack.Push(this.context); + + if (this.inst_string_builder != null) { + this.inst_string_builder.Remove(0, this.inst_string_builder.Length); + } + } + + public void Write(Boolean boolean) { + DoValidation(Condition.Value); + PutNewline(); + + Put(boolean ? "true" : "false"); + + this.context.ExpectingValue = false; + } + + public void Write(Decimal number) { + DoValidation(Condition.Value); + PutNewline(); + + Put(Convert.ToString(number, number_format)); + + this.context.ExpectingValue = false; + } + + public void Write(Double number) { + DoValidation(Condition.Value); + PutNewline(); + + String str = Convert.ToString(number, number_format); + Put(str); + + if (str.IndexOf('.') == -1 && str.IndexOf('E') == -1) { + this.writer.Write(".0"); + } + + this.context.ExpectingValue = false; + } + + public void Write(Int32 number) { + DoValidation(Condition.Value); + PutNewline(); + + Put(Convert.ToString(number, number_format)); + + this.context.ExpectingValue = false; + } + + public void Write(Int64 number) { + DoValidation(Condition.Value); + PutNewline(); + + Put(Convert.ToString(number, number_format)); + + this.context.ExpectingValue = false; + } + + public void Write(String str) { + DoValidation(Condition.Value); + PutNewline(); + + if (str == null) { + Put("null"); + } else { + PutString(str); + } + + this.context.ExpectingValue = false; + } + + // [CLSCompliant(false)] + public void Write(UInt64 number) { + DoValidation(Condition.Value); + PutNewline(); + + Put(Convert.ToString(number, number_format)); + + this.context.ExpectingValue = false; + } + + public void WriteArrayEnd() { + DoValidation(Condition.InArray); + PutNewline(false); + + this.ctx_stack.Pop(); + if (this.ctx_stack.Count == 1) { + this.has_reached_end = true; + } else { + this.context = this.ctx_stack.Peek(); + this.context.ExpectingValue = false; + } + + Unindent(); + Put("]"); + } + + public void WriteArrayStart() { + DoValidation(Condition.NotAProperty); + PutNewline(); + + Put("["); + + this.context = new WriterContext { + InArray = true + }; + this.ctx_stack.Push(this.context); + + Indent(); + } + + public void WriteObjectEnd() { + DoValidation(Condition.InObject); + PutNewline(false); + + this.ctx_stack.Pop(); + if (this.ctx_stack.Count == 1) { + this.has_reached_end = true; + } else { + this.context = this.ctx_stack.Peek(); + this.context.ExpectingValue = false; + } + + Unindent(); + Put("}"); + } + + public void WriteObjectStart() { + DoValidation(Condition.NotAProperty); + PutNewline(); + + Put("{"); + + this.context = new WriterContext { + InObject = true + }; + this.ctx_stack.Push(this.context); + + Indent(); + } + + public void WritePropertyName(String property_name) { + DoValidation(Condition.Property); + PutNewline(); + String propertyName = (property_name == null || !this.lower_case_properties) ? property_name : property_name.ToLowerInvariant(); + + PutString(propertyName); + + if (this.pretty_print) { + if (propertyName.Length > this.context.Padding) { + this.context.Padding = propertyName.Length; + } + + for (Int32 i = this.context.Padding - propertyName.Length; + i >= 0; i--) { + this.writer.Write(' '); + } + + this.writer.Write(": "); + } else { + this.writer.Write(':'); + } + + this.context.ExpectingValue = true; + } + } } diff --git a/litjson/litjson/bin/Release/litjson.dll b/litjson/litjson/bin/Release/litjson.dll index b47866c..0d437c1 100644 Binary files a/litjson/litjson/bin/Release/litjson.dll and b/litjson/litjson/bin/Release/litjson.dll differ diff --git a/mqtt/M2Mqtt/M2Mqtt.csproj b/mqtt/M2Mqtt/M2Mqtt_4.7.1.csproj similarity index 100% rename from mqtt/M2Mqtt/M2Mqtt.csproj rename to mqtt/M2Mqtt/M2Mqtt_4.7.1.csproj diff --git a/mqtt/M2Mqtt/bin/Release/4.7.1/M2Mqtt.dll b/mqtt/M2Mqtt/bin/Release/4.7.1/M2Mqtt.dll index f58e666..4ddb44d 100644 Binary files a/mqtt/M2Mqtt/bin/Release/4.7.1/M2Mqtt.dll and b/mqtt/M2Mqtt/bin/Release/4.7.1/M2Mqtt.dll differ