private string ReadPropertyKey(byte b) { String propertyKey = null; if (b >= (byte)KEY_TYPES.ShortAsciiName_BEGIN && b <= (byte)KEY_TYPES.ShortAsciiName_END) { int l = b - (byte)KEY_TYPES.ShortAsciiName_BEGIN + 1; byte[] buf = this.ReadBytes(l); if (!SmileUtil.IsASCIIString(buf, out propertyKey)) { throw new FormatException("Wrong encoding."); } if (SharedKeyNames.Count >= 1024) { SharedKeyNames.Clear(); } SharedKeyNames.Add(propertyKey); } else if (b >= (byte)KEY_TYPES.ShortUnicodeName_BEGIN && b <= (byte)KEY_TYPES.ShortUnicodeName_END) { int l = b - (byte)KEY_TYPES.ShortUnicodeName_BEGIN + 1; byte[] buf = this.ReadBytes(l); string name = Encoding.UTF8.GetString(buf, 0, buf.Length); if (SharedKeyNames.Count >= 1024) { SharedKeyNames.Clear(); } SharedKeyNames.Add(name); propertyKey = name; } else if (b >= (byte)KEY_TYPES.ShortSharedKeyNameReference_BEGIN && b <= (byte)KEY_TYPES.ShortSharedKeyNameReference_END) { int i = b - (byte)KEY_TYPES.ShortSharedKeyNameReference_BEGIN; if (this.SharedKeyNames.Count <= i) { throw new IndexOutOfRangeException("invalid shared key index."); } propertyKey = this.SharedKeyNames [i]; } else if (b == (byte)KEY_TYPES.EmptyString) { propertyKey = string.Empty; } else if (b >= (byte)KEY_TYPES.LongSharedKeyNameReference_BEGIN && b <= (byte)KEY_TYPES.LongSharedKeyNameReference_END) { byte nextByte = this.ReadByte(); int offset = (((int)(b & 0x3)) << 8) | nextByte; if (this.SharedKeyNames.Count <= offset) { throw new IndexOutOfRangeException("invalid shared key index."); } propertyKey = this.SharedKeyNames [offset]; } else if (b == (byte)KEY_TYPES.LongUnicodeName) //Long (not-yet-shared) Unicode name. Variable-length String { byte[] buf = ReadFCStringBuff(); if (buf.Length < 64) { throw new ArgumentOutOfRangeException("long unicode property name must be longer than 63bytes: " + buf.Length); } propertyKey = Encoding.UTF8.GetString(buf, 0, buf.Length); if (SharedKeyNames.Count >= 1024) { SharedKeyNames.Clear(); } if (SmileConstant.SHARE_LONG_UNICODE_KEY_NAME) { SharedKeyNames.Add(propertyKey); } } else if (b == (byte)KEY_TYPES.BAD_0X3A) { throw new ArgumentOutOfRangeException("invalid property type: 0x3A"); } else { throw new Exception(string.Format(CultureInfo.CurrentCulture, "bad property name type: {0:X}", b)); } //System.Diagnostics.Debug.WriteLine("propertyKey: {0}", propertyKey); return(propertyKey); }
private void ReadType(SmileType type) { switch (type.TypeClass) { case SmileTypeClass.TinyASCII: { int length = type.Value + 1; SetToken(JsonToken.String, ReadStringInLength(length)); break; } case SmileTypeClass.ShortASCII: { int length = type.Value + 33; SetToken(JsonToken.String, ReadStringInLength(length)); break; } case SmileTypeClass.TinyUnicode: { int length = type.Value + 2; SetToken(JsonToken.String, ReadStringInLength(length)); break; } case SmileTypeClass.ShortUnicode: { int length = type.Value + 34; SetToken(JsonToken.String, ReadStringInLength(length)); break; } case SmileTypeClass.SmallIntegers: { SetToken(JsonToken.Integer, ReadZigzagNumber(type.Value)); break; } case SmileTypeClass.SimpleLiteralsNumbers: { switch (type.Value) { case 0x00: SetToken(JsonToken.String, String.Empty); break; case 0x01: SetToken(JsonToken.Null); break; case 0x02: SetToken(JsonToken.Boolean, false); break; case 0x03: SetToken(JsonToken.Boolean, true); break; case 0x04: SetToken(JsonToken.Integer, ReadZigzag32()); break; case 0x05: SetToken(JsonToken.Integer, ReadZigzag64()); break; case 0x06: SetToken(JsonToken.Integer, ReadBigInteger()); break; case 0x08: SetToken(JsonToken.Float, ReadFloat32()); break; case 0x09: SetToken(JsonToken.Float, ReadFloat64()); break; case 0x0A: SetToken(JsonToken.Float, ReadBigDecimal()); break; default: throw new ArgumentOutOfRangeException(); break; } break; } case SmileTypeClass.START_OBJECT: { SetToken(JsonToken.StartObject); PushContext(SmileType.NewObject()); break; } case SmileTypeClass.START_ARRAY: { SetToken(JsonToken.StartArray); PushContext(SmileType.NewArray()); break; } case SmileTypeClass.Binary: { SmileBinaryType binaryType; byte[] data = ReadBinary(out binaryType); object value = (binaryType != SmileBinaryType.Uuid) ? data : (object)new Guid(data); SetToken(JsonToken.Bytes, value); break; } case SmileTypeClass.Binary7bitEncoded: { byte[] data = Read7BitBinaryWithLength(); SetToken(JsonToken.Bytes, data); break; } case SmileTypeClass.LongASCIIText: { byte[] data = ReadFCStringBuff(); string text; if (!SmileUtil.IsASCIIString(data, out text)) { throw new FormatException("Wrong encoding."); } SetToken(JsonToken.String, text); } break; case SmileTypeClass.LongUnicodeText: { byte[] data = ReadFCStringBuff(); string text = Encoding.UTF8.GetString(data, 0, data.Length); SetToken(JsonToken.String, text); } break; default: throw new ArgumentOutOfRangeException("type", "Unexpected SmileType value: " + type.TypeClass); } }