diff options
Diffstat (limited to 'src/microspdy/io.h')
-rw-r--r-- | src/microspdy/io.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/src/microspdy/io.h b/src/microspdy/io.h new file mode 100644 index 00000000..c28ba21b --- /dev/null +++ b/src/microspdy/io.h @@ -0,0 +1,216 @@ +/* + This file is part of libmicrospdy + Copyright Copyright (C) 2013 Andrey Uzunov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/** + * @file io.h + * @brief Signatures for IO functions. + * @author Andrey Uzunov + */ + +#ifndef IO_H +#define IO_H + +#include "platform.h" +#include "io_openssl.h" +#include "io_raw.h" + + +/** + * Used for return code when reading and writing to the TLS socket. + */ +enum SPDY_IO_ERROR +{ + /** + * The connection was closed by the other party. + */ + SPDY_IO_ERROR_CLOSED = 0, + + /** + * Any kind of error ocurred. The session has to be closed. + */ + SPDY_IO_ERROR_ERROR = -2, + + /** + * The function had to return without processing any data. The whole + * cycle of events has to be called again (SPDY_run) as something + * either has to be written or read or the the syscall was + * interrupted by a signal. + */ + SPDY_IO_ERROR_AGAIN = -3, +}; + + +/** + * Global initializing. Must be called only once in the program. + * + */ +typedef void +(*SPDYF_IOGlobalInit) (); + + +/** + * Global deinitializing for the whole program. Should be called + * at the end of the program. + * + */ +typedef void +(*SPDYF_IOGlobalDeinit) (); + + +/** + * Initializing of io context for a specific daemon. + * Must be called when the daemon starts. + * + * @param daemon SPDY_Daemon for which io will be used. Daemon's + * certificate and key file are used for tls. + * @return SPDY_YES on success or SPDY_NO on error + */ +typedef int +(*SPDYF_IOInit) (struct SPDY_Daemon *daemon); + + +/** + * Deinitializing io context for a daemon. Should be called + * when the deamon is stopped. + * + * @param daemon SPDY_Daemon which is being stopped + */ +typedef void +(*SPDYF_IODeinit) (struct SPDY_Daemon *daemon); + + +/** + * Initializing io for a specific connection. Must be called + * after the connection has been accepted. + * + * @param session SPDY_Session whose socket will be used + * @return SPDY_NO if some funcs inside fail. SPDY_YES otherwise + */ +typedef int +(*SPDYF_IONewSession) (struct SPDY_Session *session); + + +/** + * Deinitializing io for a specific connection. Should be called + * closing session's socket. + * + * @param session SPDY_Session whose socket is used + */ +typedef void +(*SPDYF_IOCloseSession) (struct SPDY_Session *session); + + +/** + * Reading from session's socket. Reads available data and put it to the + * buffer. + * + * @param session for which data is received + * @param buffer where data from the socket will be written to + * @param size of the buffer + * @return number of bytes (at most size) read from the connection + * 0 if the other party has closed the connection + * SPDY_IO_ERROR code on error + */ +typedef int +(*SPDYF_IORecv) (struct SPDY_Session *session, + void * buffer, + size_t size); + + +/** + * Writing to session's socket. Writes the data given into the buffer to the + * socket. + * + * @param session whose context is used + * @param buffer from where data will be written to the socket + * @param size number of bytes to be taken from the buffer + * @return number of bytes (at most size) from the buffer that has been + * written to the connection + * 0 if the other party has closed the connection + * SPDY_IO_ERROR code on error + */ +typedef int +(*SPDYF_IOSend) (struct SPDY_Session *session, + const void * buffer, + size_t size); + + +/** + * Checks if there is data staying in the buffers of the underlying + * system that waits to be read. In case of TLS, this will call + * something like SSL_pending(). + * + * @param session which is checked + * @return SPDY_YES if data is pending or SPDY_NO otherwise + */ +typedef int +(*SPDYF_IOIsPending) (struct SPDY_Session *session); + + +/** + * Called just before frames are about to be processed and written + * to the socket. + * + * @param session + * @return SPDY_NO if writing must not happen in the call; + * SPDY_YES otherwise + */ +typedef int +(*SPDYF_IOBeforeWrite) (struct SPDY_Session *session); + + +/** + * Called just after frames have been processed and written + * to the socket. + * + * @param session + * @param was_written has the same value as the write function for the + * session will return + * @return returned value will be used by the write function to return + */ +typedef int +(*SPDYF_IOAfterWrite) (struct SPDY_Session *session, + int was_written); + + +/** + * Sets callbacks for the daemon with regard to the IO subsystem. + * + * @param daemon + * @param io_subsystem the IO subsystem that will + * be initialized and used by daemon. + * @return SPDY_YES on success or SPDY_NO otherwise + */ +int +SPDYF_io_set_daemon(struct SPDY_Daemon *daemon, + enum SPDY_IO_SUBSYSTEM io_subsystem); + + +/** + * Sets callbacks for the session with regard to the IO subsystem. + * + * @param session + * @param io_subsystem the IO subsystem that will + * be initialized and used by session. + * @return SPDY_YES on success or SPDY_NO otherwise + */ +int +SPDYF_io_set_session(struct SPDY_Session *session, + enum SPDY_IO_SUBSYSTEM io_subsystem); + +#endif |