archive_files.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #pragma once
  2. #include <m-array.h>
  3. #include <furi.h>
  4. #include <storage/storage.h>
  5. #define FAP_MANIFEST_MAX_ICON_SIZE 32
  6. typedef enum {
  7. ArchiveFileTypeIButton,
  8. ArchiveFileTypeNFC,
  9. ArchiveFileTypeSubGhz,
  10. ArchiveFileTypeLFRFID,
  11. ArchiveFileTypeInfrared,
  12. ArchiveFileTypeBadUsb,
  13. ArchiveFileTypeU2f,
  14. ArchiveFileTypeUpdateManifest,
  15. ArchiveFileTypeApplication,
  16. ArchiveFileTypeFolder,
  17. ArchiveFileTypeUnknown,
  18. ArchiveFileTypeLoading,
  19. } ArchiveFileTypeEnum;
  20. typedef struct {
  21. FuriString* path;
  22. ArchiveFileTypeEnum type;
  23. uint8_t* custom_icon_data;
  24. FuriString* custom_name;
  25. bool fav;
  26. bool is_app;
  27. } ArchiveFile_t;
  28. static void ArchiveFile_t_init(ArchiveFile_t* obj) {
  29. obj->path = furi_string_alloc();
  30. obj->type = ArchiveFileTypeUnknown;
  31. obj->custom_icon_data = NULL;
  32. obj->custom_name = furi_string_alloc();
  33. obj->fav = false;
  34. obj->is_app = false;
  35. }
  36. static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) {
  37. obj->path = furi_string_alloc_set(src->path);
  38. obj->type = src->type;
  39. if(src->custom_icon_data) {
  40. obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE);
  41. memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE);
  42. } else {
  43. obj->custom_icon_data = NULL;
  44. }
  45. obj->custom_name = furi_string_alloc_set(src->custom_name);
  46. obj->fav = src->fav;
  47. obj->is_app = src->is_app;
  48. }
  49. static void ArchiveFile_t_set(ArchiveFile_t* obj, const ArchiveFile_t* src) {
  50. furi_string_set(obj->path, src->path);
  51. obj->type = src->type;
  52. if(src->custom_icon_data) {
  53. obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE);
  54. memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE);
  55. } else {
  56. obj->custom_icon_data = NULL;
  57. }
  58. furi_string_set(obj->custom_name, src->custom_name);
  59. obj->fav = src->fav;
  60. obj->is_app = src->is_app;
  61. }
  62. static void ArchiveFile_t_clear(ArchiveFile_t* obj) {
  63. furi_string_free(obj->path);
  64. if(obj->custom_icon_data) {
  65. free(obj->custom_icon_data);
  66. obj->custom_icon_data = NULL;
  67. }
  68. furi_string_free(obj->custom_name);
  69. }
  70. ARRAY_DEF(
  71. files_array,
  72. ArchiveFile_t,
  73. (INIT(API_2(ArchiveFile_t_init)),
  74. SET(API_6(ArchiveFile_t_set)),
  75. INIT_SET(API_6(ArchiveFile_t_init_set)),
  76. CLEAR(API_2(ArchiveFile_t_clear))))
  77. void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder, bool is_app);
  78. bool archive_get_items(void* context, const char* path);
  79. void archive_file_append(const char* path, const char* format, ...)
  80. _ATTRIBUTE((__format__(__printf__, 2, 3)));
  81. void archive_delete_file(void* context, const char* format, ...)
  82. _ATTRIBUTE((__format__(__printf__, 2, 3)));