X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fio%2FTimeoutInputStream.java;h=70faff4eabaa0f932352b1886ea5651bfc424ac9;hb=c4cefaa04ec122fc02efb6542451a31fdf722c32;hp=db9eb4a6006897ea1a576c123cea0df0acf23a68;hpb=42873e30bf487bc0b695d60652dba44f82185dbb;p=nikiroo-utils.git diff --git a/src/jexer/io/TimeoutInputStream.java b/src/jexer/io/TimeoutInputStream.java index db9eb4a..70faff4 100644 --- a/src/jexer/io/TimeoutInputStream.java +++ b/src/jexer/io/TimeoutInputStream.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2017 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -37,6 +37,10 @@ import java.io.InputStream; */ public class TimeoutInputStream extends InputStream { + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * The wrapped stream. */ @@ -54,12 +58,9 @@ public class TimeoutInputStream extends InputStream { */ private volatile boolean cancel = false; - /** - * Request that the current read() operation timeout immediately. - */ - public synchronized void cancelRead() { - cancel = true; - } + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Public constructor, at the default timeout of 10000 millis (10 @@ -93,6 +94,10 @@ public class TimeoutInputStream extends InputStream { this.timeoutMillis = timeoutMillis; } + // ------------------------------------------------------------------------ + // InputStream ------------------------------------------------------------ + // ------------------------------------------------------------------------ + /** * Reads the next byte of data from the input stream. * @@ -174,8 +179,11 @@ public class TimeoutInputStream extends InputStream { // available. If not, we throw ReadTimeoutException. long checkTime = System.currentTimeMillis(); while (stream.available() == 0) { - long now = System.currentTimeMillis(); + if (remaining > 0) { + return (b.length - remaining); + } + long now = System.currentTimeMillis(); synchronized (this) { if ((now - checkTime > timeoutMillis) || (cancel == true)) { if (cancel == true) { @@ -209,7 +217,9 @@ public class TimeoutInputStream extends InputStream { "on?"); } remaining -= rc; - return rc; + if (remaining == 0) { + return b.length; + } } } @@ -234,7 +244,7 @@ public class TimeoutInputStream extends InputStream { if (timeoutMillis == 0) { // Block on the read(). - return stream.read(b); + return stream.read(b, off, len); } int remaining = len; @@ -250,6 +260,10 @@ public class TimeoutInputStream extends InputStream { // available. If not, we throw ReadTimeoutException. long checkTime = System.currentTimeMillis(); while (stream.available() == 0) { + if (remaining > 0) { + return (len - remaining); + } + long now = System.currentTimeMillis(); synchronized (this) { if ((now - checkTime > timeoutMillis) || (cancel == true)) { @@ -283,7 +297,10 @@ public class TimeoutInputStream extends InputStream { "available, but read() returned -1. What is going " + "on?"); } - return rc; + remaining -= rc; + if (remaining == 0) { + return len; + } } } @@ -362,4 +379,15 @@ public class TimeoutInputStream extends InputStream { return stream.skip(n); } + // ------------------------------------------------------------------------ + // TimeoutInputStream ----------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Request that the current read() operation timeout immediately. + */ + public synchronized void cancelRead() { + cancel = true; + } + }