Mercurial > hg > Database > jungle-sharp
diff src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/persistent/msgpack/src/MsgPackReader.cs @ 10:abe0c247f5a5
Add Network module. but, unComplete NetworkDefaultJungleTreeEditor.cs
author | Kazuma Takeda <kazuma-arashi@hotmail.co.jp> |
---|---|
date | Sun, 23 Oct 2016 07:40:50 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/persistent/msgpack/src/MsgPackReader.cs Sun Oct 23 07:40:50 2016 +0900 @@ -0,0 +1,258 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using System.IO; +using System.Text; + +namespace MsgPack +{ + public class MsgPackReader + { + Stream _strm; + byte[] _tmp0 = new byte[8]; + byte[] _tmp1 = new byte[8]; + + Encoding _encoding = Encoding.UTF8; + //Decoder _decoder = Encoding.UTF8.GetDecoder (); + byte[] _buf = new byte[64]; + + public MsgPackReader (Stream strm) + { + _strm = strm; + } + + public TypePrefixes Type { get; private set; } + + public bool ValueBoolean { get; private set; } + public uint Length { get; private set; } + + public uint ValueUnsigned { get; private set; } + public ulong ValueUnsigned64 { get; private set; } + + public int ValueSigned { get; private set; } + public long ValueSigned64 { get; private set; } + + public float ValueFloat { get; private set; } + public double ValueDouble { get; private set; } + + public bool IsSigned () + { + return this.Type == TypePrefixes.NegativeFixNum || + this.Type == TypePrefixes.PositiveFixNum || + this.Type == TypePrefixes.Int8 || + this.Type == TypePrefixes.Int16 || + this.Type == TypePrefixes.Int32; + } + + public bool IsBoolean () + { + return this.Type == TypePrefixes.True || this.Type == TypePrefixes.False; + } + + public bool IsSigned64 () + { + return this.Type == TypePrefixes.Int64; + } + + public bool IsUnsigned () + { + return this.Type == TypePrefixes.PositiveFixNum || + this.Type == TypePrefixes.UInt8 || + this.Type == TypePrefixes.UInt16 || + this.Type == TypePrefixes.UInt32; + } + + public bool IsUnsigned64 () + { + return this.Type == TypePrefixes.UInt64; + } + + public bool IsRaw () + { + return this.Type == TypePrefixes.FixRaw || this.Type == TypePrefixes.Raw16 || this.Type == TypePrefixes.Raw32; + } + + public bool IsArray () + { + return this.Type == TypePrefixes.FixArray || this.Type == TypePrefixes.Array16 || this.Type == TypePrefixes.Array32; + } + + public bool IsMap () + { + return this.Type == TypePrefixes.FixMap || this.Type == TypePrefixes.Map16 || this.Type == TypePrefixes.Map32; + } + + public bool Read () + { + byte[] tmp0 = _tmp0, tmp1 = _tmp1; + int x = _strm.ReadByte (); + if (x < 0) + return false; // EOS + + if (x >= 0x00 && x <= 0x7f) { + this.Type = TypePrefixes.PositiveFixNum; + } else if (x >= 0xe0 && x <= 0xff) { + this.Type = TypePrefixes.NegativeFixNum; + } else if (x >= 0xa0 && x <= 0xbf) { + this.Type = TypePrefixes.FixRaw; + } else if (x >= 0x90 && x <= 0x9f) { + this.Type = TypePrefixes.FixArray; + } else if (x >= 0x80 && x <= 0x8f) { + this.Type = TypePrefixes.FixMap; + } else { + this.Type = (TypePrefixes)x; + } + + switch (this.Type) { + case TypePrefixes.Nil: + break; + case TypePrefixes.False: + ValueBoolean = false; + break; + case TypePrefixes.True: + ValueBoolean = true; + break; + case TypePrefixes.Float: + _strm.Read (tmp0, 0, 4); + if (BitConverter.IsLittleEndian) { + tmp1[0] = tmp0[3]; + tmp1[1] = tmp0[2]; + tmp1[2] = tmp0[1]; + tmp1[3] = tmp0[0]; + ValueFloat = BitConverter.ToSingle (tmp1, 0); + } else { + ValueFloat = BitConverter.ToSingle (tmp0, 0); + } + break; + case TypePrefixes.Double: + _strm.Read (tmp0, 0, 8); + if (BitConverter.IsLittleEndian) { + tmp1[0] = tmp0[7]; + tmp1[1] = tmp0[6]; + tmp1[2] = tmp0[5]; + tmp1[3] = tmp0[4]; + tmp1[4] = tmp0[3]; + tmp1[5] = tmp0[2]; + tmp1[6] = tmp0[1]; + tmp1[7] = tmp0[0]; + ValueDouble = BitConverter.ToDouble (tmp1, 0); + } else { + ValueDouble = BitConverter.ToDouble (tmp0, 0); + } + break; + case TypePrefixes.NegativeFixNum: + ValueSigned = (x & 0x1f) - 0x20; + break; + case TypePrefixes.PositiveFixNum: + ValueSigned = x & 0x7f; + ValueUnsigned = (uint)ValueSigned; + break; + case TypePrefixes.UInt8: + x = _strm.ReadByte (); + if (x < 0) + throw new FormatException (); + ValueUnsigned = (uint)x; + break; + case TypePrefixes.UInt16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + ValueUnsigned = ((uint)tmp0[0] << 8) | (uint)tmp0[1]; + break; + case TypePrefixes.UInt32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + ValueUnsigned = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3]; + break; + case TypePrefixes.UInt64: + if (_strm.Read (tmp0, 0, 8) != 8) + throw new FormatException (); + ValueUnsigned64 = ((ulong)tmp0[0] << 56) | ((ulong)tmp0[1] << 48) | ((ulong)tmp0[2] << 40) | ((ulong)tmp0[3] << 32) | ((ulong)tmp0[4] << 24) | ((ulong)tmp0[5] << 16) | ((ulong)tmp0[6] << 8) | (ulong)tmp0[7]; + break; + case TypePrefixes.Int8: + x = _strm.ReadByte (); + if (x < 0) + throw new FormatException (); + ValueSigned = (sbyte)x; + break; + case TypePrefixes.Int16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + ValueSigned = (short)((tmp0[0] << 8) | tmp0[1]); + break; + case TypePrefixes.Int32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + ValueSigned = (tmp0[0] << 24) | (tmp0[1] << 16) | (tmp0[2] << 8) | tmp0[3]; + break; + case TypePrefixes.Int64: + if (_strm.Read (tmp0, 0, 8) != 8) + throw new FormatException (); + ValueSigned64 = ((long)tmp0[0] << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32) | ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7]; + break; + case TypePrefixes.FixRaw: + Length = (uint)(x & 0x1f); + break; + case TypePrefixes.FixArray: + case TypePrefixes.FixMap: + Length = (uint)(x & 0xf); + break; + case TypePrefixes.Raw16: + case TypePrefixes.Array16: + case TypePrefixes.Map16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + Length = ((uint)tmp0[0] << 8) | (uint)tmp0[1]; + break; + case TypePrefixes.Raw32: + case TypePrefixes.Array32: + case TypePrefixes.Map32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + Length = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3]; + break; + default: + throw new FormatException (); + } + return true; + } + + public int ReadValueRaw (byte[] buf, int offset, int count) + { + return _strm.Read (buf, offset, count); + } + + public string ReadRawString () + { + return ReadRawString (_buf); + } + + public string ReadRawString (byte[] buf) + { + if (this.Length < buf.Length) { + if (ReadValueRaw (buf, 0, (int)this.Length) != this.Length) + throw new FormatException (); + return _encoding.GetString (buf, 0, (int)this.Length); + } + + // Poor implementation + byte[] tmp = new byte[(int)this.Length]; + if (ReadValueRaw (tmp, 0, tmp.Length) != tmp.Length) + throw new FormatException (); + return _encoding.GetString (tmp); + } + } +}