file-worker.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "file-worker.h"
  2. FileWorker::FileWorker(bool _silent)
  3. : fs_api{"sdcard"}
  4. , sd_ex_api{"sdcard-ex"} {
  5. silent = _silent;
  6. }
  7. FileWorker::~FileWorker() {
  8. }
  9. bool FileWorker::open(const char* filename, FS_AccessMode access_mode, FS_OpenMode open_mode) {
  10. bool result = fs_api.get()->file.open(&file, filename, access_mode, open_mode);
  11. if(!result) {
  12. show_error_internal("Cannot open\nfile");
  13. close();
  14. return false;
  15. }
  16. return check_common_errors();
  17. }
  18. bool FileWorker::close() {
  19. fs_api.get()->file.close(&file);
  20. return check_common_errors();
  21. }
  22. bool FileWorker::mkdir(const char* dirname) {
  23. FS_Error fs_result = fs_api.get()->common.mkdir(dirname);
  24. if(fs_result != FSE_OK && fs_result != FSE_EXIST) {
  25. show_error_internal("Cannot create\nfolder");
  26. return false;
  27. };
  28. return check_common_errors();
  29. }
  30. bool FileWorker::remove(const char* filename) {
  31. FS_Error fs_result = fs_api.get()->common.remove(filename);
  32. if(fs_result != FSE_OK && fs_result != FSE_NOT_EXIST) {
  33. show_error_internal("Cannot remove\nold file");
  34. return false;
  35. };
  36. return check_common_errors();
  37. }
  38. bool FileWorker::read(void* buffer, uint16_t bytes_to_read) {
  39. if(!read_internal(buffer, bytes_to_read)) {
  40. return false;
  41. }
  42. return check_common_errors();
  43. }
  44. bool FileWorker::read_until(string_t str_result, char separator) {
  45. string_clean(str_result);
  46. const uint8_t buffer_size = 32;
  47. uint8_t buffer[buffer_size];
  48. do {
  49. uint16_t read_count = fs_api.get()->file.read(&file, buffer, buffer_size);
  50. if(file.error_id != FSE_OK) {
  51. show_error_internal("Cannot read\nfile");
  52. return false;
  53. }
  54. bool result = false;
  55. for(uint16_t i = 0; i < read_count; i++) {
  56. if(buffer[i] == separator) {
  57. uint64_t position;
  58. if(!tell_internal(&position)) {
  59. return false;
  60. }
  61. position = position - read_count + i + 1;
  62. if(!seek_internal(position, true)) {
  63. return false;
  64. }
  65. result = true;
  66. break;
  67. } else {
  68. string_push_back(str_result, buffer[i]);
  69. }
  70. }
  71. if(result || read_count == 0) {
  72. break;
  73. }
  74. } while(true);
  75. return check_common_errors();
  76. }
  77. bool FileWorker::read_hex(uint8_t* buffer, uint16_t bytes_to_read) {
  78. uint8_t text[2];
  79. for(uint8_t i = 0; i < bytes_to_read; i++) {
  80. if(i != 0) {
  81. // space
  82. if(!read_internal(text, 1)) {
  83. return false;
  84. }
  85. }
  86. // actual data
  87. if(!read_internal(text, 2)) {
  88. return false;
  89. }
  90. // convert hex value to byte
  91. buffer[i] = strtol(reinterpret_cast<char*>(text), NULL, 16);
  92. }
  93. return check_common_errors();
  94. }
  95. bool FileWorker::tell(uint64_t* position) {
  96. if(!tell_internal(position)) {
  97. return false;
  98. }
  99. return check_common_errors();
  100. }
  101. bool FileWorker::seek(uint64_t position, bool from_start) {
  102. if(!seek_internal(position, from_start)) {
  103. return false;
  104. }
  105. return check_common_errors();
  106. }
  107. bool FileWorker::write(const void* buffer, uint16_t bytes_to_write) {
  108. if(!write_internal(buffer, bytes_to_write)) {
  109. return false;
  110. }
  111. return check_common_errors();
  112. }
  113. bool FileWorker::write_hex(const uint8_t* buffer, uint16_t bytes_to_write) {
  114. const uint8_t byte_text_size = 3;
  115. char byte_text[byte_text_size];
  116. for(uint8_t i = 0; i < bytes_to_write; i++) {
  117. sniprintf(byte_text, byte_text_size, "%02X", buffer[i]);
  118. if(i != 0) {
  119. // space
  120. const char* space = " ";
  121. if(!write_internal(space, 1)) {
  122. return false;
  123. }
  124. }
  125. if(!write_internal(byte_text, 2)) {
  126. return false;
  127. }
  128. }
  129. return check_common_errors();
  130. }
  131. void FileWorker::show_error(const char* error_text) {
  132. sd_ex_api.get()->show_error(sd_ex_api.get()->context, error_text);
  133. }
  134. bool FileWorker::file_select(
  135. const char* path,
  136. const char* extension,
  137. char* result,
  138. uint8_t result_size,
  139. char* selected_filename) {
  140. return sd_ex_api.get()->file_select(
  141. sd_ex_api.get()->context, path, extension, result, result_size, selected_filename);
  142. }
  143. bool FileWorker::check_common_errors() {
  144. sd_ex_api.get()->check_error(sd_ex_api.get()->context);
  145. return true;
  146. }
  147. void FileWorker::show_error_internal(const char* error_text) {
  148. if(!silent) {
  149. show_error(error_text);
  150. }
  151. }
  152. bool FileWorker::read_internal(void* buffer, uint16_t bytes_to_read) {
  153. uint16_t read_count = fs_api.get()->file.read(&file, buffer, bytes_to_read);
  154. if(file.error_id != FSE_OK || read_count != bytes_to_read) {
  155. show_error_internal("Cannot read\nfile");
  156. return false;
  157. }
  158. return true;
  159. }
  160. bool FileWorker::write_internal(const void* buffer, uint16_t bytes_to_write) {
  161. uint16_t write_count = fs_api.get()->file.write(&file, buffer, bytes_to_write);
  162. if(file.error_id != FSE_OK || write_count != bytes_to_write) {
  163. show_error_internal("Cannot write\nto file");
  164. return false;
  165. }
  166. return true;
  167. }
  168. bool FileWorker::tell_internal(uint64_t* position) {
  169. *position = fs_api.get()->file.tell(&file);
  170. if(file.error_id != FSE_OK) {
  171. show_error_internal("Cannot tell\nfile offset");
  172. return false;
  173. }
  174. return true;
  175. }
  176. bool FileWorker::seek_internal(uint64_t position, bool from_start) {
  177. fs_api.get()->file.seek(&file, position, from_start);
  178. if(file.error_id != FSE_OK) {
  179. show_error_internal("Cannot seek\nfile");
  180. return false;
  181. }
  182. return true;
  183. }