summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriabdalkader <i.abdalkader@gmail.com>2021-08-22 17:57:52 +0200
committerDamien George <damien@micropython.org>2021-09-15 01:28:37 +1000
commitc13e25c329ae65c6a7ccbb35b95406a5939bea4e (patch)
tree13984023ed8879c26f7053ab0c4846573be72d48
parente7429389a6a6322ebf88c30bf417279dc36ecda1 (diff)
extmod/modusocket: Add read/write stream methods to socket object.
Following other socket implementations.
-rw-r--r--extmod/modusocket.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/extmod/modusocket.c b/extmod/modusocket.c
index 143470a96..fea81077c 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,
};