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); }