|
10 | 10 | #include <string.h>
|
11 | 11 |
|
12 | 12 | #include "shared/runtime/context_manager_helpers.h"
|
13 |
| -#include "py/objtuple.h" |
| 13 | +#include "py/mperrno.h" |
14 | 14 | #include "py/objlist.h"
|
| 15 | +#include "py/objtuple.h" |
15 | 16 | #include "py/runtime.h"
|
16 |
| -#include "py/mperrno.h" |
| 17 | +#include "py/stream.h" |
17 | 18 |
|
18 | 19 | #include "shared/netutils/netutils.h"
|
19 | 20 |
|
@@ -247,9 +248,58 @@ static const mp_rom_map_elem_t ssl_sslsocket_locals_dict_table[] = {
|
247 | 248 |
|
248 | 249 | static MP_DEFINE_CONST_DICT(ssl_sslsocket_locals_dict, ssl_sslsocket_locals_dict_table);
|
249 | 250 |
|
| 251 | +static mp_uint_t sslsocket_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errorcode) { |
| 252 | + ssl_sslsocket_obj_t *self = MP_OBJ_TO_PTR(self_in); |
| 253 | + mp_int_t ret = common_hal_ssl_sslsocket_recv_into(self, buf, size); |
| 254 | + if (ret < 0) { |
| 255 | + *errorcode = -ret; |
| 256 | + return MP_STREAM_ERROR; |
| 257 | + } |
| 258 | + return ret; |
| 259 | +} |
| 260 | + |
| 261 | +static mp_uint_t sslsocket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errorcode) { |
| 262 | + ssl_sslsocket_obj_t *self = MP_OBJ_TO_PTR(self_in); |
| 263 | + mp_int_t ret = common_hal_ssl_sslsocket_send(self, buf, size); |
| 264 | + if (ret < 0) { |
| 265 | + *errorcode = -ret; |
| 266 | + return MP_STREAM_ERROR; |
| 267 | + } |
| 268 | + return ret; |
| 269 | +} |
| 270 | + |
| 271 | +static mp_uint_t sslsocket_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { |
| 272 | + ssl_sslsocket_obj_t *self = MP_OBJ_TO_PTR(self_in); |
| 273 | + mp_uint_t ret; |
| 274 | + if (request == MP_STREAM_POLL) { |
| 275 | + mp_uint_t flags = arg; |
| 276 | + ret = 0; |
| 277 | + if ((flags & MP_STREAM_POLL_RD) && common_hal_ssl_sslsocket_readable(self) > 0) { |
| 278 | + ret |= MP_STREAM_POLL_RD; |
| 279 | + } |
| 280 | + if ((flags & MP_STREAM_POLL_WR) && common_hal_ssl_sslsocket_writable(self)) { |
| 281 | + ret |= MP_STREAM_POLL_WR; |
| 282 | + } |
| 283 | + } else { |
| 284 | + *errcode = MP_EINVAL; |
| 285 | + ret = MP_STREAM_ERROR; |
| 286 | + } |
| 287 | + return ret; |
| 288 | +} |
| 289 | + |
| 290 | + |
| 291 | +static const mp_stream_p_t sslsocket_stream_p = { |
| 292 | + .read = sslsocket_read, |
| 293 | + .write = sslsocket_write, |
| 294 | + .ioctl = sslsocket_ioctl, |
| 295 | + .is_text = false, |
| 296 | +}; |
| 297 | + |
| 298 | + |
250 | 299 | MP_DEFINE_CONST_OBJ_TYPE(
|
251 | 300 | ssl_sslsocket_type,
|
252 | 301 | MP_QSTR_SSLSocket,
|
253 | 302 | MP_TYPE_FLAG_NONE,
|
254 |
| - locals_dict, &ssl_sslsocket_locals_dict |
| 303 | + locals_dict, &ssl_sslsocket_locals_dict, |
| 304 | + protocol, &sslsocket_stream_p |
255 | 305 | );
|
0 commit comments