From c13e25c329ae65c6a7ccbb35b95406a5939bea4e Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Sun, 22 Aug 2021 17:57:52 +0200 Subject: [PATCH] extmod/modusocket: Add read/write stream methods to socket object. Following other socket implementations. --- extmod/modusocket.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/extmod/modusocket.c b/extmod/modusocket.c index 143470a96a..fea81077c5 100644 --- a/extmod/modusocket.c +++ b/extmod/modusocket.c @@ -362,10 +362,41 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socket_setsockopt_obj) }, { MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socket_settimeout_obj) }, { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) }, + + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, + { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) }, + { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, }; STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table); +mp_uint_t socket_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) { + mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (self->nic == MP_OBJ_NULL) { + return MP_STREAM_ERROR; + } + mp_int_t ret = self->nic_type->recv(self, (byte *)buf, size, errcode); + if (ret < 0) { + ret = MP_STREAM_ERROR; + *errcode = -(*errcode); // expects a positive error code + } + return ret; +} + +mp_uint_t socket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) { + mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (self->nic == MP_OBJ_NULL) { + return MP_STREAM_ERROR; + } + mp_int_t ret = self->nic_type->send(self, buf, size, errcode); + if (ret < 0) { + ret = MP_STREAM_ERROR; + *errcode = -(*errcode); // expects a positive error code + } + return ret; +} + mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) { mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); if (request == MP_STREAM_CLOSE) { @@ -386,6 +417,8 @@ mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int * } STATIC const mp_stream_p_t socket_stream_p = { + .read = socket_read, + .write = socket_write, .ioctl = socket_ioctl, .is_text = false, };