|  | /* | 
|  | * 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 OUTPUTSTREAM_INCLUDED | 
|  | #define OUTPUTSTREAM_INCLUDED | 
|  | #include <sys/types.h> | 
|  |  | 
|  |  | 
|  | /** | 
|  | * An <b>OutputStream</b> can be used for writing text or binary | 
|  | * data (8 bits) to a descriptor. | 
|  | * | 
|  | * The method OutputStream_isClosed() can be used to test the | 
|  | * underlying descriptor for an error, a write timeout or for EOF. | 
|  | * | 
|  | * Clients can use this stream in a non-blocking manner by setting | 
|  | * OutputStream_setTimeout() to 0. | 
|  | * | 
|  | * @see http://www.mmonit.com/ | 
|  | * @file | 
|  | */ | 
|  |  | 
|  |  | 
|  | #define T OutputStream_T | 
|  | typedef struct T *T; | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Create a new OutputStream object. | 
|  | * @param descriptor The descriptor for this OutputStream | 
|  | * @return An OutputStream object | 
|  | */ | 
|  | T OutputStream_new(int descriptor); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Destroy an OutputStream object, release allocated resources and flush | 
|  | * any remaining buffered data in the stream. Call this method to release | 
|  | * an OutputStream object allocated with OutputStream_new() | 
|  | * @param S An OutputStream object reference | 
|  | */ | 
|  | void OutputStream_free(T *S); | 
|  |  | 
|  |  | 
|  | /** @name Properties */ | 
|  | //@{ | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Returns the underlying descriptor for this stream | 
|  | * @param S An OutputStream object | 
|  | * @return The descriptor for this stream | 
|  | */ | 
|  | int OutputStream_getDescriptor(T S); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Returns the number of bytes in the OutputStream's cache buffer. | 
|  | * I.e. bytes that are cached in stream's internal buffer | 
|  | * @param S An OutputStream object | 
|  | * @return Number of output bytes cached | 
|  | */ | 
|  | int OutputStream_buffered(T S); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Set a write <code>timeout</code> in milliseconds. During a write | 
|  | * operation the stream will wait up to <code>timeout</code> | 
|  | * milliseconds for write to be performed. | 
|  | * @param S An OutputStream object | 
|  | * @param timeout The timeout value in milliseconds | 
|  | * @exception AssertException if timeout isd < 0 | 
|  | */ | 
|  | void OutputStream_setTimeout(T S, time_t timeout); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Get the write timeout in milliseconds. | 
|  | * @param S An OutputStream object | 
|  | * @return The timeout value in milliseconds | 
|  | */ | 
|  | time_t OutputStream_getTimeout(T S); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Returns true if the stream was closed. The stream is closed | 
|  | * if an I/O error occurs | 
|  | * @param S An OutputStream object | 
|  | * @return true if the stream is closed, otherwise false | 
|  | */ | 
|  | int OutputStream_isClosed(T S); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Get the total number of bytes written by the stream to the | 
|  | * underlying descriptor | 
|  | * @param S An OutputStream object | 
|  | * @return The total number of bytes written | 
|  | */ | 
|  | long long int OutputStream_getBytesWritten(T S); | 
|  |  | 
|  | //@} | 
|  |  | 
|  | /** | 
|  | * Writes a character string. Use this function to send text | 
|  | * based data to the underlying descriptor. | 
|  | * @param S An OutputStream object | 
|  | * @param s A String to send to the client. The string may contain | 
|  | * format specifiers similar to the ones used by printf(3). The format | 
|  | * specifiers supported are: | 
|  | * <ul> | 
|  | * <li><b>%s, %c</b> - Prints a string (s) or a single char (c) | 
|  | * <li><b>%d, %i, %u, %o, %x</b> - The int argument is printed as a | 
|  | * signed decimal (d or i), unsigned decimal (u), unsigned octal (o) or | 
|  | * unsigned hexadecimal (x), respectively. An optional length modifier, | 
|  | * 'l' can be used to prefix d, i, n, o, u or x to specify a long argument | 
|  | * instead of an int argument. | 
|  | * <li><b>%e, %f, %g</b> - Prints a real number (see printf(3) for details) | 
|  | * <li><b>%p</b> - The void * pointer argument is printed in hexadecimal | 
|  | * </ul> | 
|  | * @return The number of bytes written or -1 if an error occurred. If the | 
|  | * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned | 
|  | * if a write would block, indicating that the caller should try again later. | 
|  | * @exception AssertException if an unknown format specifier is used in s. | 
|  | */ | 
|  | int OutputStream_print(T S, const char *s, ...) __attribute__((format (printf, 2, 3))); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Writes a character string with a variable argument list. | 
|  | * @param S An OutputStream object | 
|  | * @param s A String to send to the client. The string may contain | 
|  | * format specifiers similar to the ones used by printf(3). | 
|  | * @param ap A variable argument lists | 
|  | * @return The number of bytes written or -1 if an error occurred. If the | 
|  | * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned | 
|  | * if a write would block, indicating that the caller should try again later. | 
|  | * @exception AssertException if an unknown format specifier is used in s. | 
|  | */ | 
|  | int OutputStream_vprint(T S, const char *s, va_list ap); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Write <code>size</code> bytes from the buffer <code>b</code>. | 
|  | * @param S An OutputStream object | 
|  | * @param b The data to be written | 
|  | * @param size The size of the data in b | 
|  | * @return The number of bytes written or -1 if an error occurred. If the | 
|  | * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned | 
|  | * if a write would block, indicating that the caller should try again later. | 
|  | */ | 
|  | int OutputStream_write(T S, const void *b, int size); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Flushes this output stream and write any buffered output bytes. | 
|  | * @param S An OutputStream object | 
|  | * @return The number of bytes written or -1 if an error occurred. If the | 
|  | * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned | 
|  | * if a write would block, indicating that the caller should try again later. | 
|  | */ | 
|  | int OutputStream_flush(T S); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Clears any data that exists in the output buffer | 
|  | * @param S An OutputStream object | 
|  | */ | 
|  | void OutputStream_clear(T S); | 
|  |  | 
|  |  | 
|  | #undef T | 
|  | #endif |