From 4e2f589d0055ea30f7ec138060cc1c6546646f9c Mon Sep 17 00:00:00 2001 From: Davide Depau Date: Mon, 24 Dec 2018 20:02:18 +0100 Subject: [PATCH] Fix bugs found while testing BlockDeviceInputStream --- .../utils/blockdevice/BlockDeviceInputStream.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/depau/etchdroid/utils/blockdevice/BlockDeviceInputStream.kt b/app/src/main/java/eu/depau/etchdroid/utils/blockdevice/BlockDeviceInputStream.kt index a980cd3..a64c0ff 100644 --- a/app/src/main/java/eu/depau/etchdroid/utils/blockdevice/BlockDeviceInputStream.kt +++ b/app/src/main/java/eu/depau/etchdroid/utils/blockdevice/BlockDeviceInputStream.kt @@ -8,6 +8,7 @@ class BlockDeviceInputStream( private val blockDev: BlockDeviceDriver, private val prefetchBlocks: Int = 2048 ) : InputStream() { + private var neverFetched = true private val byteBuffer = ByteBuffer.allocate(blockDev.blockSize * prefetchBlocks) @@ -32,13 +33,19 @@ class BlockDeviceInputStream( if (blockDev.size - currentBlockOffset < prefetchBlocks) byteBuffer.limit( - (currentBlockOffset - blockDev.size).toInt() * blockDev.blockSize + (blockDev.size - currentBlockOffset).toInt() * blockDev.blockSize ) blockDev.read(currentBlockOffset, byteBuffer) + byteBuffer.flip() } private fun fetchNextIfNeeded() { + if (neverFetched) { + fetch() + neverFetched = false + return + } if (byteBuffer.hasRemaining()) return currentBlockOffset++ @@ -87,9 +94,13 @@ class BlockDeviceInputStream( } val newByteOffset = currentByteOffset + actualSkipDistance - currentBlockOffset = newByteOffset / blockDev.blockSize + val newBlockOffset = newByteOffset / blockDev.blockSize + + if (newBlockOffset != currentBlockOffset) { + currentBlockOffset = newBlockOffset + fetch() + } - fetch() byteBuffer.position((newByteOffset - currentBlockOffset * blockDev.blockSize).toInt()) return actualSkipDistance