2020-07-26 21:16:06 +02:00
|
|
|
package sushi.hardcore.droidfs.file_viewers
|
|
|
|
|
|
|
|
import android.net.Uri
|
2023-09-10 19:11:45 +02:00
|
|
|
import androidx.media3.common.C
|
|
|
|
import androidx.annotation.OptIn
|
|
|
|
import androidx.media3.common.util.UnstableApi
|
|
|
|
import androidx.media3.datasource.DataSource
|
|
|
|
import androidx.media3.datasource.DataSpec
|
|
|
|
import androidx.media3.datasource.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
|
2020-08-01 15:39:00 +02:00
|
|
|
import kotlin.math.min
|
2020-07-26 21:16:06 +02:00
|
|
|
|
2023-09-10 19:11:45 +02:00
|
|
|
@OptIn(UnstableApi::class)
|
|
|
|
class EncryptedVolumeDataSource(private val encryptedVolume: EncryptedVolume, private val filePath: String):
|
|
|
|
DataSource {
|
2022-06-18 21:13:16 +02:00
|
|
|
private var fileHandle = -1L
|
2020-07-26 21:16:06 +02:00
|
|
|
private var fileOffset: Long = 0
|
2022-09-23 20:58:16 +02:00
|
|
|
private var bytesRemaining: Long = -1
|
|
|
|
|
2021-03-17 21:11:14 +01:00
|
|
|
override fun open(dataSpec: DataSpec): Long {
|
2023-04-20 16:38:15 +02:00
|
|
|
fileHandle = encryptedVolume.openFileReadMode(filePath)
|
2022-09-23 20:58:16 +02:00
|
|
|
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
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun getUri(): Uri {
|
2023-02-06 10:52:51 +01:00
|
|
|
return Constants.FAKE_URI
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun close() {
|
2022-06-18 21:13:16 +02:00
|
|
|
encryptedVolume.closeFile(fileHandle)
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
2021-03-17 21:11:14 +01:00
|
|
|
override fun addTransferListener(transferListener: TransferListener) {
|
2020-07-26 21:16:06 +02:00
|
|
|
//too lazy to implement this
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun read(buffer: ByteArray, offset: Int, readLength: Int): Int {
|
2022-09-23 20:58:16 +02:00
|
|
|
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()
|
|
|
|
}
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
2022-06-18 21:13:16 +02:00
|
|
|
class Factory(private val encryptedVolume: EncryptedVolume, private val filePath: String): DataSource.Factory {
|
2020-07-26 21:16:06 +02:00
|
|
|
override fun createDataSource(): DataSource {
|
2022-06-18 21:13:16 +02:00
|
|
|
return EncryptedVolumeDataSource(encryptedVolume, filePath)
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|