DroidFS/app/src/main/java/sushi/hardcore/droidfs/file_viewers/EncryptedVolumeDataSource.kt

65 lines
2.2 KiB
Kotlin
Raw Normal View History

package sushi.hardcore.droidfs.file_viewers
import android.net.Uri
import com.google.android.exoplayer2.C
2021-03-17 21:11:14 +01:00
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DataSpec
import com.google.android.exoplayer2.upstream.TransferListener
2023-02-06 10:52:51 +01:00
import sushi.hardcore.droidfs.Constants
2022-06-18 21:13:16 +02:00
import sushi.hardcore.droidfs.filesystems.EncryptedVolume
import kotlin.math.min
2022-06-18 21:13:16 +02:00
class EncryptedVolumeDataSource(private val encryptedVolume: EncryptedVolume, private val filePath: String): DataSource {
private var fileHandle = -1L
private var fileOffset: Long = 0
private var bytesRemaining: Long = -1
2021-03-17 21:11:14 +01:00
override fun open(dataSpec: DataSpec): Long {
fileHandle = encryptedVolume.openFileReadMode(filePath)
fileOffset = dataSpec.position
val fileSize = encryptedVolume.getAttr(filePath)!!.size
bytesRemaining = if (dataSpec.length == C.LENGTH_UNSET.toLong()) {
fileSize - fileOffset
} else {
min(fileSize, dataSpec.length)
}
return bytesRemaining
}
override fun getUri(): Uri {
2023-02-06 10:52:51 +01:00
return Constants.FAKE_URI
}
override fun close() {
2022-06-18 21:13:16 +02:00
encryptedVolume.closeFile(fileHandle)
}
2021-03-17 21:11:14 +01:00
override fun addTransferListener(transferListener: TransferListener) {
//too lazy to implement this
}
override fun read(buffer: ByteArray, offset: Int, readLength: Int): Int {
val originalOffset = fileOffset
while (fileOffset < originalOffset+readLength && encryptedVolume.read(
fileHandle,
fileOffset,
buffer,
offset+(fileOffset-originalOffset),
(originalOffset+readLength)-fileOffset
).also { fileOffset += it } > 0
) {}
val totalRead = fileOffset-originalOffset
bytesRemaining -= totalRead
2023-02-01 20:06:35 +01:00
return if (totalRead == 0L) {
C.RESULT_END_OF_INPUT
} else {
totalRead.toInt()
}
}
2022-06-18 21:13:16 +02:00
class Factory(private val encryptedVolume: EncryptedVolume, private val filePath: String): DataSource.Factory {
override fun createDataSource(): DataSource {
2022-06-18 21:13:16 +02:00
return EncryptedVolumeDataSource(encryptedVolume, filePath)
}
}
}