flipchess_file.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "flipchess_file.h"
  2. #include <storage/storage.h>
  3. #include <applications.h>
  4. #include <loader/loader.h>
  5. // #define FLIPCHESS_APP_BASE_FOLDER APP_BOARDA_PATH("flipchess")
  6. #define FLIPCHESS_APP_BASE_FOLDER EXT_PATH("apps_data/flipchess")
  7. #define FLIPCHESS_APP_BASE_FOLDER_PATH(path) FLIPCHESS_APP_BASE_FOLDER "/" path
  8. #define FLIPCHESS_BOARD_FILE_NAME "board_fen.txt"
  9. #define FLIPCHESS_BOARD_FILE_NAME_BAK "board_fen.bak"
  10. #define FLIPCHESS_BOARD_PATH FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME)
  11. #define FLIPCHESS_BOARD_PATH_BAK FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME_BAK)
  12. #define FILE_MAX_PATH_LEN 48
  13. #define FILE_MAX_CHARS 94
  14. bool flipchess_has_file(const FlipChessFile file_type, const char* file_name, const bool remove) {
  15. bool ret = false;
  16. const char* path;
  17. if(file_type == FlipChessFileBoard) {
  18. path = FLIPCHESS_BOARD_PATH;
  19. } else {
  20. char path_buf[FILE_MAX_PATH_LEN] = {0};
  21. strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
  22. strcpy(path_buf + strlen(path_buf), "/");
  23. strcpy(path_buf + strlen(path_buf), file_name);
  24. path = path_buf;
  25. }
  26. Storage* fs_api = furi_record_open(RECORD_STORAGE);
  27. if(remove) {
  28. ret = storage_simply_remove(fs_api, path);
  29. } else {
  30. ret = storage_file_exists(fs_api, path);
  31. }
  32. furi_record_close(RECORD_STORAGE);
  33. return ret;
  34. }
  35. bool flipchess_load_file(char* contents, const FlipChessFile file_type, const char* file_name) {
  36. bool ret = false;
  37. const char* path;
  38. if(file_type == FlipChessFileBoard) {
  39. path = FLIPCHESS_BOARD_PATH;
  40. } else {
  41. char path_buf[FILE_MAX_PATH_LEN] = {0};
  42. strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
  43. strcpy(path_buf + strlen(path_buf), "/");
  44. strcpy(path_buf + strlen(path_buf), file_name);
  45. path = path_buf;
  46. }
  47. Storage* fs_api = furi_record_open(RECORD_STORAGE);
  48. File* settings_file = storage_file_alloc(fs_api);
  49. if(storage_file_open(settings_file, path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  50. char chr;
  51. int i = 0;
  52. while((storage_file_read(settings_file, &chr, 1) == 1) &&
  53. !storage_file_eof(settings_file)) {
  54. if(i < FILE_MAX_CHARS) {
  55. contents[i] = chr;
  56. }
  57. i++;
  58. }
  59. ret = true;
  60. } else {
  61. contents[0] = '\0';
  62. ret = false;
  63. }
  64. storage_file_close(settings_file);
  65. storage_file_free(settings_file);
  66. furi_record_close(RECORD_STORAGE);
  67. if(strlen(contents) > 0) {
  68. Storage* fs_api = furi_record_open(RECORD_STORAGE);
  69. FileInfo layout_file_info;
  70. FS_Error file_check_err = storage_common_stat(fs_api, path, &layout_file_info);
  71. furi_record_close(RECORD_STORAGE);
  72. if(file_check_err != FSE_OK) {
  73. contents[0] = '\0';
  74. ret = false;
  75. }
  76. // if(layout_file_info.size != 256) {
  77. // memzero(settings, strlen(settings));
  78. // settings[0] = '\0';
  79. // }
  80. }
  81. return ret;
  82. }
  83. bool flipchess_save_file(
  84. const char* settings,
  85. const FlipChessFile file_type,
  86. const char* file_name,
  87. const bool append,
  88. const bool overwrite) {
  89. bool ret = false;
  90. const char* path;
  91. const char* path_bak;
  92. if(file_type == FlipChessFileBoard) {
  93. path = FLIPCHESS_BOARD_PATH;
  94. path_bak = FLIPCHESS_BOARD_PATH_BAK;
  95. } else {
  96. char path_buf[FILE_MAX_PATH_LEN] = {0};
  97. strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
  98. strcpy(path_buf + strlen(path_buf), "/");
  99. strcpy(path_buf + strlen(path_buf), file_name);
  100. path = path_buf;
  101. path_bak = NULL;
  102. }
  103. int open_mode = FSOM_OPEN_ALWAYS;
  104. if(append) {
  105. open_mode = FSOM_OPEN_APPEND;
  106. }
  107. Storage* fs_api = furi_record_open(RECORD_STORAGE);
  108. // try to create the folder
  109. storage_simply_mkdir(fs_api, FLIPCHESS_APP_BASE_FOLDER);
  110. if(overwrite) {
  111. storage_simply_remove(fs_api, path);
  112. }
  113. File* settings_file = storage_file_alloc(fs_api);
  114. if(storage_file_open(settings_file, path, FSAM_WRITE, open_mode)) {
  115. storage_file_write(settings_file, settings, strlen(settings));
  116. storage_file_write(settings_file, "\n", 1);
  117. ret = true;
  118. }
  119. storage_file_close(settings_file);
  120. storage_file_free(settings_file);
  121. if(path_bak != NULL) {
  122. if(overwrite) {
  123. storage_simply_remove(fs_api, path_bak);
  124. }
  125. File* settings_file_bak = storage_file_alloc(fs_api);
  126. if(storage_file_open(settings_file_bak, path_bak, FSAM_WRITE, open_mode)) {
  127. storage_file_write(settings_file_bak, settings, strlen(settings));
  128. storage_file_write(settings_file_bak, "\n", 1);
  129. }
  130. storage_file_close(settings_file_bak);
  131. storage_file_free(settings_file_bak);
  132. }
  133. furi_record_close(RECORD_STORAGE);
  134. return ret;
  135. }