archive_favorites.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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. uint16_t file_count = 0;
  70. archive_file_array_rm_all(browser);
  71. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  72. if(result) {
  73. while(1) {
  74. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  75. break;
  76. }
  77. if(!string_size(buffer)) {
  78. break;
  79. }
  80. if(string_search(buffer, "/app:") == 0) {
  81. if(archive_app_is_available(browser, string_get_cstr(buffer))) {
  82. archive_add_app_item(browser, string_get_cstr(buffer));
  83. file_count++;
  84. } else {
  85. need_refresh = true;
  86. }
  87. } else {
  88. bool file_exists = false;
  89. file_worker_is_file_exist(file_worker, string_get_cstr(buffer), &file_exists);
  90. if(file_exists) {
  91. archive_add_file_item(browser, &file_info, string_get_cstr(buffer));
  92. file_count++;
  93. } else {
  94. need_refresh = true;
  95. }
  96. }
  97. string_reset(buffer);
  98. }
  99. }
  100. string_clear(buffer);
  101. file_worker_close(file_worker);
  102. file_worker_free(file_worker);
  103. archive_set_item_count(browser, file_count);
  104. if(need_refresh) {
  105. archive_favourites_rescan();
  106. }
  107. return result;
  108. }
  109. bool archive_favorites_delete(const char* format, ...) {
  110. string_t buffer;
  111. string_t filename;
  112. va_list args;
  113. va_start(args, format);
  114. string_init_vprintf(filename, format, args);
  115. va_end(args);
  116. string_init(buffer);
  117. FileWorker* file_worker = file_worker_alloc(true);
  118. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  119. if(result) {
  120. while(1) {
  121. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  122. break;
  123. }
  124. if(!string_size(buffer)) {
  125. break;
  126. }
  127. if(string_search(buffer, filename)) {
  128. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(buffer));
  129. }
  130. }
  131. }
  132. string_clear(buffer);
  133. string_clear(filename);
  134. file_worker_close(file_worker);
  135. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  136. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  137. file_worker_free(file_worker);
  138. return result;
  139. }
  140. bool archive_is_favorite(const char* format, ...) {
  141. string_t buffer;
  142. string_t filename;
  143. va_list args;
  144. va_start(args, format);
  145. string_init_vprintf(filename, format, args);
  146. va_end(args);
  147. string_init(buffer);
  148. FileWorker* file_worker = file_worker_alloc(true);
  149. bool found = false;
  150. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  151. if(result) {
  152. while(1) {
  153. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  154. break;
  155. }
  156. if(!string_size(buffer)) {
  157. break;
  158. }
  159. if(!string_search(buffer, filename)) {
  160. found = true;
  161. break;
  162. }
  163. }
  164. }
  165. string_clear(buffer);
  166. string_clear(filename);
  167. file_worker_close(file_worker);
  168. file_worker_free(file_worker);
  169. return found;
  170. }
  171. bool archive_favorites_rename(const char* src, const char* dst) {
  172. furi_assert(src);
  173. furi_assert(dst);
  174. FileWorker* file_worker = file_worker_alloc(true);
  175. string_t path;
  176. string_t buffer;
  177. string_init(buffer);
  178. string_init(path);
  179. string_printf(path, "%s", src);
  180. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  181. if(result) {
  182. while(1) {
  183. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  184. break;
  185. }
  186. if(!string_size(buffer)) {
  187. break;
  188. }
  189. archive_file_append(
  190. ARCHIVE_FAV_TEMP_PATH,
  191. "%s\n",
  192. string_search(buffer, path) ? string_get_cstr(buffer) : dst);
  193. }
  194. }
  195. string_clear(buffer);
  196. string_clear(path);
  197. file_worker_close(file_worker);
  198. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  199. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  200. file_worker_free(file_worker);
  201. return result;
  202. }
  203. void archive_add_to_favorites(const char* file_path) {
  204. furi_assert(file_path);
  205. archive_file_append(ARCHIVE_FAV_PATH, "%s\n", file_path);
  206. }
  207. void archive_favorites_save(void* context) {
  208. furi_assert(context);
  209. ArchiveBrowserView* browser = context;
  210. FileWorker* file_worker = file_worker_alloc(true);
  211. for(size_t i = 0; i < archive_file_get_array_size(browser); i++) {
  212. ArchiveFile_t* item = archive_get_file_at(browser, i);
  213. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", string_get_cstr(item->name));
  214. }
  215. file_worker_remove(file_worker, ARCHIVE_FAV_PATH);
  216. file_worker_rename(file_worker, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH);
  217. file_worker_free(file_worker);
  218. }