|
@@ -0,0 +1,145 @@
|
|
|
|
|
+#include "flipchess_file.h"
|
|
|
|
|
+#include <storage/storage.h>
|
|
|
|
|
+#include <applications.h>
|
|
|
|
|
+#include <loader/loader.h>
|
|
|
|
|
+
|
|
|
|
|
+// #define FLIPCHESS_APP_BASE_FOLDER APP_BOARDA_PATH("flipchess")
|
|
|
|
|
+#define FLIPCHESS_APP_BASE_FOLDER EXT_PATH("apps_data/flipchess")
|
|
|
|
|
+#define FLIPCHESS_APP_BASE_FOLDER_PATH(path) FLIPCHESS_APP_BASE_FOLDER "/" path
|
|
|
|
|
+#define FLIPCHESS_BOARD_FILE_NAME "board_fen.txt"
|
|
|
|
|
+#define FLIPCHESS_BOARD_FILE_NAME_BAK "board_fen.bak"
|
|
|
|
|
+#define FLIPCHESS_BOARD_PATH FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME)
|
|
|
|
|
+#define FLIPCHESS_BOARD_PATH_BAK FLIPCHESS_APP_BASE_FOLDER_PATH(FLIPCHESS_BOARD_FILE_NAME_BAK)
|
|
|
|
|
+
|
|
|
|
|
+#define FILE_MAX_PATH_LEN 48
|
|
|
|
|
+#define FILE_MAX_CHARS 94
|
|
|
|
|
+
|
|
|
|
|
+bool flipchess_has_file(const FlipChessFile file_type, const char* file_name, const bool remove) {
|
|
|
|
|
+ bool ret = false;
|
|
|
|
|
+ const char* path;
|
|
|
|
|
+ if(file_type == FlipChessFileBoard) {
|
|
|
|
|
+ path = FLIPCHESS_BOARD_PATH;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ char path_buf[FILE_MAX_PATH_LEN] = {0};
|
|
|
|
|
+ strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), "/");
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), file_name);
|
|
|
|
|
+ path = path_buf;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
|
|
|
|
+ if(remove) {
|
|
|
|
|
+ ret = storage_simply_remove(fs_api, path);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ret = storage_file_exists(fs_api, path);
|
|
|
|
|
+ }
|
|
|
|
|
+ furi_record_close(RECORD_STORAGE);
|
|
|
|
|
+
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool flipchess_load_file(char* contents, const FlipChessFile file_type, const char* file_name) {
|
|
|
|
|
+ bool ret = false;
|
|
|
|
|
+ const char* path;
|
|
|
|
|
+ if(file_type == FlipChessFileBoard) {
|
|
|
|
|
+ path = FLIPCHESS_BOARD_PATH;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ char path_buf[FILE_MAX_PATH_LEN] = {0};
|
|
|
|
|
+ strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), "/");
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), file_name);
|
|
|
|
|
+ path = path_buf;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
|
|
|
|
+
|
|
|
|
|
+ File* settings_file = storage_file_alloc(fs_api);
|
|
|
|
|
+ if(storage_file_open(settings_file, path, FSAM_READ, FSOM_OPEN_EXISTING)) {
|
|
|
|
|
+ char chr;
|
|
|
|
|
+ int i = 0;
|
|
|
|
|
+ while((storage_file_read(settings_file, &chr, 1) == 1) &&
|
|
|
|
|
+ !storage_file_eof(settings_file) && !isspace(chr)) {
|
|
|
|
|
+ if(i < FILE_MAX_CHARS) {
|
|
|
|
|
+ contents[i] = chr;
|
|
|
|
|
+ }
|
|
|
|
|
+ i++;
|
|
|
|
|
+ }
|
|
|
|
|
+ ret = true;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ contents[0] = '\0';
|
|
|
|
|
+ ret = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ storage_file_close(settings_file);
|
|
|
|
|
+ storage_file_free(settings_file);
|
|
|
|
|
+ furi_record_close(RECORD_STORAGE);
|
|
|
|
|
+
|
|
|
|
|
+ if(strlen(contents) > 0) {
|
|
|
|
|
+ Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
|
|
|
|
+ FileInfo layout_file_info;
|
|
|
|
|
+ FS_Error file_check_err = storage_common_stat(fs_api, path, &layout_file_info);
|
|
|
|
|
+ furi_record_close(RECORD_STORAGE);
|
|
|
|
|
+ if(file_check_err != FSE_OK) {
|
|
|
|
|
+ contents[0] = '\0';
|
|
|
|
|
+ ret = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ // if(layout_file_info.size != 256) {
|
|
|
|
|
+ // memzero(settings, strlen(settings));
|
|
|
|
|
+ // settings[0] = '\0';
|
|
|
|
|
+ // }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool flipchess_save_file(
|
|
|
|
|
+ const char* settings,
|
|
|
|
|
+ const FlipChessFile file_type,
|
|
|
|
|
+ const char* file_name,
|
|
|
|
|
+ const bool append) {
|
|
|
|
|
+ bool ret = false;
|
|
|
|
|
+ const char* path;
|
|
|
|
|
+ const char* path_bak;
|
|
|
|
|
+ if(file_type == FlipChessFileBoard) {
|
|
|
|
|
+ path = FLIPCHESS_BOARD_PATH;
|
|
|
|
|
+ path_bak = FLIPCHESS_BOARD_PATH_BAK;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ char path_buf[FILE_MAX_PATH_LEN] = {0};
|
|
|
|
|
+ strcpy(path_buf, FLIPCHESS_APP_BASE_FOLDER); // 22
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), "/");
|
|
|
|
|
+ strcpy(path_buf + strlen(path_buf), file_name);
|
|
|
|
|
+ path = path_buf;
|
|
|
|
|
+ path_bak = NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+ int open_mode = FSOM_OPEN_ALWAYS;
|
|
|
|
|
+ if(append) {
|
|
|
|
|
+ open_mode = FSOM_OPEN_APPEND;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Storage* fs_api = furi_record_open(RECORD_STORAGE);
|
|
|
|
|
+
|
|
|
|
|
+ // try to create the folder
|
|
|
|
|
+ storage_simply_mkdir(fs_api, FLIPCHESS_APP_BASE_FOLDER);
|
|
|
|
|
+
|
|
|
|
|
+ File* settings_file = storage_file_alloc(fs_api);
|
|
|
|
|
+ if(storage_file_open(settings_file, path, FSAM_WRITE, open_mode)) {
|
|
|
|
|
+ storage_file_write(settings_file, settings, strlen(settings));
|
|
|
|
|
+ storage_file_write(settings_file, "\n", 1);
|
|
|
|
|
+ ret = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ storage_file_close(settings_file);
|
|
|
|
|
+ storage_file_free(settings_file);
|
|
|
|
|
+
|
|
|
|
|
+ if(path_bak != NULL) {
|
|
|
|
|
+ File* settings_file_bak = storage_file_alloc(fs_api);
|
|
|
|
|
+ if(storage_file_open(settings_file_bak, path_bak, FSAM_WRITE, open_mode)) {
|
|
|
|
|
+ storage_file_write(settings_file_bak, settings, strlen(settings));
|
|
|
|
|
+ storage_file_write(settings_file_bak, "\n", 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ storage_file_close(settings_file_bak);
|
|
|
|
|
+ storage_file_free(settings_file_bak);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ furi_record_close(RECORD_STORAGE);
|
|
|
|
|
+
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|