예제 #1
0
        internal override int WritePayload(Memory <byte> memory)
        {
            NetworkOrderSerializer.WriteUInt16(memory, _method.ProtocolClassId);
            NetworkOrderSerializer.WriteUInt16(memory.Slice(2), _method.ProtocolMethodId);
            var argWriter = new MethodArgumentWriter(memory.Slice(4));

            _method.WriteArgumentsTo(ref argWriter);
            argWriter.Flush();
            return(4 + argWriter.Offset);
        }
예제 #2
0
            public static int WriteTo(Span <byte> span, ushort channel, MethodBase method)
            {
                const int StartClassId         = StartPayload;
                const int StartMethodArguments = StartPayload + 4;

                NetworkOrderSerializer.WriteUInt32(span.Slice(StartClassId), (uint)method.ProtocolCommandId);
                int offset = method.WriteArgumentsTo(span.Slice(StartMethodArguments));

                return(WriteBaseFrame(span, FrameType.FrameMethod, channel, StartMethodArguments - StartPayload + offset));
            }
예제 #3
0
            public static int WriteTo(Span <byte> span, ushort channel, MethodBase method)
            {
                const int StartClassId         = StartPayload;
                const int StartMethodId        = StartPayload + 2;
                const int StartMethodArguments = StartPayload + 4;

                NetworkOrderSerializer.WriteUInt16(span.Slice(StartClassId), method.ProtocolClassId);
                NetworkOrderSerializer.WriteUInt16(span.Slice(StartMethodId), method.ProtocolMethodId);
                var argWriter = new MethodArgumentWriter(span.Slice(StartMethodArguments));

                method.WriteArgumentsTo(ref argWriter);
                return(WriteBaseFrame(span, FrameType.FrameMethod, channel, StartMethodArguments - StartPayload + argWriter.Offset));
            }
예제 #4
0
        public MethodOutboundFrame(int channel, MethodBase method) : base(FrameType.FrameMethod, channel)
        {
            NetworkBinaryWriter writer = base.GetWriter();

            writer.Write((ushort)method.ProtocolClassId);
            writer.Write((ushort)method.ProtocolMethodId);

            var argWriter = new MethodArgumentWriter(writer);

            method.WriteArgumentsTo(argWriter);

            argWriter.Flush();
        }
예제 #5
0
        public override void WritePayload(NetworkBinaryWriter writer)
        {
            var ms = new MemoryStream();
            var nw = new NetworkBinaryWriter(ms);

            nw.Write(_method.ProtocolClassId);
            nw.Write(_method.ProtocolMethodId);

            var argWriter = new MethodArgumentWriter(nw);

            _method.WriteArgumentsTo(argWriter);
            argWriter.Flush();

            System.ArraySegment <byte> bufferSegment = ms.GetBufferSegment();
            writer.Write((uint)bufferSegment.Count);
            writer.Write(bufferSegment.Array, bufferSegment.Offset, bufferSegment.Count);
        }
예제 #6
0
        public void Transmit(int channelNumber, ConnectionBase connection)
        {
            Frame frame = new Frame(CommonFraming.Constants.FrameMethod, channelNumber);
            NetworkBinaryWriter writer = frame.GetWriter();

            writer.Write((ushort)m_method.ProtocolClassId);
            writer.Write((ushort)m_method.ProtocolMethodId);
            MethodArgumentWriter argWriter = new MethodArgumentWriter(writer);

            m_method.WriteArgumentsTo(argWriter);
            argWriter.Flush();
            connection.WriteFrame(frame);

            if (m_method.HasContent)
            {
                byte[] body = Body;

                frame  = new Frame(CommonFraming.Constants.FrameHeader, channelNumber);
                writer = frame.GetWriter();
                writer.Write((ushort)m_header.ProtocolClassId);
                m_header.WriteTo(writer, (ulong)body.Length);
                connection.WriteFrame(frame);

                int frameMax       = (int)Math.Min(int.MaxValue, connection.FrameMax);
                int bodyPayloadMax = (frameMax == 0)
                    ? body.Length
                    : frameMax - EmptyContentBodyFrameSize;
                for (int offset = 0; offset < body.Length; offset += bodyPayloadMax)
                {
                    int remaining = body.Length - offset;

                    frame  = new Frame(CommonFraming.Constants.FrameBody, channelNumber);
                    writer = frame.GetWriter();
                    writer.Write(body, offset,
                                 (remaining < bodyPayloadMax) ? remaining : bodyPayloadMax);
                    connection.WriteFrame(frame);
                }
            }
        }