// Decompiled with JetBrains decompiler // Type: Rei.Fs.JsonObject // Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null // MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0 // Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll using Microsoft.VisualBasic.CompilerServices; using System; using System.Collections.Generic; using System.Globalization; using System.Text; namespace Rei.Fs { public class JsonObject { private const string JSONIgnoreChars = " \t\r\n\0"; private JsonObject.JsonType pType; private string pString; private long pInteger; private double pDouble; private bool pBoolean; private Dictionary pHash; private List pArray; public static JsonObject ReadJson(string str) { JsonObject jsonObject = (JsonObject) null; JsonObject.InnerReadJson(0, str, ref jsonObject); return jsonObject; } private static string GetSubStrArround(string str, int index) { if (string.IsNullOrEmpty(str)) return ""; checked { index -= 30; } if (index < 0) index = 0; int length = 60; if (str.Length < checked (index + length)) length = checked (str.Length - index); return str.Substring(index, length); } private static int InnerReadJson(int index, string str, ref JsonObject value) { try { while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 123) { Dictionary hash = new Dictionary(); JsonObject jsonObject = (JsonObject) null; checked { ++index; } while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 125) { value = new JsonObject(hash); return checked (index + 1); } while (true) { string key = (string) null; index = JsonObject.InnreReadJSON_String(index, str, ref key); while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 58) { checked { ++index; } index = JsonObject.InnerReadJson(index, str, ref jsonObject); hash.Add(key, jsonObject); while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 44) checked { ++index; } else goto label_19; } else break; } throw new Exception(); label_19: if ((int) str[index] != 125) throw new Exception(); checked { ++index; } value = new JsonObject(hash); return index; } if ((int) str[index] == 91) { List array = new List(); JsonObject jsonObject = (JsonObject) null; checked { ++index; } while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 93) { value = new JsonObject(array); return checked (index + 1); } while (true) { index = JsonObject.InnerReadJson(index, str, ref jsonObject); array.Add(jsonObject); while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 44) checked { ++index; } else break; } if ((int) str[index] != 93) throw new Exception(); checked { ++index; } value = new JsonObject(array); return index; } if ((int) str[index] == 34) { string str1 = (string) null; index = JsonObject.InnreReadJSON_String(index, str, ref str1); value = new JsonObject(str1); return index; } if (checked (str.Length - index) > 4 && Operators.CompareString(str.Substring(index, 4).ToLowerInvariant(), "true", false) == 0) { value = new JsonObject(true); return checked (index + 4); } if (checked (str.Length - index) > 5 && Operators.CompareString(str.Substring(index, 5).ToLowerInvariant(), "false", false) == 0) { value = new JsonObject(false); return checked (index + 5); } if (checked (str.Length - index) > 4 && Operators.CompareString(str.Substring(index, 4).ToLowerInvariant(), "null", false) == 0) { value = new JsonObject(); return checked (index + 4); } int startIndex = index; while ("+-0123456789".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] == 101 || (int) str[index] == 69 || (int) str[index] == 46) { while ("+-0123456789.eE".Contains(Conversions.ToString(str[index]))) checked { ++index; } double result; if (double.TryParse(str.Substring(startIndex, checked (index - startIndex)), NumberStyles.Any, (IFormatProvider) CultureInfo.InvariantCulture, out result)) { value = new JsonObject(result); return index; } } else { long result; if (long.TryParse(str.Substring(startIndex, checked (index - startIndex)), out result)) { value = new JsonObject(result); return index; } } throw new Exception(); } catch (InvalidServerResponseException ex) { throw new InvalidServerResponseException("Cannot parse server response. index:" + index.ToString() + " arround: \"" + JsonObject.GetSubStrArround(str, index) + "\""); } } private static int InnreReadJSON_String(int index, string str, ref string value) { try { while (" \t\r\n\0".Contains(Conversions.ToString(str[index]))) checked { ++index; } if ((int) str[index] != 34) throw new Exception(); checked { ++index; } StringBuilder stringBuilder = new StringBuilder(); while (true) { while ((int) str[index] != 92) { if ((int) str[index] != 34) { stringBuilder.Append(str[index]); checked { ++index; } } else { value = stringBuilder.ToString(); return checked (index + 1); } } checked { ++index; } if ((int) str[index] == 98) stringBuilder.Append("\b"); else if ((int) str[index] == 102) stringBuilder.Append("\f"); else if ((int) str[index] == 110) stringBuilder.Append("\n"); else if ((int) str[index] == 114) stringBuilder.Append("\r"); else if ((int) str[index] == 116) stringBuilder.Append("\t"); else if ((int) str[index] == 117) { stringBuilder.Append(Convert.ToChar(Convert.ToUInt32(str.Substring(checked (index + 1), 4), 16))); checked { index += 4; } } else stringBuilder.Append(str[index]); checked { ++index; } } } catch (InvalidServerResponseException ex) { throw new InvalidServerResponseException("Cannot parse server response. index:" + index.ToString() + " arround: \"" + JsonObject.GetSubStrArround(str, index) + "\""); } } public static string EscapeString(string str) { StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 2)); stringBuilder.Append("\""); int num1 = 0; int num2 = checked (str.Length - 1); int index = num1; while (index <= num2) { char ch = str[index]; if (Operators.CompareString(Conversions.ToString(ch), "\b", false) == 0) stringBuilder.Append("\\b"); else if (Operators.CompareString(Conversions.ToString(ch), "\f", false) == 0) stringBuilder.Append("\\f"); else if (Operators.CompareString(Conversions.ToString(ch), "\n", false) == 0) stringBuilder.Append("\\n"); else if (Operators.CompareString(Conversions.ToString(ch), "\r", false) == 0) stringBuilder.Append("\\r"); else if (Operators.CompareString(Conversions.ToString(ch), "\t", false) == 0) stringBuilder.Append("\\t"); else if (Convert.ToInt32(ch) < 32) stringBuilder.Append("\\u" + Convert.ToInt32(ch).ToString("X4")); else if (Operators.CompareString(Conversions.ToString(ch), "\"", false) == 0) { stringBuilder.Append("\\u0022"); } else { if ((int) ch == 34 || (int) ch == 92) stringBuilder.Append("\\"); stringBuilder.Append(ch); } checked { ++index; } } stringBuilder.Append("\""); return stringBuilder.ToString(); } public static string EscapeStringAscii(string str) { StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 2)); stringBuilder.Append("\""); int num1 = 0; int num2 = checked (str.Length - 1); int index = num1; while (index <= num2) { char ch = str[index]; if (Operators.CompareString(Conversions.ToString(ch), "\b", false) == 0) stringBuilder.Append("\\b"); else if (Operators.CompareString(Conversions.ToString(ch), "\f", false) == 0) stringBuilder.Append("\\f"); else if (Operators.CompareString(Conversions.ToString(ch), "\n", false) == 0) stringBuilder.Append("\\n"); else if (Operators.CompareString(Conversions.ToString(ch), "\r", false) == 0) stringBuilder.Append("\\r"); else if (Operators.CompareString(Conversions.ToString(ch), "\t", false) == 0) stringBuilder.Append("\\t"); else if (Convert.ToInt32(ch) < 32 || Convert.ToInt32(ch) >= (int) sbyte.MaxValue) stringBuilder.Append("\\u" + Convert.ToInt32(ch).ToString("X4")); else if (Operators.CompareString(Conversions.ToString(ch), "\"", false) == 0) { stringBuilder.Append("\\u0022"); } else { if ((int) ch == 34 || (int) ch == 92) stringBuilder.Append("\\"); stringBuilder.Append(ch); } checked { ++index; } } stringBuilder.Append("\""); return stringBuilder.ToString(); } public JsonObject() { this.pType = JsonObject.JsonType.Nothing; } public JsonObject(string str) { this.pType = JsonObject.JsonType.String; this.pString = str; } public JsonObject(long number) { this.pType = JsonObject.JsonType.Integer; this.pInteger = number; } public JsonObject(double number) { this.pType = JsonObject.JsonType.Double; this.pDouble = number; } public JsonObject(bool @bool) { this.pType = JsonObject.JsonType.Boolean; this.pBoolean = @bool; } public JsonObject(Dictionary hash) { this.pType = JsonObject.JsonType.Hash; this.pHash = hash; } public JsonObject(List array) { this.pType = JsonObject.JsonType.Array; this.pArray = array; } public JsonObject.JsonType Type { get { return this.pType; } } public string String { get { return this.pString; } } public long Integer { get { return this.pInteger; } } public double Double { get { return this.pDouble; } } public bool Boolean { get { return this.pBoolean; } } public Dictionary Hash { get { return this.pHash; } } public List Array { get { return this.pArray; } } public bool IsNothing { get { return this.Type == JsonObject.JsonType.Nothing; } } public JsonObject this[string name] { get { if (this.Type != JsonObject.JsonType.Hash) return new JsonObject(); if (!this.Hash.ContainsKey(name)) return new JsonObject(); return this.Hash[name]; } set { if (this.Type != JsonObject.JsonType.Hash) throw new InvalidOperationException(); this.Hash.Add(name, value); } } public JsonObject this[int index] { get { if (this.Type != JsonObject.JsonType.Array) return new JsonObject(); if (index < 0) throw new ArgumentOutOfRangeException(); if (index >= this.Array.Count) return new JsonObject(); return this.Array[index]; } set { if (this.Type != JsonObject.JsonType.Array) throw new InvalidOperationException(); if (index < 0) throw new ArgumentOutOfRangeException(); if (index > this.Array.Count) throw new ArgumentOutOfRangeException(); if (index == this.Array.Count) this.Array.Add(value); else this.Array[index] = value; } } public DateTime GetAsDateTime() { if (this.Type == JsonObject.JsonType.Nothing) return DateTime.MinValue; return DateTime.Parse(this.String, (IFormatProvider) CultureInfo.InvariantCulture); } public long IntegerWithDefault(long @default) { if (this.Type == JsonObject.JsonType.Integer) return this.Integer; return @default; } public string StringWithDefault(string @default) { if (this.Type == JsonObject.JsonType.String) return this.String; return @default; } public enum JsonType { String, Integer, Double, Boolean, Nothing, Hash, Array, } } }