hex_viewer_storage.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "hex_viewer_storage.h"
  2. static Storage* hex_viewer_open_storage() {
  3. return furi_record_open(RECORD_STORAGE);
  4. }
  5. static void hex_viewer_close_storage() {
  6. furi_record_close(RECORD_STORAGE);
  7. }
  8. static void hex_viewer_close_config_file(FlipperFormat* file) {
  9. if(file == NULL) return;
  10. flipper_format_file_close(file);
  11. flipper_format_free(file);
  12. }
  13. void hex_viewer_save_settings(void* context) {
  14. HexViewer* app = context;
  15. if(app->save_settings == 0) {
  16. return;
  17. }
  18. FURI_LOG_D(TAG, "Saving Settings");
  19. Storage* storage = hex_viewer_open_storage();
  20. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  21. // Overwrite wont work, so delete first
  22. if(storage_file_exists(storage, HEX_VIEWER_SETTINGS_SAVE_PATH)) {
  23. storage_simply_remove(storage, HEX_VIEWER_SETTINGS_SAVE_PATH);
  24. }
  25. // Open File, create if not exists
  26. if(!storage_common_stat(storage, HEX_VIEWER_SETTINGS_SAVE_PATH, NULL) == FSE_OK) {
  27. FURI_LOG_D(
  28. TAG, "Config file %s is not found. Will create new.", HEX_VIEWER_SETTINGS_SAVE_PATH);
  29. if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
  30. FURI_LOG_D(
  31. TAG, "Directory %s doesn't exist. Will create new.", CONFIG_FILE_DIRECTORY_PATH);
  32. if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
  33. FURI_LOG_E(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
  34. }
  35. }
  36. }
  37. if(!flipper_format_file_open_new(fff_file, HEX_VIEWER_SETTINGS_SAVE_PATH)) {
  38. //totp_close_config_file(fff_file);
  39. FURI_LOG_E(TAG, "Error creating new file %s", HEX_VIEWER_SETTINGS_SAVE_PATH);
  40. hex_viewer_close_storage();
  41. return;
  42. }
  43. // Store Settings
  44. flipper_format_write_header_cstr(
  45. fff_file, HEX_VIEWER_SETTINGS_HEADER, HEX_VIEWER_SETTINGS_FILE_VERSION);
  46. flipper_format_write_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  47. flipper_format_write_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  48. flipper_format_write_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_LED, &app->led, 1);
  49. flipper_format_write_uint32(
  50. fff_file, HEX_VIEWER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  51. if(!flipper_format_rewind(fff_file)) {
  52. hex_viewer_close_config_file(fff_file);
  53. FURI_LOG_E(TAG, "Rewind error");
  54. hex_viewer_close_storage();
  55. return;
  56. }
  57. hex_viewer_close_config_file(fff_file);
  58. hex_viewer_close_storage();
  59. }
  60. void hex_viewer_read_settings(void* context) {
  61. HexViewer* app = context;
  62. Storage* storage = hex_viewer_open_storage();
  63. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  64. if(storage_common_stat(storage, HEX_VIEWER_SETTINGS_SAVE_PATH, NULL) != FSE_OK) {
  65. hex_viewer_close_config_file(fff_file);
  66. hex_viewer_close_storage();
  67. return;
  68. }
  69. uint32_t file_version;
  70. FuriString* temp_str = furi_string_alloc();
  71. if(!flipper_format_file_open_existing(fff_file, HEX_VIEWER_SETTINGS_SAVE_PATH)) {
  72. FURI_LOG_E(TAG, "Cannot open file %s", HEX_VIEWER_SETTINGS_SAVE_PATH);
  73. hex_viewer_close_config_file(fff_file);
  74. hex_viewer_close_storage();
  75. return;
  76. }
  77. if(!flipper_format_read_header(fff_file, temp_str, &file_version)) {
  78. FURI_LOG_E(TAG, "Missing Header Data");
  79. hex_viewer_close_config_file(fff_file);
  80. hex_viewer_close_storage();
  81. return;
  82. }
  83. if(file_version < HEX_VIEWER_SETTINGS_FILE_VERSION) {
  84. FURI_LOG_I(TAG, "old config version, will be removed.");
  85. hex_viewer_close_config_file(fff_file);
  86. hex_viewer_close_storage();
  87. return;
  88. }
  89. flipper_format_read_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  90. flipper_format_read_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  91. flipper_format_read_uint32(fff_file, HEX_VIEWER_SETTINGS_KEY_LED, &app->led, 1);
  92. flipper_format_read_uint32(
  93. fff_file, HEX_VIEWER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  94. flipper_format_rewind(fff_file);
  95. hex_viewer_close_config_file(fff_file);
  96. hex_viewer_close_storage();
  97. }
  98. bool hex_viewer_open_file(void* context, const char* file_path) {
  99. HexViewer* hex_viewer = context;
  100. furi_assert(hex_viewer);
  101. furi_assert(file_path);
  102. // TODO Separate function?
  103. if(hex_viewer->model->stream) {
  104. buffered_file_stream_close(hex_viewer->model->stream);
  105. stream_free(hex_viewer->model->stream); // TODO Check
  106. hex_viewer->model->file_offset = 0;
  107. }
  108. hex_viewer->model->stream = buffered_file_stream_alloc(hex_viewer->storage);
  109. bool isOk = true;
  110. do {
  111. if(!buffered_file_stream_open(
  112. hex_viewer->model->stream, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  113. FURI_LOG_E(TAG, "Unable to open stream: %s", file_path);
  114. isOk = false;
  115. break;
  116. };
  117. hex_viewer->model->file_size = stream_size(hex_viewer->model->stream);
  118. } while(false);
  119. return isOk;
  120. }
  121. bool hex_viewer_read_file(void* context) {
  122. HexViewer* hex_viewer = context;
  123. furi_assert(hex_viewer);
  124. furi_assert(hex_viewer->model->stream);
  125. furi_assert(hex_viewer->model->file_offset % HEX_VIEWER_BYTES_PER_LINE == 0);
  126. memset(hex_viewer->model->file_bytes, 0x0, HEX_VIEWER_BUF_SIZE);
  127. bool isOk = true;
  128. do {
  129. uint32_t offset = hex_viewer->model->file_offset;
  130. if(!stream_seek(hex_viewer->model->stream, offset, true)) {
  131. FURI_LOG_E(TAG, "Unable to seek stream");
  132. isOk = false;
  133. break;
  134. }
  135. hex_viewer->model->file_read_bytes = stream_read(
  136. hex_viewer->model->stream,
  137. (uint8_t*)hex_viewer->model->file_bytes,
  138. HEX_VIEWER_BUF_SIZE);
  139. } while(false);
  140. return isOk;
  141. }