Example #1
0
 /// <summary>
 /// Reads the value.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <returns>System.Object.</returns>
 public override object ReadValue(IStreamReader reader, ISerializeContext context)
 {
     return(NullableRead(reader, () =>
     {
         return reader.ReadInt64();
     }));
 }
Example #2
0
 public override object ReadValue(IStreamReader reader, ISerializeContext context)
 {
     return(NullableRead(reader, () =>
     {
         long timeTicks = reader.ReadInt64();
         return TimeSpan.FromTicks(timeTicks);
     }));
 }
Example #3
0
        public override object ReadValue(IStreamReader reader, ISerializeContext context)
        {
            return(NullableRead(reader, () =>
            {
                var ticks = reader.ReadInt64();

                return new DateTime(ticks);
            }));
        }
Example #4
0
        //public Byte[] ToByteArray()
        //{
        //    MemoryStream ms
        //        = new MemoryStream(128);

        //    BinaryWriter bw = new BinaryWriter(ms);

        //    byte[] paddedName = new byte[64];
        //    Array.Copy(entryName, paddedName, entryName.Length);

        //    bw.Write(paddedName);
        //    bw.Write(nameLength);
        //    bw.Write((byte)stgType);
        //    bw.Write((byte)stgColor);
        //    bw.Write(leftSibling);
        //    bw.Write(rightSibling);
        //    bw.Write(child);
        //    bw.Write(storageCLSID.ToByteArray());
        //    bw.Write(stateBits);
        //    bw.Write(creationDate);
        //    bw.Write(modifyDate);
        //    bw.Write(startSetc);
        //    bw.Write(size);

        //    return ms.ToArray();
        //}

        public void Read(Stream stream, CFSVersion ver = CFSVersion.Ver_3)
        {
            IStreamReader rw = stream.ToStreamReader();

            entryName  = rw.ReadBytes(64);
            nameLength = rw.ReadUInt16();
            stgType    = (StgType)rw.ReadByte();
            //rw.ReadByte();//Ignore color, only black tree
            stgColor     = (StgColor)rw.ReadByte();
            leftSibling  = rw.ReadInt32();
            rightSibling = rw.ReadInt32();
            child        = rw.ReadInt32();

            // Thanks to bugaccount (BugTrack id 3519554)
            if (stgType == StgType.StgInvalid)
            {
                leftSibling  = NOSTREAM;
                rightSibling = NOSTREAM;
                child        = NOSTREAM;
            }

            storageCLSID = new Guid(rw.ReadBytes(16));
            stateBits    = rw.ReadInt32();
            CreationDate = rw.ReadBytes(8);
            ModifyDate   = rw.ReadBytes(8);
            startSetc    = rw.ReadInt32();

            if (ver == CFSVersion.Ver_3)
            {
                // avoid dirty read for version 3 files (max size: 32bit integer)
                // where most significant bits are not initialized to zero

                size = rw.ReadInt32();
                rw.ReadInt32(); //rw.ReadBytes(4); //discard most significant 4 (possibly) dirty bytes
            }
            else
            {
                size = rw.ReadInt64();
            }
        }
Example #5
0
        /// <summary>
        /// 解析一个数据包
        /// 不足一个封包时返回null
        /// </summary>
        /// <param name="stream">接收到的历史数据</param>
        /// <param name="packet">数据包</param>
        /// <returns></returns>
        public static bool Parse(IStreamReader stream, out FastPacket packet)
        {
            if (stream.Length < 1 || stream[0] != FastPacket.Mark)
            {
                packet = null;
                return(false);
            }

            if (stream.Length < 5)
            {
                packet = null;
                return(true);
            }

            stream.Position = 1;
            const int packetMinSize = 16;
            var       totalBytes    = stream.ReadInt32();

            if (totalBytes < packetMinSize)
            {
                packet = null;
                return(false);
            }

            // 数据包未接收完整
            if (stream.Length < totalBytes)
            {
                packet = null;
                return(true);
            }

            // api名称数据长度
            var apiNameLength = stream.ReadByte();

            if (totalBytes < apiNameLength + packetMinSize)
            {
                packet = null;
                return(false);
            }

            // api名称数据
            var apiNameBytes = stream.ReadArray(apiNameLength);
            // 标识符
            var id = stream.ReadInt64();
            // 是否为客户端封包
            var isFromClient = stream.ReadBoolean();
            // 是否异常
            var isException = stream.ReadBoolean();
            // 实体数据
            var body = stream.ReadArray(totalBytes - stream.Position);

            // 清空本条数据
            stream.Clear(totalBytes);

            var apiName = Encoding.UTF8.GetString(apiNameBytes);

            packet = new FastPacket(apiName, id, isFromClient)
            {
                TotalBytes    = totalBytes,
                ApiNameLength = apiNameLength,
                IsException   = isException,
                Body          = body
            };
            return(true);
        }
Example #6
0
        private void ReadData(int dataTypeCd, WireMessage message, IStreamReader reader)
        {
            switch ((TypeCode)dataTypeCd)
            {
            case TypeCode.Boolean:
                message.Data = reader.ReadBoolean();
                break;

            case TypeCode.Byte:
                message.Data = reader.ReadByte();
                break;

            case TypeCode.Char:
                message.Data = reader.ReadChar();
                break;

            case TypeCode.DateTime:
                message.Data = new DateTime(reader.ReadInt64());
                break;

            case TypeCode.DBNull:
                reader.ReadByte();
                message.Data = DBNull.Value;
                break;

            case TypeCode.Decimal:
                message.Data = reader.ReadDecimal();
                break;

            case TypeCode.Double:
                message.Data = reader.ReadDouble();
                break;

            case TypeCode.Empty:
                reader.ReadByte();
                break;

            case TypeCode.Int16:
                message.Data = reader.ReadInt16();
                break;

            case TypeCode.Int32:
                message.Data = reader.ReadInt32();
                break;

            case TypeCode.Int64:
                message.Data = reader.ReadInt64();
                break;

            case TypeCode.SByte:
                message.Data = reader.ReadSByte();
                break;

            case TypeCode.Single:
                message.Data = reader.ReadSingle();
                break;

            case TypeCode.String:
                message.Data = ReadString(reader);
                break;

            case TypeCode.UInt16:
                message.Data = reader.ReadUInt16();
                break;

            case TypeCode.UInt32:
                message.Data = reader.ReadUInt32();
                break;

            case TypeCode.UInt64:
                message.Data = reader.ReadUInt64();
                break;

            default:
            {
                var len = reader.ReadInt32();
                if (len > 0)
                {
                    using (var tempStream = new ChunkedStream())
                    {
                        var chunkSize = tempStream.ChunkSize;
                        while (len > 0)
                        {
                            var bytes = reader.ReadBytes(chunkSize);

                            var readLen = bytes?.Length ?? 0;
                            if (readLen == 0)
                            {
                                throw new Exception(SerializationErrors.StreamNotContainingValidWireMessage);
                            }

                            len -= readLen;
                            tempStream.Write(bytes, 0, readLen);
                        }

                        tempStream.Position = 0;
                        message.Data        = GetSerializer().Deserialize(tempStream);
                    }
                }
            }
            break;
            }
        }