1/*
2    This file is part of libmicrospdy
3    Copyright Copyright (C) 2013 Andrey Uzunov
4
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, either version 3 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/**
20 * @file io_raw.h
21 * @brief  IO for SPDY without TLS.
22 * @author Andrey Uzunov
23 */
24
25#ifndef IO_RAW_H
26#define IO_RAW_H
27
28#include "platform.h"
29
30
31/**
32 * Must be called only once in the program.
33 *
34 */
35void
36SPDYF_raw_global_init();
37
38
39/**
40 * Should be called
41 * at the end of the program.
42 *
43 */
44void
45SPDYF_raw_global_deinit();
46
47
48/**
49 * Must be called when the daemon starts.
50 *
51 * @param daemon SPDY_Daemon
52 * @return SPDY_YES on success or SPDY_NO on error
53 */
54int
55SPDYF_raw_init(struct SPDY_Daemon *daemon);
56
57
58/**
59 * Should be called
60 * when the deamon is stopped.
61 *
62 * @param daemon SPDY_Daemon which is being stopped
63 */
64void
65SPDYF_raw_deinit(struct SPDY_Daemon *daemon);
66
67
68/**
69 * Must be called
70 * after the connection has been accepted.
71 *
72 * @param session SPDY_Session whose socket will be used
73 * @return SPDY_NO if some funcs fail. SPDY_YES otherwise
74 */
75int
76SPDYF_raw_new_session(struct SPDY_Session *session);
77
78
79/**
80 * Should be called
81 * closing session's socket.
82 *
83 * @param session SPDY_Session whose socket is used
84 */
85void
86SPDYF_raw_close_session(struct SPDY_Session *session);
87
88
89/**
90 * Reading from socket. Reads available data and put it to the
91 * buffer.
92 *
93 * @param session for which data is received
94 * @param buffer where data from the socket will be written to
95 * @param size of the buffer
96 * @return number of bytes (at most size) read from the connection
97 *         0 if the other party has closed the connection
98 *         SPDY_IO_ERROR code on error
99 */
100int
101SPDYF_raw_recv(struct SPDY_Session *session,
102				void * buffer,
103				size_t size);
104
105
106/**
107 * Writing to socket. Writes the data given into the buffer to the
108 * socket.
109 *
110 * @param session whose context is used
111 * @param buffer from where data will be written to the socket
112 * @param size number of bytes to be taken from the buffer
113 * @return number of bytes (at most size) from the buffer that has been
114 * 			written to the connection
115 *         0 if the other party has closed the connection
116 *         SPDY_IO_ERROR code on error
117 */
118int
119SPDYF_raw_send(struct SPDY_Session *session,
120				const void * buffer,
121				size_t size);
122
123
124/**
125 * Checks if there is data staying in the buffers of the underlying
126 * system that waits to be read. Always returns SPDY_NO, as we do not
127 * use a subsystem here.
128 *
129 * @param session which is checked
130 * @return SPDY_YES if data is pending or SPDY_NO otherwise
131 */
132int
133SPDYF_raw_is_pending(struct SPDY_Session *session);
134
135
136/**
137 * Sets TCP_CORK.
138 *
139 * @param session
140 * @return SPDY_NO if writing must not happen in the call;
141 *         SPDY_YES otherwise
142 */
143int
144SPDYF_raw_before_write(struct SPDY_Session *session);
145
146
147/**
148 * Unsets TCP_CORK.
149 *
150 * @param session
151 * @param was_written has the same value as the write function for the
152 *        session will return
153 * @return returned value will be used by the write function to return
154 */
155int
156SPDYF_raw_after_write(struct SPDY_Session *session, int was_written);
157
158#endif
159