blob: fbe3d7d8592969906dbf7a4d5c74459eb3eb8208 [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
Alexander Steffen55f33242017-06-30 09:22:17 +02002 * This file is part of the MicroPython project, http://micropython.org/
Damien George04b91472014-05-03 23:27:38 +01003 *
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 */
Alexander Steffen299bc622017-06-29 23:14:58 +020026#ifndef MICROPY_INCLUDED_PY_STREAM_H
27#define MICROPY_INCLUDED_PY_STREAM_H
Damien George51dfcb42015-01-01 20:27:54 +000028
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 {
Paul Sokolovsky0cd9ab72017-08-20 21:32:17 +030053 // If whence == MP_SEEK_SET, offset should be treated as unsigned.
54 // This allows dealing with full-width stream sizes (16, 32, 64,
55 // etc. bits). For other seek types, should be treated as signed.
Paul Sokolovskye6a4d4e2016-04-05 21:58:03 +030056 mp_off_t offset;
57 int whence;
58};
59
Paul Sokolovsky0cd9ab72017-08-20 21:32:17 +030060// seek ioctl "whence" values
61#define MP_SEEK_SET (0)
62#define MP_SEEK_CUR (1)
63#define MP_SEEK_END (2)
64
Damien George4ebdb1f2016-10-18 11:06:20 +110065MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj);
66MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read1_obj);
67MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_readinto_obj);
Damien George4ebdb1f2016-10-18 11:06:20 +110068MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_unbuffered_readline_obj);
69MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_unbuffered_readlines_obj);
70MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_write_obj);
71MP_DECLARE_CONST_FUN_OBJ_2(mp_stream_write1_obj);
72MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_seek_obj);
73MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_tell_obj);
74MP_DECLARE_CONST_FUN_OBJ_1(mp_stream_flush_obj);
75MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_ioctl_obj);
Paul Sokolovskyd54bef72014-01-20 18:35:32 +020076
Damien Georgee84325b2015-12-08 23:34:59 +000077// these are for mp_get_stream_raise and can be or'd together
78#define MP_STREAM_OP_READ (1)
79#define MP_STREAM_OP_WRITE (2)
80#define MP_STREAM_OP_IOCTL (4)
81
82const mp_stream_p_t *mp_get_stream_raise(mp_obj_t self_in, int flags);
Paul Sokolovsky497660f2016-05-20 21:16:58 +030083mp_obj_t mp_stream_close(mp_obj_t stream);
Damien Georgee84325b2015-12-08 23:34:59 +000084
Paul Sokolovskyd54bef72014-01-20 18:35:32 +020085// Iterator which uses mp_stream_unbuffered_readline_obj
86mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self);
Paul Sokolovskyac736f12014-07-13 23:04:17 +030087
Paul Sokolovsky7f7c84b2016-05-18 02:40:03 +030088mp_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 +000089
Paul Sokolovsky7f7c84b2016-05-18 02:40:03 +030090// C-level helper functions
91#define MP_STREAM_RW_READ 0
92#define MP_STREAM_RW_WRITE 2
93#define MP_STREAM_RW_ONCE 1
94mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf, mp_uint_t size, int *errcode, byte flags);
95#define mp_stream_write_exactly(stream, buf, size, err) mp_stream_rw(stream, (byte*)buf, size, err, MP_STREAM_RW_WRITE)
96#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 +020097
Paul Sokolovsky1a7e28d2016-07-25 00:16:51 +030098void mp_stream_write_adaptor(void *self, const char *buf, size_t len);
99
Paul Sokolovsky61e77a42016-07-30 20:05:56 +0300100#if MICROPY_STREAMS_POSIX_API
Paul Sokolovsky4f1b0292016-07-30 00:25:06 +0300101// Functions with POSIX-compatible signatures
102ssize_t mp_stream_posix_write(mp_obj_t stream, const void *buf, size_t len);
103ssize_t mp_stream_posix_read(mp_obj_t stream, void *buf, size_t len);
104off_t mp_stream_posix_lseek(mp_obj_t stream, off_t offset, int whence);
105int mp_stream_posix_fsync(mp_obj_t stream);
Paul Sokolovsky61e77a42016-07-30 20:05:56 +0300106#endif
Paul Sokolovsky4f1b0292016-07-30 00:25:06 +0300107
Paul Sokolovsky77994102015-10-18 15:37:19 +0300108#if MICROPY_STREAMS_NON_BLOCK
Paul Sokolovsky77994102015-10-18 15:37:19 +0300109#define mp_is_nonblocking_error(errno) ((errno) == EAGAIN || (errno) == EWOULDBLOCK)
110#else
111#define mp_is_nonblocking_error(errno) (0)
112#endif
113
Alexander Steffen299bc622017-06-29 23:14:58 +0200114#endif // MICROPY_INCLUDED_PY_STREAM_H