| /* |
| * Copyright (C) Tildeslash Ltd. All rights reserved. |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License version 3. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Affero General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| * In addition, as a special exception, the copyright holders give |
| * permission to link the code of portions of this program with the |
| * OpenSSL library under certain conditions as described in each |
| * individual source file, and distribute linked combinations |
| * including the two. |
| * |
| * You must obey the GNU Affero General Public License in all respects |
| * for all of the code used other than OpenSSL. |
| */ |
| |
| |
| #ifndef INPUTSTREAM_INCLUDED |
| #define INPUTSTREAM_INCLUDED |
| #include <sys/types.h> |
| |
| |
| /** |
| * An <b>InputStream</b> can be used for reading text or binary |
| * data (8 bits) from a descriptor. |
| * |
| * The method InputStream_isClosed() can be used to test the |
| * underlying descriptor for an error, a read timeout or for EOF. |
| * |
| * Clients can use this stream in a non-blocking manner by setting |
| * InputStream_setTimeout() to 0. |
| * |
| * @see http://www.mmonit.com/ |
| * @file |
| */ |
| |
| |
| #define T InputStream_T |
| typedef struct T *T; |
| |
| |
| /** |
| * Create a new InputStream object. |
| * @param descriptor The descriptor for this inputstream |
| * @return An InputStream object |
| */ |
| T InputStream_new(int descriptor); |
| |
| |
| /** |
| * Destroy an InputStream object and release allocated resources. |
| * Call this method to release an InputStream object allocated with |
| * InputStream_new() |
| * @param S An InputStream object reference |
| */ |
| void InputStream_free(T *S); |
| |
| |
| /** @name Properties */ |
| //@{ |
| |
| |
| /** |
| * Returns the underlying descriptor for this stream |
| * @param S An InputStream object |
| * @return The descriptor for this stream |
| */ |
| int InputStream_getDescriptor(T S); |
| |
| |
| /** |
| * Set a read <code>timeout</code> in milliseconds. During a read |
| * operation the stream will wait up to <code>timeout</code> |
| * milliseconds for data to become available if not already present. |
| * @param S An InputStream object |
| * @param timeout The timeout value in milliseconds |
| * @exception AssertException if timeout is < 0 |
| */ |
| void InputStream_setTimeout(T S, time_t timeout); |
| |
| |
| /** |
| * Get the read timeout in milliseconds. |
| * @param S An InputStream object |
| * @return The timeout value in milliseconds |
| */ |
| time_t InputStream_getTimeout(T S); |
| |
| |
| /** |
| * Returns true if the underlying descriptor was closed. The stream is |
| * closed if an I/O error occurs. |
| * @param S An InputStream object |
| * @return true if the descriptor was closed, otherwise false |
| */ |
| int InputStream_isClosed(T S); |
| |
| |
| /** |
| * Returns the number of bytes in the InputStream's cache buffer. |
| * I.e. bytes that are cached in the stream's internal buffer |
| * @param S An InputStream object |
| * @return Number of input bytes cached |
| */ |
| int InputStream_buffered(T S); |
| |
| //@} |
| |
| /** |
| * Read a single byte. The byte is returned as an int in the range 0-255. |
| * @param S An InputStream object |
| * @return The byte read, or -1 if the end of the stream has been reached |
| * If the stream uses non-blocking I/O, i.e. timeout is 0, then -1 is also |
| * returned if a read would block, indicating that the caller should try again |
| * later. |
| */ |
| int InputStream_read(T S); |
| |
| |
| /** |
| * Reads in at most one less than <code>size</code> characters and stores |
| * them into the buffer pointed to by <code>s</code>. Reading stops after |
| * an EOF, a newline or '\\0'. If a newline is read, it is stored into the buffer. |
| * A '\\0' is stored after the last character in the buffer. |
| * @param S An InputStream object |
| * @param s A character buffer to store the string in |
| * @param size The size of the string buffer s |
| * @return s on success or NULL when end of file or an error occurs. |
| * If the stream uses non-blocking I/O, i.e. timeout is 0, then NULL is also |
| * returned if a read would block, indicating that the caller should try again |
| * later. |
| */ |
| char *InputStream_readLine(T S, char *s, int size); |
| |
| |
| /** |
| * Reads size <code>bytes</code> and stores them into the byte buffer |
| * pointed to by <code>b</code>. Reading stops when size bytes are read |
| * or if no more data is available. The buffer is <b>not</b> NUL terminated. |
| * @param S An InputStream object |
| * @param b A Byte buffer |
| * @param size The size of the buffer b |
| * @return Number of bytes read, 0 when end of file or -1 if an error occurs. |
| * If the stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also |
| * returned if a read would block, indicating that the caller should try again |
| * later. |
| */ |
| int InputStream_readBytes(T S, void *b, int size); |
| |
| |
| /** |
| * Clears any data that exist in the buffer |
| * @param S An InputStream object |
| */ |
| void InputStream_clear(T S); |
| |
| |
| #undef T |
| #endif |