2020-07-26 21:16:06 +02:00
|
|
|
package sushi.hardcore.droidfs.file_viewers
|
|
|
|
|
|
|
|
import android.net.Uri
|
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
|
2020-07-26 21:16:06 +02:00
|
|
|
import sushi.hardcore.droidfs.ConstValues
|
2020-12-31 13:15:13 +01:00
|
|
|
import sushi.hardcore.droidfs.GocryptfsVolume
|
2020-08-01 15:39:00 +02:00
|
|
|
import kotlin.math.ceil
|
|
|
|
import kotlin.math.min
|
2020-07-26 21:16:06 +02:00
|
|
|
|
|
|
|
class GocryptfsDataSource(private val gocryptfsVolume: GocryptfsVolume, private val filePath: String): DataSource {
|
|
|
|
private var handleID = -1
|
|
|
|
private var fileSize: Long = -1
|
|
|
|
private var fileOffset: Long = 0
|
2021-03-17 21:11:14 +01:00
|
|
|
override fun open(dataSpec: DataSpec): Long {
|
|
|
|
fileOffset = dataSpec.position
|
2020-08-01 16:43:48 +02:00
|
|
|
handleID = gocryptfsVolume.openReadMode(filePath)
|
|
|
|
fileSize = gocryptfsVolume.getSize(filePath)
|
2020-07-26 21:16:06 +02:00
|
|
|
return fileSize
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getUri(): Uri {
|
2022-03-23 16:35:13 +01:00
|
|
|
return ConstValues.FAKE_URI
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun close() {
|
2020-08-01 16:43:48 +02:00
|
|
|
gocryptfsVolume.closeFile(handleID)
|
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 {
|
|
|
|
if (fileOffset >= fileSize){
|
|
|
|
return -1
|
|
|
|
}
|
2020-08-01 15:39:00 +02:00
|
|
|
var totalRead = 0
|
|
|
|
for (i in 0 until ceil(readLength.toDouble()/ConstValues.MAX_KERNEL_WRITE).toInt()){
|
|
|
|
val tmpReadLength = min(readLength-totalRead, ConstValues.MAX_KERNEL_WRITE)
|
|
|
|
val tmpBuff = if (fileOffset+tmpReadLength > fileSize){
|
|
|
|
ByteArray((fileSize-fileOffset).toInt())
|
|
|
|
} else {
|
|
|
|
ByteArray(tmpReadLength)
|
|
|
|
}
|
2021-03-17 21:11:14 +01:00
|
|
|
val read = gocryptfsVolume.readFile(handleID, fileOffset, tmpBuff)
|
2020-08-01 15:39:00 +02:00
|
|
|
System.arraycopy(tmpBuff, 0, buffer, offset+totalRead, read)
|
|
|
|
fileOffset += read
|
|
|
|
totalRead += read
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
2020-08-01 15:39:00 +02:00
|
|
|
return totalRead
|
2020-07-26 21:16:06 +02:00
|
|
|
}
|
|
|
|
|
2021-03-17 21:11:14 +01:00
|
|
|
class Factory(private val gocryptfsVolume: GocryptfsVolume, private val filePath: String): DataSource.Factory {
|
2020-07-26 21:16:06 +02:00
|
|
|
override fun createDataSource(): DataSource {
|
|
|
|
return GocryptfsDataSource(gocryptfsVolume, filePath)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|