mp_flipper_fileio.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include "mp_flipper_fileio.h"
  4. #include "py/obj.h"
  5. #include "py/stream.h"
  6. #include "py/runtime.h"
  7. extern const mp_obj_type_t mp_flipper_fileio_type;
  8. typedef struct _mp_flipper_fileio_file_descriptor_t {
  9. mp_obj_base_t base;
  10. void* handle;
  11. size_t offset;
  12. mp_flipper_file_access_mode_t access_mode;
  13. mp_flipper_file_open_mode_t open_mode;
  14. } mp_flipper_fileio_file_descriptor_t;
  15. void* mp_flipper_file_new_file_descriptor(
  16. void* handle,
  17. size_t offset,
  18. mp_flipper_file_access_mode_t access_mode,
  19. mp_flipper_file_open_mode_t open_mode) {
  20. mp_flipper_fileio_file_descriptor_t* fd = mp_obj_malloc(mp_flipper_fileio_file_descriptor_t, &mp_flipper_fileio_type);
  21. fd->handle = handle;
  22. fd->offset = offset;
  23. fd->access_mode = access_mode;
  24. fd->open_mode = open_mode;
  25. return fd;
  26. }
  27. static mp_uint_t mp_flipper_fileio_read(mp_obj_t self, void* buf, mp_uint_t size, int* errcode) {
  28. mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
  29. return mp_flipper_file_read(fd->handle, buf, size, errcode);
  30. }
  31. static mp_uint_t mp_flipper_fileio_write(mp_obj_t self, const void* buf, mp_uint_t size, int* errcode) {
  32. mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
  33. return mp_flipper_file_write(fd->handle, buf, size, errcode);
  34. }
  35. static mp_obj_t mp_flipper_fileio_close(mp_obj_t self) {
  36. mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
  37. int errorno = mp_flipper_file_close(fd->handle);
  38. if(errorno != 0) {
  39. mp_raise_OSError(errorno);
  40. }
  41. return mp_const_none;
  42. }
  43. static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_close_obj, mp_flipper_fileio_close);
  44. static mp_obj_t mp_flipper_fileio___exit___(size_t n_args, const mp_obj_t* args) {
  45. return mp_flipper_fileio_close(args[0]);
  46. }
  47. static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_flipper_fileio___exit___obj, 4, 4, mp_flipper_fileio___exit___);
  48. static mp_obj_t mp_flipper_fileio_writable(mp_obj_t self) {
  49. return mp_flipper_file_writable((void*)self) ? mp_const_true : mp_const_false;
  50. }
  51. static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_writable_obj, mp_flipper_fileio_writable);
  52. static const mp_map_elem_t mp_flipper_file_locals_dict_table[] = {
  53. {MP_OBJ_NEW_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_flipper_fileio_close_obj)},
  54. {MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj)},
  55. {MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&mp_flipper_fileio___exit___obj)},
  56. {MP_OBJ_NEW_QSTR(MP_QSTR_writable), MP_ROM_PTR(&mp_flipper_fileio_writable_obj)},
  57. {MP_OBJ_NEW_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj)},
  58. {MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj)},
  59. {MP_OBJ_NEW_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj)},
  60. {MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj)},
  61. };
  62. static MP_DEFINE_CONST_DICT(mp_flipper_file_locals_dict, mp_flipper_file_locals_dict_table);
  63. static const mp_stream_p_t mp_flipper_fileio_stream_p = {
  64. .read = mp_flipper_fileio_read,
  65. .write = mp_flipper_fileio_write,
  66. };
  67. MP_DEFINE_CONST_OBJ_TYPE(
  68. mp_flipper_fileio_type,
  69. MP_QSTR_FileIO,
  70. MP_TYPE_FLAG_NONE,
  71. protocol,
  72. &mp_flipper_fileio_stream_p,
  73. locals_dict,
  74. &mp_flipper_file_locals_dict);