archive_favorites.c 7.2 KB

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