hpatch_demo.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * Copyright (c) 2024, sulfurandcu.github.io
  3. *
  4. * SPDX-License-Identifier: MIT
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-10-24 liujitong first version
  9. */
  10. #include "hpatch_impl.h"
  11. typedef struct hpatchi_instance_t
  12. {
  13. hpatchi_listener_t parent;
  14. int patch_file_offset;
  15. int patch_file_len;
  16. int patch_read_pos;
  17. int newer_file_len;
  18. int newer_write_pos;
  19. } hpatchi_instance_t;
  20. // 以数据流的形式读取空文件
  21. hpi_BOOL _do_read_empty(struct hpatchi_listener_t *listener, hpi_pos_t addr, hpi_byte *data, hpi_size_t size)
  22. {
  23. memset(data, 0, size);
  24. return hpi_TRUE;
  25. }
  26. // 以数据流的形式读取旧程序
  27. hpi_BOOL _do_read_old(struct hpatchi_listener_t *listener, hpi_pos_t addr, hpi_byte *data, hpi_size_t size)
  28. {
  29. int result = fal_read_old(addr, data, size);
  30. if (result < 0) { return hpi_FALSE; }
  31. return hpi_TRUE;
  32. }
  33. // 以数据流的形式读取补丁包(由用户记录数据流的位置:读到哪儿了)
  34. hpi_BOOL _do_read_patch(hpi_TInputStreamHandle input_stream, hpi_byte *data, hpi_size_t *size)
  35. {
  36. hpatchi_instance_t *instance = (hpatchi_instance_t *)input_stream;
  37. // 数据流结束时需要将 *size 置为当前所读数据的实际长度(*size == decompress_cache_size)
  38. if ((instance->patch_read_pos + *size) > instance->patch_file_len)
  39. {
  40. *size = instance->patch_file_len - instance->patch_read_pos;
  41. }
  42. int result = fal_read_patch(instance->patch_file_offset + instance->patch_read_pos, data, *size);
  43. if (result < 0) { return hpi_FALSE; }
  44. instance->patch_read_pos += *size;
  45. return hpi_TRUE;
  46. }
  47. // 以数据流的形式写入差分还原的数据(由用户记录数据流的位置:写到哪儿了)
  48. hpi_BOOL _do_write_new(struct hpatchi_listener_t *listener, const hpi_byte *data, hpi_size_t size)
  49. {
  50. hpatchi_instance_t *instance = (hpatchi_instance_t *)listener;
  51. int percent = instance->newer_write_pos * 100 / instance->newer_file_len;
  52. if (percent % 5 == 0 && percent < 100)
  53. {
  54. rt_kprintf("\b\b\b%02d%%", percent);
  55. }
  56. int result = fal_write_new(instance->newer_write_pos, (unsigned char *)data, size);
  57. if (result < 0) { return hpi_FALSE; }
  58. instance->newer_write_pos += size;
  59. return hpi_TRUE;
  60. }
  61. void demo(void)
  62. {
  63. hpatchi_instance_t instance = {0};
  64. instance.patch_file_offset = ; // 从升级包的包头中获取差分数据的地址
  65. instance.patch_file_len = ; // 从升级包的包头中获取差分数据的大小
  66. instance.newer_file_len = ; // 从升级包的包头中获取新版程序的大小
  67. // 差分全量升级
  68. {
  69. hpi_patch(&instance.parent, 128, 128, _do_read_patch, _do_read_empty, _do_write_new);
  70. }
  71. // 差分增量升级
  72. {
  73. hpi_patch(&instance.parent, 128, 128, _do_read_patch, _do_read_old, _do_write_new);
  74. }
  75. }