diff --git a/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipOutput.kt b/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipOutput.kt index 23a030c4e..d34e753ab 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipOutput.kt @@ -4,6 +4,7 @@ import androidx.annotation.WorkerThread import androidx.collection.ArraySet import okio.Closeable import java.io.File +import java.io.FileInputStream import java.util.zip.Deflater import java.util.zip.ZipEntry import java.util.zip.ZipFile @@ -20,24 +21,30 @@ class ZipOutput( setLevel(compressionLevel) } - fun put(name: String, file: File) { - entryNames.add(name) - output.appendFile(file, name) + @WorkerThread + fun put(name: String, file: File): Boolean { + return output.appendFile(file, name) } - fun put(name: String, content: String) { - entryNames.add(name) - output.appendText(content, name) + @WorkerThread + fun put(name: String, content: String): Boolean { + return output.appendText(content, name) } - fun addDirectory(name: String) { - entryNames.add(name) + @WorkerThread + fun addDirectory(name: String): Boolean { val entry = if (name.endsWith("/")) { ZipEntry(name) } else { ZipEntry("$name/") } - output.putNextEntry(entry) + return if (entryNames.add(entry.name)) { + output.putNextEntry(entry) + output.closeEntry() + true + } else { + false + } } @WorkerThread @@ -66,4 +73,46 @@ class ZipOutput( isClosed = true } } + + @WorkerThread + private fun ZipOutputStream.appendFile(fileToZip: File, name: String): Boolean { + if (fileToZip.isDirectory) { + val entry = if (name.endsWith("/")) { + ZipEntry(name) + } else { + ZipEntry("$name/") + } + if (!entryNames.add(entry.name)) { + return false + } + putNextEntry(entry) + closeEntry() + fileToZip.listFiles()?.forEach { childFile -> + appendFile(childFile, "$name/${childFile.name}") + } + } else { + FileInputStream(fileToZip).use { fis -> + if (!entryNames.add(name)) { + return false + } + val zipEntry = ZipEntry(name) + putNextEntry(zipEntry) + fis.copyTo(this) + closeEntry() + } + } + return true + } + + @WorkerThread + private fun ZipOutputStream.appendText(content: String, name: String): Boolean { + if (!entryNames.add(name)) { + return false + } + val zipEntry = ZipEntry(name) + putNextEntry(zipEntry) + content.byteInputStream().copyTo(this) + closeEntry() + return true + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipUtils.kt b/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipUtils.kt deleted file mode 100644 index c42f47142..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/core/zip/ZipUtils.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.koitharu.kotatsu.core.zip - -import androidx.annotation.WorkerThread -import java.io.File -import java.io.FileInputStream -import java.util.zip.ZipEntry -import java.util.zip.ZipOutputStream - -@WorkerThread -fun ZipOutputStream.appendFile(fileToZip: File, name: String) { - if (fileToZip.isDirectory) { - if (name.endsWith("/")) { - putNextEntry(ZipEntry(name)) - } else { - putNextEntry(ZipEntry("$name/")) - } - closeEntry() - fileToZip.listFiles()?.forEach { childFile -> - appendFile(childFile, "$name/${childFile.name}") - } - } else { - FileInputStream(fileToZip).use { fis -> - val zipEntry = ZipEntry(name) - putNextEntry(zipEntry) - fis.copyTo(this) - closeEntry() - } - } -} - -@WorkerThread -fun ZipOutputStream.appendText(content: String, name: String) { - val zipEntry = ZipEntry(name) - putNextEntry(zipEntry) - content.byteInputStream().copyTo(this) - closeEntry() -} \ No newline at end of file