Explorar o código

Merge pull request #12558 from t895/zip-storage-method

android: Disable compression for zip exports
liamwhite %!s(int64=2) %!d(string=hai) anos
pai
achega
d7e7a69e00

+ 2 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt

@@ -445,7 +445,8 @@ class GamePropertiesFragment : Fragment() {
             val zipResult = FileUtil.zipFromInternalStorage(
                 File(saveLocation),
                 saveLocation.replaceAfterLast("/", ""),
-                BufferedOutputStream(requireContext().contentResolver.openOutputStream(result))
+                BufferedOutputStream(requireContext().contentResolver.openOutputStream(result)),
+                compression = false
             )
             return@newInstance when (zipResult) {
                 TaskState.Completed -> getString(R.string.export_success)

+ 2 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt

@@ -625,7 +625,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
                 File(DirectoryInitialization.userDirectory!!),
                 DirectoryInitialization.userDirectory!!,
                 BufferedOutputStream(contentResolver.openOutputStream(result)),
-                taskViewModel.cancelled
+                taskViewModel.cancelled,
+                compression = false
             )
             return@newInstance when (zipResult) {
                 TaskState.Completed -> getString(R.string.user_data_export_success)

+ 11 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt

@@ -21,6 +21,7 @@ import org.yuzu.yuzu_emu.model.TaskState
 import java.io.BufferedOutputStream
 import java.lang.NullPointerException
 import java.nio.charset.StandardCharsets
+import java.util.zip.Deflater
 import java.util.zip.ZipOutputStream
 import kotlin.IllegalStateException
 
@@ -312,15 +313,23 @@ object FileUtil {
      * @param inputFile File representation of the item that will be zipped
      * @param rootDir Directory containing the inputFile
      * @param outputStream Stream where the zip file will be output
+     * @param cancelled [StateFlow] that reports whether this process has been cancelled
+     * @param compression Disables compression if true
      */
     fun zipFromInternalStorage(
         inputFile: File,
         rootDir: String,
         outputStream: BufferedOutputStream,
-        cancelled: StateFlow<Boolean>? = null
+        cancelled: StateFlow<Boolean>? = null,
+        compression: Boolean = true
     ): TaskState {
         try {
             ZipOutputStream(outputStream).use { zos ->
+                if (!compression) {
+                    zos.setMethod(ZipOutputStream.DEFLATED)
+                    zos.setLevel(Deflater.NO_COMPRESSION)
+                }
+
                 inputFile.walkTopDown().forEach { file ->
                     if (cancelled?.value == true) {
                         return TaskState.Cancelled
@@ -338,6 +347,7 @@ object FileUtil {
                 }
             }
         } catch (e: Exception) {
+            Log.error("[FileUtil] Failed creating zip file - ${e.message}")
             return TaskState.Failed
         }
         return TaskState.Completed