纳入固件源码、屏幕组件、nand_xfer 工具和文档。忽略本机构建产物、sdkconfig,以及含本机路径的依赖锁。 Co-authored-by: Cursor <[email protected]>
147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
#ifndef ZIP_EXTRACTOR_H
|
||
#define ZIP_EXTRACTOR_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <stdbool.h>
|
||
#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
|