示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }