Пример #1
0
        private bool TryReadFromUnderlying()
        {
            // Read payload header
            if (!TryRead(_underlying, _payloadBuffer.Data, 0, sizeof(PayloadHeader)))
            {
                _position = _length = 0;
                return(false);
            }

            var payload = (PayloadHeader *)_payloadBuffer.Ptr;

            // Rescale buffers if necessary
            if (payload->DataLength > _dataCapacity)
            {
                _dataBuffer.UpdateSize(_dataCapacity = payload->DataLength);
            }
            if (payload->PayloadLength > _payloadCapacity)
            {
                _payloadBuffer.UpdateSize(_payloadCapacity = payload->PayloadLength);
            }

            // Read payload
            if (!TryRead(_underlying, _payloadBuffer.Data, sizeof(PayloadHeader), payload->PayloadLength + 1))
            {
                _position = _length = 0;
                return(false);
            }

            // Decode payload to the data buffer
            _codec.Decode(_payloadBuffer.Ptr + sizeof(PayloadHeader), payload->PayloadLength, (T *)_dataBuffer.Ptr);
            _length   = payload->DataLength;
            _position = 0;

            // Validate the checksum
            if (*(_payloadBuffer.Ptr + sizeof(PayloadHeader) + payload->PayloadLength) != CHECKSUM)
            {
                throw new CorruptedDataException("Invalid checksum at the end of column block");
            }

            return(true);
        }