Use platform delegate systemcall sendfile
This commit is contained in:
1 parent
d3d07f9e4e
commit
5dff1f7678
3 files changed
+13
-14
No files matched your search
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user