#ifndef ZIP_EXTRACTOR_H #define ZIP_EXTRACTOR_H #ifdef __cplusplus extern "C" { #endif #include #include "esp_err.h" /** * @brief ZIP解压器配置参数 */ typedef struct { const char *zip_path; ///< ZIP文件路径 const char *extract_dir; ///< 解压目标目录 bool overwrite_existing; ///< 是否覆盖已存在的文件 bool create_directories; ///< 是否自动创建目录 bool skip_directories; ///< 是否跳过ZIP中的目录条目 } zip_extractor_config_t; /** * @brief 默认配置参数 */ #define ZIP_EXTRACTOR_CONFIG_DEFAULT() { \ .zip_path = NULL, \ .extract_dir = NULL, \ .overwrite_existing = true, \ .create_directories = true, \ .skip_directories = true \ } /** * @brief 解压结果结构体 */ typedef struct { int total_files; ///< ZIP中总文件数 int extracted_files; ///< 成功解压的文件数 int skipped_files; ///< 跳过的文件数(目录或已存在且不覆盖) int failed_files; ///< 解压失败的文件数 size_t total_size; ///< 解压的总字节数 } zip_extractor_result_t; /** * @brief 解压进度回调函数类型 * @param filename 当前正在处理的文件名 * @param current 当前处理的文件索引 * @param total 总文件数 * @param user_data 用户数据 */ typedef void (*zip_extractor_progress_cb_t)(const char *filename, int current, int total, void *user_data); /** * @brief 初始化ZIP解压器 * * @note 在使用其他函数前必须先调用此函数进行初始化 * * @return esp_err_t ESP_OK表示成功,其他表示错误 */ esp_err_t zip_extractor_init(void); /** * @brief 解压ZIP文件(使用配置结构体) * * @param config 解压配置参数 * @param result 解压结果(可选,可为NULL) * @param progress_cb 进度回调函数(可选,可为NULL) * @param user_data 传递给进度回调的用户数据(可选) * @return esp_err_t ESP_OK表示成功,其他表示错误 */ esp_err_t zip_extractor_extract(const zip_extractor_config_t *config, zip_extractor_result_t *result, zip_extractor_progress_cb_t progress_cb, void *user_data); /** * @brief 解压ZIP文件(简化版本) * * @param zip_path ZIP文件路径 * @param extract_dir 解压目标目录 * @return esp_err_t ESP_OK表示成功,其他表示错误 */ esp_err_t zip_extractor_extract_simple(const char *zip_path, const char *extract_dir); /** * @brief 获取ZIP文件信息 * * @param zip_path ZIP文件路径 * @param file_count 返回文件数量(可选,可为NULL) * @param total_size 返回总大小(字节,可选,可为NULL) * @return esp_err_t ESP_OK表示成功,其他表示错误 */ esp_err_t zip_extractor_get_info(const char *zip_path, int *file_count, size_t *total_size); /** * @brief 列出ZIP文件内容 * * @param zip_path ZIP文件路径 * @param file_list 文件列表缓冲区(二维数组) * @param max_files 最大文件数量 * @return int 实际列出的文件数量,负数表示错误 */ int zip_extractor_list_files(const char *zip_path, char **file_list, int max_files); /** * @brief 检查ZIP文件是否有效 * * @param zip_path ZIP文件路径 * @return bool true表示有效,false表示无效 */ bool zip_extractor_is_valid(const char *zip_path); /** * @brief 释放ZIP解压器资源 * * @note 在应用程序结束时调用 */ void zip_extractor_cleanup(void); // 特定于您需求的便捷函数 /** * @brief 解压/extflash/json.zip到/extflash目录 * * @return esp_err_t ESP_OK表示成功,其他表示错误 */ void extract_json_zip(char* filename); /** * @brief 检查JSON ZIP文件是否存在且有效 * * @return bool true表示存在且有效 */ bool is_json_zip_available(void); /** * @brief 获取最近一次解压成功对应的表情包 ID(如 'A'/'B'/'C'/'D') * 解压成功时在 extract_zip_file 内设置,供 main 识别下载成功并按路径播放动画 * @return char 表情包 ID,'0' 表示无效或未下载 */ char zip_extractor_get_last_downloaded_pack(void); #ifdef __cplusplus } #endif #endif // ZIP_EXTRACTOR_H