| /* |
| 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 |