|
|
|
@ -1,8 +1,7 @@
|
|
|
|
package org.koitharu.kotatsu.local.data
|
|
|
|
package org.koitharu.kotatsu.local.data
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.CheckResult
|
|
|
|
import androidx.annotation.CheckResult
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.*
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
|
|
|
|
import java.io.File
|
|
|
|
import java.io.File
|
|
|
|
import java.io.FileInputStream
|
|
|
|
import java.io.FileInputStream
|
|
|
|
import java.io.FileOutputStream
|
|
|
|
import java.io.FileOutputStream
|
|
|
|
@ -27,11 +26,13 @@ class WritableCbzFile(private val file: File) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ZipInputStream(FileInputStream(file)).use { zip ->
|
|
|
|
ZipInputStream(FileInputStream(file)).use { zip ->
|
|
|
|
var entry = zip.nextEntry
|
|
|
|
var entry = zip.nextEntry
|
|
|
|
while (entry != null) {
|
|
|
|
while (entry != null && currentCoroutineContext().isActive) {
|
|
|
|
val target = File(dir.path + File.separator + entry.name)
|
|
|
|
val target = File(dir.path + File.separator + entry.name)
|
|
|
|
target.parentFile?.mkdirs()
|
|
|
|
runInterruptible {
|
|
|
|
target.outputStream().use { out ->
|
|
|
|
target.parentFile?.mkdirs()
|
|
|
|
zip.copyTo(out)
|
|
|
|
target.outputStream().use { out ->
|
|
|
|
|
|
|
|
zip.copyTo(out)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
zip.closeEntry()
|
|
|
|
zip.closeEntry()
|
|
|
|
entry = zip.nextEntry
|
|
|
|
entry = zip.nextEntry
|
|
|
|
@ -51,11 +52,13 @@ class WritableCbzFile(private val file: File) {
|
|
|
|
tempFile.delete()
|
|
|
|
tempFile.delete()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
ZipOutputStream(FileOutputStream(tempFile)).use { zip ->
|
|
|
|
runInterruptible {
|
|
|
|
dir.listFiles()?.forEach {
|
|
|
|
ZipOutputStream(FileOutputStream(tempFile)).use { zip ->
|
|
|
|
zipFile(it, it.name, zip)
|
|
|
|
dir.listFiles()?.forEach {
|
|
|
|
|
|
|
|
zipFile(it, it.name, zip)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
zip.flush()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
zip.flush()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
tempFile.renameTo(file)
|
|
|
|
tempFile.renameTo(file)
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
@ -67,29 +70,26 @@ class WritableCbzFile(private val file: File) {
|
|
|
|
|
|
|
|
|
|
|
|
operator fun get(name: String) = File(dir, name)
|
|
|
|
operator fun get(name: String) = File(dir, name)
|
|
|
|
|
|
|
|
|
|
|
|
operator fun set(name: String, file: File) {
|
|
|
|
suspend fun put(name: String, file: File) = runInterruptible(Dispatchers.IO) {
|
|
|
|
file.copyTo(this[name], overwrite = true)
|
|
|
|
file.copyTo(this[name], overwrite = true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
private fun zipFile(fileToZip: File, fileName: String, zipOut: ZipOutputStream) {
|
|
|
|
|
|
|
|
if (fileToZip.isDirectory) {
|
|
|
|
private fun zipFile(fileToZip: File, fileName: String, zipOut: ZipOutputStream) {
|
|
|
|
if (fileName.endsWith("/")) {
|
|
|
|
if (fileToZip.isDirectory) {
|
|
|
|
zipOut.putNextEntry(ZipEntry(fileName))
|
|
|
|
if (fileName.endsWith("/")) {
|
|
|
|
|
|
|
|
zipOut.putNextEntry(ZipEntry(fileName))
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
zipOut.putNextEntry(ZipEntry("$fileName/"))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
zipOut.closeEntry()
|
|
|
|
|
|
|
|
fileToZip.listFiles()?.forEach { childFile ->
|
|
|
|
|
|
|
|
zipFile(childFile, "$fileName/${childFile.name}", zipOut)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
FileInputStream(fileToZip).use { fis ->
|
|
|
|
zipOut.putNextEntry(ZipEntry("$fileName/"))
|
|
|
|
val zipEntry = ZipEntry(fileName)
|
|
|
|
}
|
|
|
|
zipOut.putNextEntry(zipEntry)
|
|
|
|
zipOut.closeEntry()
|
|
|
|
fis.copyTo(zipOut)
|
|
|
|
fileToZip.listFiles()?.forEach { childFile ->
|
|
|
|
}
|
|
|
|
zipFile(childFile, "$fileName/${childFile.name}", zipOut)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
FileInputStream(fileToZip).use { fis ->
|
|
|
|
|
|
|
|
val zipEntry = ZipEntry(fileName)
|
|
|
|
|
|
|
|
zipOut.putNextEntry(zipEntry)
|
|
|
|
|
|
|
|
fis.copyTo(zipOut)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|