archive_favorites.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include "archive_favorites.h"
  2. #include "archive_browser.h"
  3. uint16_t archive_favorites_count(void* context) {
  4. furi_assert(context);
  5. FileWorker* file_worker = file_worker_alloc(true);
  6. string_t buffer;
  7. string_init(buffer);
  8. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  9. uint16_t lines = 0;
  10. if(result) {
  11. while(1) {
  12. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  13. break;
  14. }
  15. if(!string_size(buffer)) {
  16. break;
  17. }
  18. ++lines;
  19. }
  20. }
  21. string_clear(buffer);
  22. file_worker_close(file_worker);
  23. file_worker_free(file_worker);
  24. return lines;
  25. }
  26. static bool archive_favourites_rescan() {
  27. string_t buffer;
  28. string_init(buffer);
  29. FileWorker* file_worker = file_worker_alloc(true);
  30. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  31. if(result) {
  32. while(1) {
  33. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  34. break;
  35. }
  36. if(!string_size(buffer)) {
  37. break;
  38. }
  39. bool file_exists = false;
  40. file_worker_is_file_exist(file_worker, string_get_cstr(buffer), &file_exists);
  41. if(file_exists) {
  42. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(buffer));
  43. }
  44. }
  45. }
  46. string_clear(buffer);
  47. file_worker_close(file_worker);
  48. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  49. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  50. file_worker_free(file_worker);
  51. return result;
  52. }
  53. bool archive_favorites_read(void* context) {
  54. furi_assert(context);
  55. ArchiveBrowserView* browser = context;
  56. FileWorker* file_worker = file_worker_alloc(true);
  57. string_t buffer;
  58. FileInfo file_info;
  59. string_init(buffer);
  60. bool need_refresh = false;
  61. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  62. if(result) {
  63. while(1) {
  64. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  65. break;
  66. }
  67. if(!string_size(buffer)) {
  68. break;
  69. }
  70. bool file_exists = false;
  71. file_worker_is_file_exist(file_worker, string_get_cstr(buffer), &file_exists);
  72. if(file_exists)
  73. archive_add_item(browser, &file_info, string_get_cstr(buffer));
  74. else
  75. need_refresh = true;
  76. string_reset(buffer);
  77. }
  78. }
  79. string_clear(buffer);
  80. file_worker_close(file_worker);
  81. file_worker_free(file_worker);
  82. if(need_refresh) {
  83. archive_favourites_rescan();
  84. }
  85. return result;
  86. }
  87. bool archive_favorites_delete(const char* format, ...) {
  88. string_t buffer;
  89. string_t filename;
  90. va_list args;
  91. va_start(args, format);
  92. string_init_vprintf(filename, format, args);
  93. va_end(args);
  94. string_init(buffer);
  95. FileWorker* file_worker = file_worker_alloc(true);
  96. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  97. if(result) {
  98. while(1) {
  99. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  100. break;
  101. }
  102. if(!string_size(buffer)) {
  103. break;
  104. }
  105. if(string_search(buffer, filename)) {
  106. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(buffer));
  107. }
  108. }
  109. }
  110. string_clear(buffer);
  111. string_clear(filename);
  112. file_worker_close(file_worker);
  113. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  114. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  115. file_worker_free(file_worker);
  116. return result;
  117. }
  118. bool archive_is_favorite(const char* format, ...) {
  119. string_t buffer;
  120. string_t filename;
  121. va_list args;
  122. va_start(args, format);
  123. string_init_vprintf(filename, format, args);
  124. va_end(args);
  125. string_init(buffer);
  126. FileWorker* file_worker = file_worker_alloc(true);
  127. bool found = false;
  128. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  129. if(result) {
  130. while(1) {
  131. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  132. break;
  133. }
  134. if(!string_size(buffer)) {
  135. break;
  136. }
  137. if(!string_search(buffer, filename)) {
  138. found = true;
  139. break;
  140. }
  141. }
  142. }
  143. string_clear(buffer);
  144. string_clear(filename);
  145. file_worker_close(file_worker);
  146. file_worker_free(file_worker);
  147. return found;
  148. }
  149. bool archive_favorites_rename(const char* file_path, const char* src, const char* dst) {
  150. furi_assert(file_path);
  151. furi_assert(src);
  152. furi_assert(dst);
  153. FileWorker* file_worker = file_worker_alloc(true);
  154. string_t path;
  155. string_t buffer;
  156. string_init(buffer);
  157. string_init(path);
  158. string_printf(path, "%s/%s", file_path, src);
  159. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  160. if(result) {
  161. while(1) {
  162. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  163. break;
  164. }
  165. if(!string_size(buffer)) {
  166. break;
  167. }
  168. archive_file_append(
  169. ARCHIVE_FAV_TEMP_PATH,
  170. "%s\n",
  171. string_search(buffer, path) ? string_get_cstr(buffer) : dst);
  172. }
  173. }
  174. string_clear(buffer);
  175. string_clear(path);
  176. file_worker_close(file_worker);
  177. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  178. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  179. file_worker_free(file_worker);
  180. return result;
  181. }
  182. void archive_add_to_favorites(const char* file_path) {
  183. furi_assert(file_path);
  184. archive_file_append(ARCHIVE_FAV_PATH, "%s\n", file_path);
  185. }
  186. void archive_favorites_save(void* context) {
  187. furi_assert(context);
  188. ArchiveBrowserView* browser = context;
  189. FileWorker* file_worker = file_worker_alloc(true);
  190. for(size_t i = 0; i < archive_file_array_size(browser); i++) {
  191. ArchiveFile_t* item = archive_get_file_at(browser, i);
  192. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(item->name));
  193. }
  194. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  195. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  196. file_worker_free(file_worker);
  197. }