X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;ds=inline;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FNextableInputStream.java;h=62156e3e4285f53bb1d0e72e4be95f0f91ea3452;hb=395da24290903cdae510f595a381abb833a0cfc2;hp=4a6e0abc672abf441ef6acf51f9db9ed1d625585;hpb=8e76f6ab13a8a4a651f2518b6c91d5e6424c7922;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/streams/NextableInputStream.java b/src/be/nikiroo/utils/streams/NextableInputStream.java index 4a6e0ab..62156e3 100644 --- a/src/be/nikiroo/utils/streams/NextableInputStream.java +++ b/src/be/nikiroo/utils/streams/NextableInputStream.java @@ -2,6 +2,8 @@ package be.nikiroo.utils.streams; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; /** * This {@link InputStream} can be separated into sub-streams (you can process @@ -85,6 +87,8 @@ public class NextableInputStream extends BufferedInputStream { * {@link IOException}s can happen when we have no data available in the * buffer; in that case, we fetch more data to know if we can have a next * sub-stream or not. + *
+ * This is can be a blocking call when data need to be fetched. * * @return TRUE if we unblocked the next sub-stream, FALSE if not * @@ -101,6 +105,8 @@ public class NextableInputStream extends BufferedInputStream { *
* That is, the next stream, if any, will be the last one and will not be * subject to the {@link NextableInputStreamStep}. + *
+ * This is can be a blocking call when data need to be fetched. * * @return TRUE if we unblocked the next sub-stream, FALSE if not * @@ -115,16 +121,19 @@ public class NextableInputStream extends BufferedInputStream { * Check if this stream is totally spent (no more data to read or to * process). *
- * Note: an empty stream that is still not started will return FALSE, as we - * don't know yet if it is empty. + * Note: when the stream is divided into sub-streams, each sub-stream will + * report it is eof when emptied. * * @return TRUE if it is + * + * @throws IOException + * in case of I/O error */ @Override - public boolean eof() { + public boolean eof() throws IOException { return super.eof(); } - + /** * Check if we still have some data in the buffer and, if not, fetch some. * @@ -138,7 +147,7 @@ public class NextableInputStream extends BufferedInputStream { protected boolean preRead() throws IOException { if (!stopped) { boolean bufferChanged = super.preRead(); - checkBuffer(true); + checkBuffer(bufferChanged); return bufferChanged; } @@ -172,12 +181,12 @@ public class NextableInputStream extends BufferedInputStream { * the {@link NextableInputStreamStep} */ private void checkBuffer(boolean newBuffer) { - if (step != null && stop > 0) { + if (step != null && stop >= 0) { if (newBuffer) { step.clearBuffer(); } - int stopAt = step.stop(buffer, start, stop); + int stopAt = step.stop(buffer, start, stop, eof); if (stopAt >= 0) { stop = stopAt; eof = true; @@ -189,6 +198,8 @@ public class NextableInputStream extends BufferedInputStream { /** * The implementation of {@link NextableInputStream#next()} and * {@link NextableInputStream#nextAll()}. + *
+ * This is can be a blocking call when data need to be fetched. * * @param all * TRUE for {@link NextableInputStream#nextAll()}, FALSE for @@ -209,27 +220,48 @@ public class NextableInputStream extends BufferedInputStream { if (all) { step = null; } - - return true; } if (step != null && !hasMoreData() && stopped) { stop = step.getResumeLen(); start += step.getResumeSkip(); - eof = false; + eof = step.getResumeEof(); + stopped = false; if (all) { step = null; } - if (!preRead()) { - checkBuffer(false); - } + checkBuffer(false); + } + + // consider that if EOF, there is no next + if (start >= stop) { + // Make sure, block if necessary + preRead(); - // consider that if EOF, there is no next return hasMoreData(); } - return false; + return true; + } + + public String DEBUG() { + String data = ""; + if (stop > 0) { + try { + data = new String(Arrays.copyOfRange(buffer, 0, stop), "UTF-8"); + } catch (UnsupportedEncodingException e) { + } + if (data.length() > 50) { + data = data.substring(0, 47) + "..."; + } + } + String rep = String.format( + "Nextable %s: %d -> %d [eof: %s] [more data: %s]: %s", + (stopped ? "stopped" : "running"), start, stop, "" + eof, "" + + hasMoreData(), data); + + return rep; } }