file_reader.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <stdio.h>
  2. #include <furi.h>
  3. #include <storage/storage.h>
  4. #include <py/reader.h>
  5. #include "state.h"
  6. typedef struct {
  7. size_t pointer;
  8. char* content;
  9. size_t size;
  10. } FileReaderContext;
  11. FileReaderContext* file_reader_context_alloc(File* file) {
  12. FileReaderContext* context = malloc(sizeof(FileReaderContext));
  13. context->pointer = 0;
  14. context->size = storage_file_size(file);
  15. context->content = malloc(context->size * sizeof(char));
  16. storage_file_read(file, context->content, context->size);
  17. return context;
  18. }
  19. void file_reader_context_free(FileReaderContext* context) {
  20. free(context->content);
  21. free(context);
  22. }
  23. mp_uint_t file_reader_read(void* data) {
  24. FileReaderContext* context = data;
  25. if(context->size == 0 || context->pointer >= context->size) {
  26. return MP_READER_EOF;
  27. }
  28. return context->content[context->pointer++];
  29. }
  30. void file_reader_close(void* data) {
  31. file_reader_context_free(data);
  32. }
  33. void mp_reader_new_file(mp_reader_t* reader, qstr filename) {
  34. FuriString* file_path = furi_string_alloc();
  35. Storage* storage = furi_record_open(RECORD_STORAGE);
  36. File* file = storage_file_alloc(storage);
  37. furi_string_printf(file_path, "%s/%s", root_module_path, qstr_str(filename));
  38. if(!storage_file_open(file, furi_string_get_cstr(file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
  39. furi_crash("unable to open file");
  40. }
  41. reader->data = file_reader_context_alloc(file);
  42. reader->readbyte = file_reader_read;
  43. reader->close = file_reader_close;
  44. storage_file_free(file);
  45. furi_record_close(RECORD_STORAGE);
  46. furi_string_free(file_path);
  47. }