static int task_database_iterate(database_state_handle_t *db_state, database_info_handle_t *db) { const char *name = db ? db->list->elems[db->list_ptr].data : NULL; if (!db || !db->list) return -1; if (!name) return 0; switch (db->type) { case DATABASE_TYPE_ITERATE: return task_database_iterate_playlist(db_state, db, name); case DATABASE_TYPE_ITERATE_ZIP: return task_database_iterate_playlist_zip(db_state, db, name); case DATABASE_TYPE_SERIAL_LOOKUP: return task_database_iterate_serial_lookup(db_state, db, name); case DATABASE_TYPE_CRC_LOOKUP: return task_database_iterate_crc_lookup(db_state, db, NULL); case DATABASE_TYPE_NONE: default: break; } return 0; }
static int task_database_iterate( db_handle_t *_db, database_state_handle_t *db_state, database_info_handle_t *db) { const char *name = database_info_get_current_element_name(db); if (!name) return 0; if (database_info_get_type(db) == DATABASE_TYPE_ITERATE) if (path_contains_compressed_file(name)) database_info_set_type(db, DATABASE_TYPE_ITERATE_ARCHIVE); switch (database_info_get_type(db)) { case DATABASE_TYPE_ITERATE: return task_database_iterate_playlist(db_state, db, name); case DATABASE_TYPE_ITERATE_ARCHIVE: return task_database_iterate_playlist_archive(_db, db_state, db, name); case DATABASE_TYPE_ITERATE_LUTRO: return task_database_iterate_playlist_lutro(_db, db_state, db, name); case DATABASE_TYPE_SERIAL_LOOKUP: return task_database_iterate_serial_lookup(_db, db_state, db, name); case DATABASE_TYPE_CRC_LOOKUP: return task_database_iterate_crc_lookup(_db, db_state, db, name, NULL); case DATABASE_TYPE_NONE: default: break; } return 0; }
static int task_database_iterate_playlist_archive( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { #ifdef HAVE_COMPRESSION if (db_state->crc != 0) return task_database_iterate_crc_lookup( db_state, db, name, db_state->archive_name); db_state->crc = file_archive_get_file_crc32(name); #endif return 1; }
static int task_database_iterate_playlist_zip( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { bool returnerr = true; #ifdef HAVE_ZLIB if (db_state->crc != 0) return task_database_iterate_crc_lookup( db_state, db, db_state->zip_name); if (file_archive_parse_file_iterate(&db->state, &returnerr, name, NULL, zlib_compare_crc32, (void*)db_state) != 0) return 0; if (db_state->crc) file_archive_parse_file_iterate_stop(&db->state); #endif return 1; }