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); }
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); }
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); }
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; } } }