| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /**
- * Copyright (c) 2024, sulfurandcu.github.io
- *
- * SPDX-License-Identifier: MIT
- *
- * Change Logs:
- * Date Author Notes
- * 2024-10-24 liujitong first version
- */
- #include "hpatch_impl.h"
- typedef struct hpatchi_instance_t
- {
- hpatchi_listener_t parent;
- int patch_file_offset;
- int patch_file_len;
- int patch_read_pos;
- int newer_file_len;
- int newer_write_pos;
- } hpatchi_instance_t;
- // 以数据流的形式读取空文件
- hpi_BOOL _do_read_empty(struct hpatchi_listener_t *listener, hpi_pos_t addr, hpi_byte *data, hpi_size_t size)
- {
- memset(data, 0, size);
- return hpi_TRUE;
- }
- // 以数据流的形式读取旧程序
- hpi_BOOL _do_read_old(struct hpatchi_listener_t *listener, hpi_pos_t addr, hpi_byte *data, hpi_size_t size)
- {
- int result = fal_read_old(addr, data, size);
- if (result < 0) { return hpi_FALSE; }
- return hpi_TRUE;
- }
- // 以数据流的形式读取补丁包(由用户记录数据流的位置:读到哪儿了)
- hpi_BOOL _do_read_patch(hpi_TInputStreamHandle input_stream, hpi_byte *data, hpi_size_t *size)
- {
- hpatchi_instance_t *instance = (hpatchi_instance_t *)input_stream;
- // 数据流结束时需要将 *size 置为当前所读数据的实际长度(*size == decompress_cache_size)
- if ((instance->patch_read_pos + *size) > instance->patch_file_len)
- {
- *size = instance->patch_file_len - instance->patch_read_pos;
- }
- int result = fal_read_patch(instance->patch_file_offset + instance->patch_read_pos, data, *size);
- if (result < 0) { return hpi_FALSE; }
- instance->patch_read_pos += *size;
- return hpi_TRUE;
- }
- // 以数据流的形式写入差分还原的数据(由用户记录数据流的位置:写到哪儿了)
- hpi_BOOL _do_write_new(struct hpatchi_listener_t *listener, const hpi_byte *data, hpi_size_t size)
- {
- hpatchi_instance_t *instance = (hpatchi_instance_t *)listener;
- int percent = instance->newer_write_pos * 100 / instance->newer_file_len;
- if (percent % 5 == 0 && percent < 100)
- {
- rt_kprintf("\b\b\b%02d%%", percent);
- }
- int result = fal_write_new(instance->newer_write_pos, (unsigned char *)data, size);
- if (result < 0) { return hpi_FALSE; }
- instance->newer_write_pos += size;
- return hpi_TRUE;
- }
- void demo(void)
- {
- hpatchi_instance_t instance = {0};
- instance.patch_file_offset = ; // 从升级包的包头中获取差分数据的地址
- instance.patch_file_len = ; // 从升级包的包头中获取差分数据的大小
- instance.newer_file_len = ; // 从升级包的包头中获取新版程序的大小
- // 差分全量升级
- {
- hpi_patch(&instance.parent, 128, 128, _do_read_patch, _do_read_empty, _do_write_new);
- }
- // 差分增量升级
- {
- hpi_patch(&instance.parent, 128, 128, _do_read_patch, _do_read_old, _do_write_new);
- }
- }
|