Use platform delegate systemcall sendfile

This commit is contained in:
tarsin committed 2023-02-27 16:30:46 +08:00
1 parent d3d07f9e4e
commit 5dff1f7678
3 files changed
+13 -14

No files matched your search

+9 -10
View File
@@ -18,6 +18,8 @@
package com.hippo
import android.os.ParcelFileDescriptor
import android.system.Int64Ref
import android.system.Os
import java.io.FileDescriptor
object Native {
@@ -27,22 +29,19 @@ object Native {
@JvmStatic
external fun getFd(fd: FileDescriptor?): Int
}
@JvmStatic
external fun sendfile(from: Int, to: Int)
private fun sendFileTotally(from: FileDescriptor, to: FileDescriptor) {
Os.sendfile(to, from, Int64Ref(0), Long.MAX_VALUE)
}
val FileDescriptor.fd
get() = Native.getFd(this)
infix fun ParcelFileDescriptor.receivefrom(fd: FileDescriptor) {
Native.sendfile(fd.fd, getFd())
infix fun ParcelFileDescriptor.sendTo(fd: FileDescriptor) {
sendFileTotally(fileDescriptor, fd)
}
infix fun ParcelFileDescriptor.copyTo(fd: FileDescriptor) {
Native.sendfile(getFd(), fd.fd)
}
infix fun ParcelFileDescriptor.copyTo(fd: ParcelFileDescriptor) {
Native.sendfile(getFd(), fd.fd)
infix fun ParcelFileDescriptor.sendTo(fd: ParcelFileDescriptor) {
sendFileTotally(fileDescriptor, fd.fileDescriptor)
}
+2 -2
View File
@@ -21,7 +21,6 @@ import android.os.ParcelFileDescriptor
import android.os.ParcelFileDescriptor.MODE_READ_ONLY
import androidx.paging.PagingSource
import androidx.room.Room.databaseBuilder
import com.hippo.Native
import com.hippo.ehviewer.EhApplication.Companion.ehDatabase
import com.hippo.ehviewer.client.data.GalleryInfo
import com.hippo.ehviewer.dao.BasicDao
@@ -34,6 +33,7 @@ import com.hippo.ehviewer.dao.HistoryInfo
import com.hippo.ehviewer.dao.LocalFavoriteInfo
import com.hippo.ehviewer.dao.QuickSearch
import com.hippo.ehviewer.download.DownloadManager
import com.hippo.sendTo
object EhDB {
private const val CUR_DB_VER = 4
@@ -379,7 +379,7 @@ object EhDB {
val dbFile = context.getDatabasePath(ehExportName)
context.contentResolver.openFileDescriptor(uri, "rw")!!.use { toFd ->
ParcelFileDescriptor.open(dbFile, MODE_READ_ONLY).use { fromFd ->
Native.sendfile(fromFd.fd, toFd.fd)
fromFd sendTo toFd
}
}
return true
@@ -22,7 +22,7 @@ import coil.decode.DecodeUtils
import coil.decode.FrameDelayRewritingSource
import coil.decode.isGif
import coil.disk.DiskCache
import com.hippo.copyTo
import com.hippo.sendTo
import com.hippo.ehviewer.EhApplication
import com.hippo.ehviewer.EhApplication.Companion.application
import com.hippo.ehviewer.EhDB
@@ -119,7 +119,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) {
val file = dir.createFile(generateImageFilename(index, extension)) ?: return false
(file.openOutputStream() as FileOutputStream).use { outputStream ->
ParcelFileDescriptor.open(data.toFile(), MODE_READ_WRITE).use {
it copyTo outputStream.fd
it sendTo outputStream.fd
}
}
}