mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
(Task database) Start using zlib_parse_file_iterate in task_database.c
This commit is contained in:
parent
3d924a7556
commit
aa56b8e1e3
@ -21,6 +21,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <boolean.h>
|
#include <boolean.h>
|
||||||
|
#include <file/file_extract.h>
|
||||||
#include "libretro-db/libretrodb.h"
|
#include "libretro-db/libretrodb.h"
|
||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ enum database_type
|
|||||||
{
|
{
|
||||||
DATABASE_TYPE_NONE = 0,
|
DATABASE_TYPE_NONE = 0,
|
||||||
DATABASE_TYPE_ITERATE,
|
DATABASE_TYPE_ITERATE,
|
||||||
|
DATABASE_TYPE_ITERATE_ZIP,
|
||||||
DATABASE_TYPE_CRC_LOOKUP,
|
DATABASE_TYPE_CRC_LOOKUP,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -51,6 +53,9 @@ typedef struct
|
|||||||
enum database_type type;
|
enum database_type type;
|
||||||
size_t list_ptr;
|
size_t list_ptr;
|
||||||
struct string_list *list;
|
struct string_list *list;
|
||||||
|
#ifdef HAVE_ZLIB
|
||||||
|
zlib_transfer_t state;
|
||||||
|
#endif
|
||||||
} database_info_handle_t;
|
} database_info_handle_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -479,25 +479,6 @@ end:
|
|||||||
return ret;
|
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(
|
int zlib_parse_file_iterate_step_internal(
|
||||||
zlib_transfer_t *state, char *filename,
|
zlib_transfer_t *state, char *filename,
|
||||||
|
@ -34,6 +34,26 @@ typedef struct zlib_handle
|
|||||||
uint32_t real_checksum;
|
uint32_t real_checksum;
|
||||||
} zlib_file_handle_t;
|
} 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. */
|
/* Returns true when parsing should continue. False to stop. */
|
||||||
typedef int (*zlib_file_cb)(const char *name, const char *valid_exts,
|
typedef int (*zlib_file_cb)(const char *name, const char *valid_exts,
|
||||||
const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
|
const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
|
||||||
|
@ -68,9 +68,11 @@ static int database_info_iterate_playlist(
|
|||||||
if (!strcmp(path_get_extension(name), "zip"))
|
if (!strcmp(path_get_extension(name), "zip"))
|
||||||
{
|
{
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
if (!zlib_parse_file(name, NULL, zlib_compare_crc32,
|
db->type = DATABASE_TYPE_ITERATE_ZIP;
|
||||||
(void*)db_state))
|
memset(&db->state, 0, sizeof(zlib_transfer_t));
|
||||||
RARCH_LOG("Could not process ZIP file.\n");
|
db->state.type = ZLIB_TRANSFER_INIT;
|
||||||
|
|
||||||
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -92,6 +94,21 @@ static int database_info_iterate_playlist(
|
|||||||
return 0;
|
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)
|
static int database_info_iterate_next(database_info_handle_t *db)
|
||||||
{
|
{
|
||||||
db->list_ptr++;
|
db->list_ptr++;
|
||||||
@ -247,6 +264,8 @@ static int database_info_iterate(database_state_handle_t *state, database_info_h
|
|||||||
break;
|
break;
|
||||||
case DATABASE_TYPE_ITERATE:
|
case DATABASE_TYPE_ITERATE:
|
||||||
return database_info_iterate_playlist(state, db, name);
|
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:
|
case DATABASE_TYPE_CRC_LOOKUP:
|
||||||
return database_info_iterate_crc_lookup(state, db);
|
return database_info_iterate_crc_lookup(state, db);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user