From aa56b8e1e38b3bcfa3aafc09d4fbb6dfddc53e2f Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Wed, 27 May 2015 01:36:15 +0200
Subject: [PATCH] (Task database) Start using zlib_parse_file_iterate in
 task_database.c

---
 database_info.h                             |  5 +++++
 libretro-common/file/file_extract.c         | 19 ----------------
 libretro-common/include/file/file_extract.h | 20 +++++++++++++++++
 tasks/task_database.c                       | 25 ++++++++++++++++++---
 4 files changed, 47 insertions(+), 22 deletions(-)

diff --git a/database_info.h b/database_info.h
index 900ff5ca5c..2367b63fb1 100644
--- a/database_info.h
+++ b/database_info.h
@@ -21,6 +21,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <boolean.h>
+#include <file/file_extract.h>
 #include "libretro-db/libretrodb.h"
 #include "playlist.h"
 
@@ -42,6 +43,7 @@ enum database_type
 {
    DATABASE_TYPE_NONE = 0,
    DATABASE_TYPE_ITERATE,
+   DATABASE_TYPE_ITERATE_ZIP,
    DATABASE_TYPE_CRC_LOOKUP,
 };
 
@@ -51,6 +53,9 @@ typedef struct
    enum database_type type;
    size_t list_ptr;
    struct string_list *list;
+#ifdef HAVE_ZLIB
+   zlib_transfer_t state;
+#endif
 } database_info_handle_t;
 
 typedef struct
diff --git a/libretro-common/file/file_extract.c b/libretro-common/file/file_extract.c
index 291265da35..5354d026a8 100644
--- a/libretro-common/file/file_extract.c
+++ b/libretro-common/file/file_extract.c
@@ -479,25 +479,6 @@ end:
    return ret;
 }
 
-enum zlib_transfer_type
-{
-   ZLIB_TRANSFER_NONE = 0,
-   ZLIB_TRANSFER_INIT,
-   ZLIB_TRANSFER_ITERATE,
-   ZLIB_TRANSFER_DEINIT,
-   ZLIB_TRANSFER_DEINIT_ERROR,
-};
-
-typedef struct zlib_transfer
-{
-   void *handle;
-   const uint8_t *footer;
-   const uint8_t *directory;
-   const uint8_t *data;
-   ssize_t zip_size;
-   enum zlib_transfer_type type;
-   const struct zlib_file_backend *backend;
-} zlib_transfer_t;
 
 int zlib_parse_file_iterate_step_internal(
       zlib_transfer_t *state, char *filename,
diff --git a/libretro-common/include/file/file_extract.h b/libretro-common/include/file/file_extract.h
index 0a53e19715..b44613c6b5 100644
--- a/libretro-common/include/file/file_extract.h
+++ b/libretro-common/include/file/file_extract.h
@@ -34,6 +34,26 @@ typedef struct zlib_handle
    uint32_t real_checksum;
 } zlib_file_handle_t;
 
+enum zlib_transfer_type
+{
+   ZLIB_TRANSFER_NONE = 0,
+   ZLIB_TRANSFER_INIT,
+   ZLIB_TRANSFER_ITERATE,
+   ZLIB_TRANSFER_DEINIT,
+   ZLIB_TRANSFER_DEINIT_ERROR,
+};
+
+typedef struct zlib_transfer
+{
+   void *handle;
+   const uint8_t *footer;
+   const uint8_t *directory;
+   const uint8_t *data;
+   int32_t zip_size;
+   enum zlib_transfer_type type;
+   const struct zlib_file_backend *backend;
+} zlib_transfer_t;
+
 /* Returns true when parsing should continue. False to stop. */
 typedef int (*zlib_file_cb)(const char *name, const char *valid_exts,
       const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
diff --git a/tasks/task_database.c b/tasks/task_database.c
index 3db7e4b06d..a372d29eec 100644
--- a/tasks/task_database.c
+++ b/tasks/task_database.c
@@ -68,9 +68,11 @@ static int database_info_iterate_playlist(
    if (!strcmp(path_get_extension(name), "zip"))
    {
 #ifdef HAVE_ZLIB
-      if (!zlib_parse_file(name, NULL, zlib_compare_crc32,
-               (void*)db_state))
-         RARCH_LOG("Could not process ZIP file.\n");
+      db->type = DATABASE_TYPE_ITERATE_ZIP;
+      memset(&db->state, 0, sizeof(zlib_transfer_t));
+      db->state.type = ZLIB_TRANSFER_INIT;
+
+      return 1;
 #endif
    }
    else
@@ -92,6 +94,21 @@ static int database_info_iterate_playlist(
    return 0;
 }
 
+static int database_info_iterate_playlist_zip(
+      database_state_handle_t *db_state,
+      database_info_handle_t *db, const char *name)
+{
+   bool returnerr = true;
+#ifdef HAVE_ZLIB
+   if (zlib_parse_file_iterate(&db->state,
+            &returnerr, name, NULL, zlib_compare_crc32,
+            (void*)db_state) != 0)
+      return 0;
+#endif
+
+   return 1;
+}
+
 static int database_info_iterate_next(database_info_handle_t *db)
 {
    db->list_ptr++;
@@ -247,6 +264,8 @@ static int database_info_iterate(database_state_handle_t *state, database_info_h
          break;
       case DATABASE_TYPE_ITERATE:
          return database_info_iterate_playlist(state, db, name);
+      case DATABASE_TYPE_ITERATE_ZIP:
+         return database_info_iterate_playlist_zip(state, db, name);
       case DATABASE_TYPE_CRC_LOOKUP:
          return database_info_iterate_crc_lookup(state, db);
    }