@@ -365,57 +365,57 @@ STATIC void cc3k_socket_print(void (*print)(void *env, const char *fmt, ...), vo
365365 printf ("<CC3k.socket fd=%d>" , self -> fd );
366366}
367367
368- STATIC mp_uint_t cc3k_socket_send (mp_obj_t self_in , const void * buf , mp_uint_t size , int * errcode ) {
368+ STATIC mp_obj_t cc3k_socket_send (mp_obj_t self_in , mp_obj_t buf_in ) {
369369 cc3k_socket_obj_t * self = self_in ;
370370
371371 if (cc3k_get_fd_closed_state (self -> fd )) {
372372 CC3000_EXPORT (closesocket )(self -> fd );
373- * errcode = EPIPE ;
374- return 0 ;
373+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EPIPE )));
375374 }
376375
376+ mp_buffer_info_t bufinfo ;
377+ mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
378+
377379 // CC3K does not handle fragmentation, and will overflow,
378380 // split the packet into smaller ones and send them out.
379- int bytes = 0 ;
380- while (bytes < size ) {
381- int n = MIN ((size - bytes ), MAX_TX_PACKET );
382- n = CC3000_EXPORT (send )(self -> fd , buf + bytes , n , 0 );
381+ mp_int_t bytes = 0 ;
382+ while (bytes < bufinfo . len ) {
383+ int n = MIN ((bufinfo . len - bytes ), MAX_TX_PACKET );
384+ n = CC3000_EXPORT (send )(self -> fd , bufinfo . buf + bytes , n , 0 );
383385 if (n <= 0 ) {
384- bytes = n ;
385- * errcode = CC3000_EXPORT (errno );
386- break ;
386+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (CC3000_EXPORT (errno ))));
387387 }
388388 bytes += n ;
389389 }
390390
391- return bytes ;
391+ return MP_OBJ_NEW_SMALL_INT ( bytes ) ;
392392}
393+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cc3k_socket_send_obj , cc3k_socket_send );
393394
394- STATIC mp_uint_t cc3k_socket_recv (mp_obj_t self_in , void * buf , mp_uint_t size , int * errcode ) {
395+ STATIC mp_obj_t cc3k_socket_recv (mp_obj_t self_in , mp_obj_t len_in ) {
395396 cc3k_socket_obj_t * self = self_in ;
396397
397398 if (cc3k_get_fd_closed_state (self -> fd )) {
398399 CC3000_EXPORT (closesocket )(self -> fd );
399- return 0 ;
400+ nlr_raise ( mp_obj_new_exception_arg1 ( & mp_type_OSError , MP_OBJ_NEW_SMALL_INT ( EPIPE ))) ;
400401 }
401402
402- // recv MAX_RX_PACKET
403- int bytes = 0 ;
404- while ( bytes < size ) {
405- int n = MIN (( size - bytes ), MAX_RX_PACKET );
406- n = CC3000_EXPORT ( recv )( self -> fd , buf + bytes , n , 0 ) ;
407- if ( n == 0 ) {
408- break ;
409- } else if (n < 0 ) {
410- bytes = n ;
411- * errcode = CC3000_EXPORT ( errno );
412- break ;
413- }
414- bytes += n ;
403+ // recv upto MAX_RX_PACKET
404+ mp_int_t len = mp_obj_get_int ( len_in ) ;
405+ len = MIN ( len , MAX_RX_PACKET );
406+
407+ byte * buf ;
408+ mp_obj_t ret_obj = mp_obj_str_builder_start ( & mp_type_bytes , len , & buf );
409+ len = CC3000_EXPORT ( recv )( self -> fd , buf , len , 0 ) ;
410+ if (len == 0 ) {
411+ return mp_const_empty_bytes ;
412+ } else if ( len < 0 ) {
413+ nlr_raise ( mp_obj_new_exception_arg1 ( & mp_type_OSError , MP_OBJ_NEW_SMALL_INT ( CC3000_EXPORT ( errno )))) ;
414+ } else {
415+ return mp_obj_str_builder_end_with_len ( ret_obj , len ) ;
415416 }
416-
417- return bytes ;
418417}
418+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (cc3k_socket_recv_obj , cc3k_socket_recv );
419419
420420STATIC mp_obj_t cc3k_socket_bind (mp_obj_t self_in , mp_obj_t addr_obj ) {
421421 cc3k_socket_obj_t * self = self_in ;
@@ -565,9 +565,8 @@ STATIC mp_obj_t cc3k_socket_close(mp_obj_t self_in) {
565565STATIC MP_DEFINE_CONST_FUN_OBJ_1 (cc3k_socket_close_obj , cc3k_socket_close );
566566
567567STATIC const mp_map_elem_t cc3k_socket_locals_dict_table [] = {
568- // TODO read/write/send/recv distinctions
569- { MP_OBJ_NEW_QSTR (MP_QSTR_send ), (mp_obj_t )& mp_stream_write_obj },
570- { MP_OBJ_NEW_QSTR (MP_QSTR_recv ), (mp_obj_t )& mp_stream_read_obj },
568+ { MP_OBJ_NEW_QSTR (MP_QSTR_send ), (mp_obj_t )& cc3k_socket_send_obj },
569+ { MP_OBJ_NEW_QSTR (MP_QSTR_recv ), (mp_obj_t )& cc3k_socket_recv_obj },
571570 { MP_OBJ_NEW_QSTR (MP_QSTR_bind ), (mp_obj_t )& cc3k_socket_bind_obj },
572571 { MP_OBJ_NEW_QSTR (MP_QSTR_listen ), (mp_obj_t )& cc3k_socket_listen_obj },
573572 { MP_OBJ_NEW_QSTR (MP_QSTR_accept ), (mp_obj_t )& cc3k_socket_accept_obj },
@@ -644,8 +643,6 @@ mp_uint_t cc3k_ioctl(mp_obj_t self_in, mp_uint_t request, int *errcode, ...) {
644643}
645644
646645STATIC const mp_stream_p_t cc3k_socket_stream_p = {
647- .read = cc3k_socket_recv ,
648- .write = cc3k_socket_send ,
649646 .ioctl = cc3k_ioctl ,
650647 .is_text = false,
651648};
0 commit comments