archive_files.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "archive_files.h"
  2. #include "archive_browser.h"
  3. #define TAG "Archive"
  4. bool filter_by_extension(FileInfo* file_info, const char* tab_ext, const char* name) {
  5. furi_assert(file_info);
  6. furi_assert(tab_ext);
  7. furi_assert(name);
  8. bool result = false;
  9. if(strcmp(tab_ext, "*") == 0) {
  10. result = true;
  11. } else if(strstr(name, tab_ext) != NULL) {
  12. result = true;
  13. } else if(file_info->flags & FSF_DIRECTORY) {
  14. result = true;
  15. }
  16. return result;
  17. }
  18. void archive_trim_file_path(char* name, bool ext) {
  19. char* slash = strrchr(name, '/') + 1;
  20. if(strlen(slash)) strlcpy(name, slash, strlen(slash) + 1);
  21. if(ext) {
  22. char* dot = strrchr(name, '.');
  23. if(strlen(dot)) *dot = '\0';
  24. }
  25. }
  26. void set_file_type(ArchiveFile_t* file, FileInfo* file_info) {
  27. furi_assert(file);
  28. furi_assert(file_info);
  29. for(size_t i = 0; i < SIZEOF_ARRAY(known_ext); i++) {
  30. if(string_search_str(file->name, known_ext[i], 0) != STRING_FAILURE) {
  31. file->type = i;
  32. return;
  33. }
  34. }
  35. if(file_info->flags & FSF_DIRECTORY) {
  36. file->type = ArchiveFileTypeFolder;
  37. } else {
  38. file->type = ArchiveFileTypeUnknown;
  39. }
  40. }
  41. bool archive_get_filenames(void* context, const char* path) {
  42. furi_assert(context);
  43. bool res;
  44. ArchiveBrowserView* browser = context;
  45. archive_file_array_rm_all(browser);
  46. if(archive_get_tab(browser) != ArchiveTabFavorites) {
  47. res = archive_read_dir(browser, path);
  48. } else {
  49. res = archive_favorites_read(browser);
  50. }
  51. return res;
  52. }
  53. bool archive_dir_empty(void* context, const char* path) { // can be simpler?
  54. furi_assert(context);
  55. FileInfo file_info;
  56. Storage* fs_api = furi_record_open("storage");
  57. File* directory = storage_file_alloc(fs_api);
  58. char name[MAX_NAME_LEN];
  59. if(!storage_dir_open(directory, path)) {
  60. storage_dir_close(directory);
  61. storage_file_free(directory);
  62. return false;
  63. }
  64. bool files_found = false;
  65. while(1) {
  66. if(!storage_dir_read(directory, &file_info, name, MAX_NAME_LEN)) {
  67. break;
  68. }
  69. if(files_found) {
  70. break;
  71. } else if(storage_file_get_error(directory) == FSE_OK) {
  72. files_found = name[0];
  73. } else {
  74. return false;
  75. }
  76. }
  77. storage_dir_close(directory);
  78. storage_file_free(directory);
  79. furi_record_close("storage");
  80. return files_found;
  81. }
  82. bool archive_read_dir(void* context, const char* path) {
  83. furi_assert(context);
  84. ArchiveBrowserView* browser = context;
  85. FileInfo file_info;
  86. Storage* fs_api = furi_record_open("storage");
  87. File* directory = storage_file_alloc(fs_api);
  88. char name[MAX_NAME_LEN];
  89. size_t files_cnt = 0;
  90. if(!storage_dir_open(directory, path)) {
  91. storage_dir_close(directory);
  92. storage_file_free(directory);
  93. return false;
  94. }
  95. while(1) {
  96. if(!storage_dir_read(directory, &file_info, name, MAX_NAME_LEN)) {
  97. break;
  98. }
  99. if(files_cnt > MAX_FILES) {
  100. break;
  101. } else if(storage_file_get_error(directory) == FSE_OK) {
  102. archive_add_item(browser, &file_info, name);
  103. ++files_cnt;
  104. } else {
  105. storage_dir_close(directory);
  106. storage_file_free(directory);
  107. return false;
  108. }
  109. }
  110. storage_dir_close(directory);
  111. storage_file_free(directory);
  112. furi_record_close("storage");
  113. return true;
  114. }
  115. void archive_file_append(const char* path, const char* format, ...) {
  116. furi_assert(path);
  117. string_t string;
  118. va_list args;
  119. va_start(args, format);
  120. string_init_vprintf(string, format, args);
  121. va_end(args);
  122. FileWorker* file_worker = file_worker_alloc(false);
  123. if(!file_worker_open(file_worker, path, FSAM_WRITE, FSOM_OPEN_APPEND)) {
  124. FURI_LOG_E(TAG, "Append open error");
  125. }
  126. if(!file_worker_write(file_worker, string_get_cstr(string), string_size(string))) {
  127. FURI_LOG_E(TAG, "Append write error");
  128. }
  129. file_worker_close(file_worker);
  130. file_worker_free(file_worker);
  131. }
  132. void archive_delete_file(void* context, const char* format, ...) {
  133. furi_assert(context);
  134. string_t filename;
  135. va_list args;
  136. va_start(args, format);
  137. string_init_vprintf(filename, format, args);
  138. va_end(args);
  139. ArchiveBrowserView* browser = context;
  140. FileWorker* file_worker = file_worker_alloc(true);
  141. bool res = file_worker_remove(file_worker, string_get_cstr(filename));
  142. file_worker_free(file_worker);
  143. if(archive_is_favorite("%s", string_get_cstr(filename))) {
  144. archive_favorites_delete("%s", string_get_cstr(filename));
  145. }
  146. if(res) {
  147. archive_file_array_rm_selected(browser);
  148. }
  149. string_clear(filename);
  150. }