Ejemplo n.º 1
0
        /// <summary>
        /// Constructs a state representing a message root object.
        /// </summary>
        /// <param name="frame">the message</param>
        /// <returns></returns>
        public static DeserializerState CreateRoot(WireFrame frame)
        {
            var state = new DeserializerState(frame.Segments);

            state.DecodePointer(0);
            return(state);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Sends a message over the stream.
        /// </summary>
        /// <param name="frame">Message to be sent</param>
        /// <exception cref="InvalidOperationException">The underlying stream does not support writing.</exception>
        /// <exception cref="ArgumentException">The message does not provide at least one segment, or one of its segments is empty.</exception>
        /// <exception cref="IOException">An I/O error occurs.</exception>
        /// <exception cref="ObjectDisposedException">This instance or stream is diposed.</exception>
        public void Send(WireFrame frame)
        {
            if (_writer == null)
            {
                throw new InvalidOperationException("Stream is not writable");
            }

            if (frame.Segments == null)
            {
                throw new ArgumentException("Do not pass default(WireFrame)");
            }

            if (frame.Segments.Count == 0)
            {
                throw new ArgumentException("Expected at least one segment");
            }

            foreach (var segment in frame.Segments)
            {
                if (segment.Length == 0)
                {
                    throw new ArgumentException("Segment must not have zero length");
                }
            }

            lock (_writeLock)
            {
                foreach (var tracer in _tracers)
                {
                    tracer.TraceFrame(FrameDirection.Tx, frame);
                }

                _writer.Write(frame.Segments.Count - 1);

                foreach (var segment in frame.Segments)
                {
                    _writer.Write(segment.Length);
                }

                if ((frame.Segments.Count & 1) == 0)
                {
                    // Padding
                    _writer.Write(0);
                }

                foreach (var segment in frame.Segments)
                {
#if NETSTANDARD2_0
                    var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span).ToArray();
#else
                    var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span);
#endif
                    _writer.Write(bytes);
                }

                _writer.Flush();
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Sends a message over the stream.
        /// </summary>
        /// <param name="frame">Message to be sent</param>
        /// <exception cref="InvalidOperationException">The underlying stream does not support writing.</exception>
        /// <exception cref="ArgumentException">The message does not provide at least one segment, or one of its segments is empty.</exception>
        /// <exception cref="IOException">An I/O error occurs.</exception>
        /// <exception cref="ObjectDisposedException">This instance or stream is diposed.</exception>
        public void Send(WireFrame frame)
        {
            if (_writer == null)
            {
                throw new InvalidOperationException("Stream is not writable");
            }

            if (frame.Segments == null)
            {
                throw new ArgumentException("Do not pass default(WireFrame)");
            }

            if (frame.Segments.Count == 0)
            {
                throw new ArgumentException("Expected at least one segment");
            }

            foreach (var segment in frame.Segments)
            {
                if (segment.Length == 0)
                {
                    throw new ArgumentException("Segment must not have zero length");
                }
            }

            lock (_writeLock)
            {
                _writer.Write(frame.Segments.Count - 1);

                foreach (var segment in frame.Segments)
                {
                    _writer.Write(segment.Length);
                }

                if ((frame.Segments.Count & 1) == 0)
                {
                    // Padding
                    _writer.Write(0);
                }

                foreach (var segment in frame.Segments)
                {
                    var bytes = MemoryMarshal.Cast <ulong, byte>(segment.Span);

                    _writer.Write(bytes);
                }
            }
        }