blob: 01199ab601c99f24c3e3dc0fe73f72fdd6dd209c [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
2 * This file is part of the Micro Python project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
Damien George51dfcb42015-01-01 20:27:54 +000026#ifndef __MICROPY_INCLUDED_PY_STREAM_H__
27#define __MICROPY_INCLUDED_PY_STREAM_H__
28
29#include "py/obj.h"
Paul Sokolovskyf2f761c2016-07-26 14:48:52 +030030#include "py/mperrno.h"
Damien George04b91472014-05-03 23:27:38 +010031
Paul Sokolovskye6a4d4e2016-04-05 21:58:03 +030032#define MP_STREAM_ERROR ((mp_uint_t)-1)
33
34// Stream ioctl request codes
35#define MP_STREAM_FLUSH (1)
36#define MP_STREAM_SEEK (2)
37#define MP_STREAM_POLL (3)
Paul Sokolovskya45e2802016-04-10 12:42:41 +030038//#define MP_STREAM_CLOSE (4) // Not yet implemented
39#define MP_STREAM_TIMEOUT (5) // Get/set timeout (single op)
40#define MP_STREAM_GET_OPTS (6) // Get stream options
41#define MP_STREAM_SET_OPTS (7) // Set stream options
42#define MP_STREAM_GET_DATA_OPTS (8) // Get data/message options
43#define MP_STREAM_SET_DATA_OPTS (9) // Set data/message options
Paul Sokolovskye6a4d4e2016-04-05 21:58:03 +030044
Damien George304cfda2016-12-02 16:37:29 +110045// These poll ioctl values are compatible with Linux
46#define MP_STREAM_POLL_RD (0x0001)
47#define MP_STREAM_POLL_WR (0x0004)
48#define MP_STREAM_POLL_ERR (0x0008)
49#define MP_STREAM_POLL_HUP (0x0010)
50
Paul Sokolovskye6a4d4e2016-04-05 21:58:03 +030051// Argument structure for MP_STREAM_SEEK
52struct mp_stream_seek_t {
53 mp_off_t offset;
54 int whence;
55};
56
Damien George4ebdb1f2016-10-18 11:06:20 +110057MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj);
58MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read1_obj);
59MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_readinto_obj);
Damien George4ebdb1f2016-10-18 11:06:20 +110060MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_unbuffered_readline_obj);
61MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_unbuffered_readlines_obj);
62MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_write_obj);
63MP_DECLARE_CONST_FUN_OBJ_2(mp_stream_write1_obj);
64MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_seek_obj);
65MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_tell_obj);
66MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_flush_obj);
67MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_ioctl_obj);
Paul Sokolovskyd54bef72014-01-20 18:35:32 +020068
Damien Georgee84325b2015-12-08 23:34:59 +000069// these are for mp_get_stream_raise and can be or'd together
70#define MP_STREAM_OP_READ (1)
71#define MP_STREAM_OP_WRITE (2)
72#define MP_STREAM_OP_IOCTL (4)
73
74const mp_stream_p_t *mp_get_stream_raise(mp_obj_t self_in, int flags);
Paul Sokolovsky497660f2016-05-20 21:16:58 +030075mp_obj_t mp_stream_close(mp_obj_t stream);
Damien Georgee84325b2015-12-08 23:34:59 +000076
Paul Sokolovskyd54bef72014-01-20 18:35:32 +020077// Iterator which uses mp_stream_unbuffered_readline_obj
78mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self);
Paul Sokolovskyac736f12014-07-13 23:04:17 +030079
Paul Sokolovsky7f7c84b2016-05-18 02:40:03 +030080mp_obj_t mp_stream_write(mp_obj_t self_in, const void *buf, size_t len, byte flags);
Damien George51dfcb42015-01-01 20:27:54 +000081
Paul Sokolovsky7f7c84b2016-05-18 02:40:03 +030082// C-level helper functions
83#define MP_STREAM_RW_READ 0
84#define MP_STREAM_RW_WRITE 2
85#define MP_STREAM_RW_ONCE 1
86mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf, mp_uint_t size, int *errcode, byte flags);
87#define mp_stream_write_exactly(stream, buf, size, err) mp_stream_rw(stream, (byte*)buf, size, err, MP_STREAM_RW_WRITE)
88#define mp_stream_read_exactly(stream, buf, size, err) mp_stream_rw(stream, buf, size, err, MP_STREAM_RW_READ)
Paul Sokolovskyd4c8e622016-03-24 19:09:00 +020089
Paul Sokolovsky1a7e28d2016-07-25 00:16:51 +030090void mp_stream_write_adaptor(void *self, const char *buf, size_t len);
91
Paul Sokolovsky61e77a42016-07-30 20:05:56 +030092#if MICROPY_STREAMS_POSIX_API
Paul Sokolovsky4f1b0292016-07-30 00:25:06 +030093// Functions with POSIX-compatible signatures
94ssize_t mp_stream_posix_write(mp_obj_t stream, const void *buf, size_t len);
95ssize_t mp_stream_posix_read(mp_obj_t stream, void *buf, size_t len);
96off_t mp_stream_posix_lseek(mp_obj_t stream, off_t offset, int whence);
97int mp_stream_posix_fsync(mp_obj_t stream);
Paul Sokolovsky61e77a42016-07-30 20:05:56 +030098#endif
Paul Sokolovsky4f1b0292016-07-30 00:25:06 +030099
Paul Sokolovsky77994102015-10-18 15:37:19 +0300100#if MICROPY_STREAMS_NON_BLOCK
Paul Sokolovsky77994102015-10-18 15:37:19 +0300101#define mp_is_nonblocking_error(errno) ((errno) == EAGAIN || (errno) == EWOULDBLOCK)
102#else
103#define mp_is_nonblocking_error(errno) (0)
104#endif
105
Damien George51dfcb42015-01-01 20:27:54 +0000106#endif // __MICROPY_INCLUDED_PY_STREAM_H__