Esempio n. 1
0
        public static int transferRemaining(ByteBuffer src, ByteBuffer trg)
        {
            int xfer = Math.Min(src.remaining(), trg.remaining());

            trg.put(src.array(), src.position() + src.arrayOffset(), xfer);
            src.position(src.position() + xfer);
            return(xfer);
        }
Esempio n. 2
0
        public static int transferUpTo(ByteBuffer src, ByteBuffer trg, int maxCount)
        {
            int xfer = Math.Min(Math.Min(src.remaining(), trg.remaining()), maxCount);

            //int oldLimit = src.limit();
            //src.limit( src.position() + xfer );
            trg.put(src.array(), src.position() + src.arrayOffset(), xfer);
            src.position(src.position() + xfer);
            return(xfer);
        }
Esempio n. 3
0
        private LoopCtrl xmitAction_EvalChannelData()
        {
            ChabuChannelImpl ch = PopNextPriorizedChannelRequest(xmitChannelRequestData);

            if (ch != null)
            {
                seqPacketPayload = ch.handleXmitData(this, xmitBuf, RemoteRecvPacketSize - ChabuImpl.SEQ_MIN_SZ);
                if (seqPacketPayload == null)
                {
                    return(LoopCtrl.None);
                }
                seqChannel = ch;
                int paddingCount = (4 - (seqPacketPayload.remaining() & 3)) % 4;
                seqPadding.clear().limit(paddingCount);

                Utils.ensure(xmitBuf.getInt(0) == xmitBuf.remaining() + seqPacketPayload.remaining() + seqPadding.remaining(),
                             ChabuErrorCode.ASSERT, "{0} = {1} + {2} + {3}", xmitBuf.getInt(0), xmitBuf.remaining(), seqPacketPayload.remaining(), seqPadding.remaining());
            }
            return(xmitBuf.hasRemaining() ? LoopCtrl.Continue : LoopCtrl.None);
        }
Esempio n. 4
0
        public void recv(ByteChannel channel)
        {
            cancelCurrentReceive = false;
            while (!cancelCurrentReceive)
            {
                if (packetType == PacketType.NONE)
                {
                    Utils.ensure(recvBuf.limit() >= HEADER_RECV_SZ, ChabuErrorCode.UNKNOWN, "unknown header size: {0}", recvBuf);
                    channel.read(recvBuf);
                    if (recvBuf.position() < 8)
                    {
                        break;
                    }

                    packetSize = recvBuf.getInt(0);
                    int packetTypeId = recvBuf.getInt(4) & 0xFF;
                    packetType = PacketTypeExtension.findPacketType(packetTypeId);
                    if (packetType == PacketType.NONE)
                    {
                        throw new ChabuException(string.Format("Packet type 0x{0:X2} unexpected: packetSize {1}", packetTypeId, packetSize));
                    }
                }

                if (packetType != PacketType.SEQ)
                {
                    Utils.ensure(packetSize <= Constants.MAX_RECV_LIMIT_LOW, ChabuErrorCode.UNKNOWN, "unknown header size");
                    if (packetSize > recvBuf.position())
                    {
                        recvBuf.limit(packetSize);
                        channel.read(recvBuf);
                        if (recvBuf.hasRemaining())
                        {
                            // not fully read, try next time
                            break;
                        }
                    }
                }
                else
                {
                    if (HEADER_RECV_SZ > recvBuf.position())
                    {
                        recvBuf.limit(HEADER_RECV_SZ);
                        channel.read(recvBuf);
                        if (recvBuf.hasRemaining())
                        {
                            // not fully read, try next time
                            break;
                        }
                    }
                }

                recvBuf.flip();
                recvBuf.position(8);

                if (packetType != PacketType.SEQ)
                {
                    Utils.ensure(packetSize <= Constants.MAX_RECV_LIMIT_LOW, ChabuErrorCode.UNKNOWN, "unknown header size");
                    switch (packetType)
                    {
                    case PacketType.SETUP: processRecvSetup();    break;

                    case PacketType.ACCEPT: processRecvAccept();   break;

                    case PacketType.ABORT: processRecvAbort();    break;

                    case PacketType.ARM: processRecvArm();      break;

                    case PacketType.DAVAIL: processRecvDavail();   break;

                    case PacketType.NOP: processRecvNop();      break;

                    case PacketType.RST_REQ: processRecvResetReq(); break;

                    case PacketType.RST_ACK: processRecvResetAck(); break;

                    default: break;
                    }
                    Utils.ensure(recvBuf.remaining() < HEADER_RECV_SZ, ChabuErrorCode.ASSERT, "After normal command, the remaining bytes must be below the HEADER_RECV_SZ limit, but is {0}", recvBuf.limit());
                    Utils.ensure(recvBuf.position() == packetSize, ChabuErrorCode.ASSERT, "After normal command, the remaining bytes must be below the HEADER_RECV_SZ limit, but is {0}", recvBuf.limit());
                    recvBuf.compact();
                    recvBuf.limit(HEADER_RECV_SZ);
                    packetType = PacketType.NONE;
                    continue;
                }
                else
                {
                    processSeq(channel);

                    bool isContinuingSeq = packetType == PacketType.SEQ;
                    if (isContinuingSeq)
                    {
                        break;
                    }

                    continue;
                }
            }
        }