@Override public boolean isComplete() { return position == partsCount - 1 && parts[position].isComplete(); }
@Override public long remains() { long l = 0; ReadableData[] parts = this.parts; for (int i = partsCount - 1; i >= 0; i--) { if (parts[i].isComplete()) break; l += parts[i].remains(); } return l; }
@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; }
@Override public long complete() { long l = 0; ReadableData[] parts = this.parts; int position = this.position; for (int i = 0; i <= position; i++) { ReadableData part = parts[i]; if (parts[i].isComplete()) l += parts[i].length(); else l += part.complete(); } return l; }
public boolean write(ByteBufferProvider bufferProvider) { Queue<ReadableData> queue = this.sending; if (queue == null) return true; while (!queue.isEmpty() && writer.compareAndSet(null, bufferProvider)) { try { ReadableData readable; while ((readable = queue.peek()) != null) { while (!readable.isComplete() && actualWrite(readable, bufferProvider)) { } if (!readable.isComplete()) return false; queue.poll(); readable.close(); readable.onComplete(); onWriteData(readable, !queue.isEmpty()); } } catch (Exception e) { e.printStackTrace(); close(); return false; } finally { writer.set(null); } } return true; }
@Override protected boolean actualWrite(ReadableData readable, ByteBufferProvider bufferProvider) throws IOException { boolean b = super.actualWrite(readable, bufferProvider); if (!b && !readable.isComplete()) pauses.incrementAndGet(); return b; } }
if (writer.compareAndSet(null, bufferProvider)) { try { while (!readable.isComplete() && actualWrite(readable, bufferProvider)) { if (!readable.isComplete()) { safeCreateQueueIfNotExists(); sending.addFirst(readable);
@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; }