archive_favorites.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. bool archive_favorites_read(void* context) {
  27. furi_assert(context);
  28. ArchiveBrowserView* browser = context;
  29. FileWorker* file_worker = file_worker_alloc(true);
  30. string_t buffer;
  31. FileInfo file_info;
  32. string_init(buffer);
  33. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  34. if(result) {
  35. while(1) {
  36. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  37. break;
  38. }
  39. if(!string_size(buffer)) {
  40. break;
  41. }
  42. archive_add_item(browser, &file_info, string_get_cstr(buffer));
  43. string_clean(buffer);
  44. }
  45. }
  46. string_clear(buffer);
  47. file_worker_close(file_worker);
  48. file_worker_free(file_worker);
  49. return result;
  50. }
  51. bool archive_favorites_delete(const char* format, ...) {
  52. string_t buffer;
  53. string_t filename;
  54. va_list args;
  55. va_start(args, format);
  56. string_init_vprintf(filename, format, args);
  57. va_end(args);
  58. string_init(buffer);
  59. FileWorker* file_worker = file_worker_alloc(true);
  60. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  61. if(result) {
  62. while(1) {
  63. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  64. break;
  65. }
  66. if(!string_size(buffer)) {
  67. break;
  68. }
  69. if(string_search(buffer, filename)) {
  70. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(buffer));
  71. }
  72. }
  73. }
  74. string_clear(buffer);
  75. string_clear(filename);
  76. file_worker_close(file_worker);
  77. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  78. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  79. file_worker_free(file_worker);
  80. return result;
  81. }
  82. bool archive_is_favorite(const char* format, ...) {
  83. string_t buffer;
  84. string_t filename;
  85. va_list args;
  86. va_start(args, format);
  87. string_init_vprintf(filename, format, args);
  88. va_end(args);
  89. string_init(buffer);
  90. FileWorker* file_worker = file_worker_alloc(true);
  91. bool found = false;
  92. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  93. if(result) {
  94. while(1) {
  95. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  96. break;
  97. }
  98. if(!string_size(buffer)) {
  99. break;
  100. }
  101. if(!string_search(buffer, filename)) {
  102. found = true;
  103. break;
  104. }
  105. }
  106. }
  107. string_clear(buffer);
  108. string_clear(filename);
  109. file_worker_close(file_worker);
  110. file_worker_free(file_worker);
  111. return found;
  112. }
  113. bool archive_favorites_rename(const char* file_path, const char* src, const char* dst) {
  114. furi_assert(file_path);
  115. furi_assert(src);
  116. furi_assert(dst);
  117. FileWorker* file_worker = file_worker_alloc(true);
  118. string_t path;
  119. string_t buffer;
  120. string_init(buffer);
  121. string_init(path);
  122. string_printf(path, "%s/%s", file_path, src);
  123. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  124. if(result) {
  125. while(1) {
  126. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  127. break;
  128. }
  129. if(!string_size(buffer)) {
  130. break;
  131. }
  132. archive_file_append(
  133. ARCHIVE_FAV_TEMP_PATH,
  134. "%s\n",
  135. string_search(buffer, path) ? string_get_cstr(buffer) : dst);
  136. }
  137. }
  138. string_clear(buffer);
  139. string_clear(path);
  140. file_worker_close(file_worker);
  141. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  142. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  143. file_worker_free(file_worker);
  144. return result;
  145. }
  146. void archive_add_to_favorites(const char* file_path) {
  147. furi_assert(file_path);
  148. archive_file_append(ARCHIVE_FAV_PATH, "%s\n", file_path);
  149. }
  150. void archive_favorites_save(void* context) {
  151. furi_assert(context);
  152. ArchiveBrowserView* browser = context;
  153. FileWorker* file_worker = file_worker_alloc(true);
  154. for(size_t i = 0; i < archive_file_array_size(browser); i++) {
  155. ArchiveFile_t* item = archive_get_file_at(browser, i);
  156. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(item->name));
  157. }
  158. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  159. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  160. file_worker_free(file_worker);
  161. }