archive_favorites.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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* archive_view = 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(archive_view, &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. va_list args;
  53. va_start(args, format);
  54. uint8_t len = vsnprintf(NULL, 0, format, args);
  55. char filename[len + 1];
  56. vsnprintf(filename, len + 1, format, args);
  57. va_end(args);
  58. FileWorker* file_worker = file_worker_alloc(true);
  59. string_t buffer;
  60. string_init(buffer);
  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. if(string_search_str(buffer, filename)) {
  71. archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\r\n", string_get_cstr(buffer));
  72. }
  73. }
  74. }
  75. string_clear(buffer);
  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. va_list args;
  84. va_start(args, format);
  85. uint8_t len = vsnprintf(NULL, 0, format, args);
  86. char filename[len + 1];
  87. vsnprintf(filename, len + 1, format, args);
  88. va_end(args);
  89. FileWorker* file_worker = file_worker_alloc(true);
  90. string_t buffer;
  91. string_init(buffer);
  92. bool found = false;
  93. bool result = file_worker_open(file_worker, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING);
  94. if(result) {
  95. while(1) {
  96. if(!file_worker_read_until(file_worker, buffer, '\n')) {
  97. break;
  98. }
  99. if(!string_size(buffer)) {
  100. break;
  101. }
  102. if(!string_search_str(buffer, filename)) {
  103. found = true;
  104. break;
  105. }
  106. }
  107. }
  108. string_clear(buffer);
  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\r\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\r\n", file_path);
  149. }