Skip to content

Commit b6a167a

Browse files
committed
few improvements on ReadableToSeekable
1 parent bc94c00 commit b6a167a

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

net.lecousin.core/src/main/java/net/lecousin/framework/io/buffering/ReadableToSeekable.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ public void fire(CancelException event) {
155155
}
156156

157157
private void readNextBuffer() {
158+
if (knownSize == ioPos) {
159+
buffering = new AsyncWork<Boolean,IOException>(Boolean.TRUE, null);
160+
return;
161+
}
158162
buffering = new AsyncWork<Boolean,IOException>();
159163
ByteBuffer buffer = ByteBuffer.allocate(8192);
160164
AsyncWork<Integer,IOException> read = io.readFullyAsync(buffer);
@@ -184,8 +188,10 @@ private void readNextBuffer() {
184188
}, buffering);
185189
}
186190

191+
/** Wait to be able to read at least one byte at the given position, return false if this is beyond the end. */
187192
private boolean waitPosition(long pos) throws IOException {
188193
while (pos >= ioPos) {
194+
if (knownSize == ioPos) return false;
189195
buffering.block(0);
190196
if (pos < ioPos) break;
191197
synchronized (this) {
@@ -304,7 +310,7 @@ public void run() {
304310
result.unblockCancel(bufferize.getCancelEvent());
305311
return;
306312
}
307-
if (!bufferize.isSuccessful()) {
313+
if (bufferize.hasError()) {
308314
if (ondone != null) ondone.run(new Pair<>(null, bufferize.getError()));
309315
result.unblockError(bufferize.getError());
310316
return;

net.lecousin.core/src/main/java/net/lecousin/framework/io/out2in/OutputToInput.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected void closeResources(SynchronizationPoint<Exception> ondone) {
4949
}
5050

5151
@Override
52-
public byte getPriority() { return io.getPriority(); }
52+
public byte getPriority() { return io != null ? io.getPriority() : Task.PRIORITY_NORMAL; }
5353

5454
@Override
5555
public void setPriority(byte priority) { io.setPriority(priority); }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package net.lecousin.framework.core.tests.io;
2+
3+
import java.io.File;
4+
import java.util.Collection;
5+
6+
import net.lecousin.framework.concurrent.Task;
7+
import net.lecousin.framework.core.test.io.TestIO;
8+
import net.lecousin.framework.core.test.io.TestReadableSeekable;
9+
import net.lecousin.framework.io.FileIO;
10+
import net.lecousin.framework.io.IO;
11+
import net.lecousin.framework.io.IOUtil;
12+
import net.lecousin.framework.io.buffering.ReadableToSeekable;
13+
import net.lecousin.framework.io.out2in.OutputToInput;
14+
15+
import org.junit.runner.RunWith;
16+
import org.junit.runners.Parameterized;
17+
import org.junit.runners.Parameterized.Parameters;
18+
19+
@RunWith(Parameterized.class)
20+
public class TestReadableToSeekableReadableSeekableUsingOutputToInput extends TestReadableSeekable {
21+
22+
@Parameters(name = "nbBuf = {2}")
23+
public static Collection<Object[]> parameters() {
24+
return TestIO.UsingGeneratedTestFiles.generateTestCases(false);
25+
}
26+
27+
public TestReadableToSeekableReadableSeekableUsingOutputToInput(File testFile, byte[] testBuf, int nbBuf) {
28+
super(testFile, testBuf, nbBuf);
29+
}
30+
31+
@SuppressWarnings("resource")
32+
@Override
33+
protected IO.Readable.Seekable createReadableSeekableFromFile(FileIO.ReadOnly file, long fileSize) throws Exception {
34+
File tmp = File.createTempFile("test", "readableasseekable");
35+
tmp.deleteOnExit();
36+
FileIO.ReadWrite tmpIO = new FileIO.ReadWrite(tmp, Task.PRIORITY_NORMAL);
37+
OutputToInput o2i = new OutputToInput(tmpIO, "test");
38+
IOUtil.copy(file, o2i, fileSize, false, null, 0).listenInline(() -> {
39+
file.closeAsync();
40+
o2i.endOfData();
41+
});
42+
return new ReadableToSeekable(o2i, 512);
43+
}
44+
45+
}

0 commit comments

Comments
 (0)