mp_flipper_file_reader.c 1.8 KB

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