mp_flipper_file_reader.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <stdio.h>
  2. #include <furi.h>
  3. #include <storage/storage.h>
  4. #include <mp_flipper_runtime.h>
  5. #include <mp_flipper_file_reader.h>
  6. #include "mp_flipper_context.h"
  7. #include "mp_flipper_file_helper.h"
  8. typedef struct {
  9. size_t pointer;
  10. FuriString* content;
  11. size_t size;
  12. } FileDescriptor;
  13. inline void* mp_flipper_file_reader_context_alloc(const char* filename) {
  14. mp_flipper_context_t* ctx = mp_flipper_context;
  15. FuriString* path = furi_string_alloc_printf("%s", filename);
  16. File* file = storage_file_alloc(ctx->storage);
  17. FileDescriptor* fd = NULL;
  18. do {
  19. if(mp_flipper_try_resolve_filesystem_path(path) == MP_FLIPPER_IMPORT_STAT_NO_EXIST) {
  20. mp_flipper_raise_os_error_with_filename(MP_ENOENT, filename);
  21. break;
  22. }
  23. if(!storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) {
  24. mp_flipper_raise_os_error_with_filename(MP_ENOENT, filename);
  25. break;
  26. }
  27. fd = malloc(sizeof(FileDescriptor));
  28. fd->pointer = 0;
  29. fd->content = furi_string_alloc();
  30. fd->size = storage_file_size(file);
  31. char character = '\0';
  32. for(size_t i = 0; i < fd->size; i++) {
  33. storage_file_read(file, &character, 1);
  34. furi_string_push_back(fd->content, character);
  35. }
  36. } while(false);
  37. storage_file_free(file);
  38. furi_string_free(path);
  39. return fd;
  40. }
  41. inline uint32_t mp_flipper_file_reader_read(void* data) {
  42. FileDescriptor* fd = data;
  43. if(fd->pointer >= fd->size) {
  44. return MP_FLIPPER_FILE_READER_EOF;
  45. }
  46. return furi_string_get_char(fd->content, fd->pointer++);
  47. }
  48. void mp_flipper_file_reader_close(void* data) {
  49. FileDescriptor* fd = data;
  50. furi_string_free(fd->content);
  51. free(data);
  52. }