Example #1
0
        public void Read <TState>(IOCompleteCallback <TState> completeHeader, TState state)
        {
            this.completeHeader = completeHeader;
            this.state          = state;

            ReadLine(ParseProtocol <TState>, (object)null);
        }
Example #2
0
        void IPipeline.Input <TState>(IOCompleteCallback <TState> callback, TState state)
        {
            if (!input.Disposed)
            {
                throw new InvalidOperationException("input packet is not disposed.");
            }

            try { GetStream().BeginRead(packetBuffer, 0, packetBuffer.Length, CompleteInput <TState>, new object[] { callback, state }); }
            catch (IOException) { Interrupte(); }
            catch (ObjectDisposedException) { Interrupte(); }
        }
Example #3
0
 public void Input <TState>(IOCompleteCallback <TState> callback, TState state = default(TState))
 {
     if (reader.Read())
     {
         callback(this, inputPacket, state);
     }
     else
     {
         pipeline.Input(CompleteBufferInput <TState>, new object[] { callback, state });
     }
 }
Example #4
0
        /// <summary>
        /// 继续读取报文
        /// </summary>
        /// <typeparam name="TReadState"></typeparam>
        /// <param name="callback"></param>
        /// <param name="state"></param>
        protected void ReadPaket <TReadState>(IOCompleteCallback <TReadState> callback, TReadState state)
        {
            if (packet != null)
            {
                // 存在有效报文继续处理
                if (packetOffset < packet.Size)
                {
                    callback(pipeline, this.packet, state);
                    return;
                }
                packet.Dispose();
            }

            pipeline.Input(OnPacketRead <TReadState>, new object[] { callback, state });
        }
Example #5
0
        public void Write <TState>(IPacket packet, IOCompleteCallback <TState> callback, TState state)
        {
            if (!transPacket.Disposed)
            {
                throw new InvalidOperationException("trans is not completed");
            }

            this.outputPacket = packet;
            this.callback     = callback;
            this.state        = state;

            var packetType = !(packet is TunnelPacket) ? (int)TunnelPacketType.Data : (int)((TunnelPacket)packet).Type;

            PacketHeaderSerializer.Serialize(packetType, packet.Size, transPacket.Buffer);

            var dataSize = Math.Min(BufferPacket.BufferSize - TunnelPacket.HeaderSize, outputPacket.Size);

            transPacket.Relive(dataSize + TunnelPacket.HeaderSize);
            if (dataSize > 0) // 具备内容
            {
                Array.Copy(outputPacket.Buffer, 0, transPacket.Buffer, TunnelPacket.HeaderSize, dataSize);
            }
            tunnelPipeline.TransPipeline.Output(transPacket, CompleteTransOutput <TState>, dataSize);
        }
Example #6
0
        void IPipeline.Output <TState>(IPacket packet, IOCompleteCallback <TState> callback, TState state)
        {
            if (packet.Disposed)
            {
                throw new InvalidOperationException("packet is disposed.");
            }

            var args = new object[] { callback, packet, state, 0 };

            if (Interlocked.Exchange(ref outputting, 1) == 1)
            {
                lock (queueLocker)
                {
                    if (outputQueue == null)
                    {
                        outputQueue = new Queue <object[]>(1);
                    }
                    outputQueue.Enqueue(args);
                }
                return;
            }

            packet.Read(OutputPacket <TState>, args);
        }
Example #7
0
 void IPipeline.Output <TState>(IPacket packet, IOCompleteCallback <TState> callback, TState state)
 {
     throw new NotImplementedException();
 }
Example #8
0
 void IPipeline.Input <TState>(IOCompleteCallback <TState> callback, TState state)
 {
     reader.Read(callback, state);
 }
Example #9
0
 public void Output <TState>(IPacket packet, IOCompleteCallback <TState> callback, TState state = default(TState))
 {
     writer.Write(packet, callback, state);
 }