@Override public int read(ByteBuffer byteBuffer) { if (position >= partsCount) return 0; ReadableData[] parts = this.parts; ReadableData data = parts[position]; int r = data.read(byteBuffer); while (position < partsCount - 1 && data.isComplete()) { data = parts[++position]; if (!byteBuffer.hasRemaining()) break; r += data.read(byteBuffer); } return r; }
public int read(ByteBufferWrapper wrapper) { return read(wrapper.buffer()); }
public byte[] getBody() { if (body == null) return null; byte[] bytes = new byte[(int) body.length()]; ByteBuffer bb = ByteBuffer.wrap(bytes); body.read(bb); body.unread(bytes.length); return bytes; }
@Override public int read(ByteBuffer byteBuffer) { if (position >= partsCount) return 0; ReadableData[] parts = this.parts; ReadableData data = parts[position]; int r = data.read(byteBuffer); while (position < partsCount - 1 && data.isComplete()) { if (data.hasOwnBuffer()) { position++; break; } data = parts[++position]; if (!byteBuffer.hasRemaining() || data.hasOwnBuffer()) break; r += data.read(byteBuffer); } return r; }
public ByteBufferWrapper(ReadableData data) { this.buffer = ByteBuffer.allocateDirect((int) data.length()); address = EpollCore.address(buffer); data.read(buffer); flip(); }
@Override public ReadableBuilder append(ReadableData readableData) { if (bb.buffer().remaining() > readableData.length()) { readableData.read(bb); try { readableData.close(); } catch (IOException e) { throw Unchecked.rethrow(e); } return this; } else return super.append(readableData); }
protected boolean actualWrite(ReadableData readable, ByteBufferProvider bufferProvider) throws IOException { if (!isAlive()) return false; ByteBufferWrapper bb = readable.getByteBuffer(bufferProvider); bb.clear(); int r = readable.read(bb); if (r > 0) { // int written = epoll.write(this, bb.address, bb.offset(), r); int written = write(bb, bb.offset(), r); bb.clear(); // System.out.println("write: " + written + " (" + readable.complete() + "/" + readable.length() + ")" + " to " + this); if (written != r) { readable.unread(r - written); return false; } return true; } return false; }