1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This file is part of libmicrospdy
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    Copyright Copyright (C) 2013 Andrey Uzunov
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This program is free software: you can redistribute it and/or modify
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    it under the terms of the GNU General Public License as published by
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    the Free Software Foundation, either version 3 of the License, or
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    (at your option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    This program is distributed in the hope that it will be useful,
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    but WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    GNU General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    You should have received a copy of the GNU General Public License
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat*/
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file io_raw.h
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief  IO for SPDY without TLS.
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Andrey Uzunov
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef IO_RAW_H
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define IO_RAW_H
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h"
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called only once in the program.
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_global_init();
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * at the end of the program.
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_global_deinit();
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called when the daemon starts.
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param daemon SPDY_Daemon
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_YES on success or SPDY_NO on error
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_init(struct SPDY_Daemon *daemon);
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * when the deamon is stopped.
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param daemon SPDY_Daemon which is being stopped
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_deinit(struct SPDY_Daemon *daemon);
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Must be called
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * after the connection has been accepted.
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session SPDY_Session whose socket will be used
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_NO if some funcs fail. SPDY_YES otherwise
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_new_session(struct SPDY_Session *session);
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Should be called
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * closing session's socket.
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session SPDY_Session whose socket is used
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_close_session(struct SPDY_Session *session);
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Reading from socket. Reads available data and put it to the
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * buffer.
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session for which data is received
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param buffer where data from the socket will be written to
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param size of the buffer
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return number of bytes (at most size) read from the connection
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *         0 if the other party has closed the connection
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *         SPDY_IO_ERROR code on error
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_recv(struct SPDY_Session *session,
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				void * buffer,
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				size_t size);
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Writing to socket. Writes the data given into the buffer to the
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * socket.
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session whose context is used
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param buffer from where data will be written to the socket
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param size number of bytes to be taken from the buffer
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return number of bytes (at most size) from the buffer that has been
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * 			written to the connection
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *         0 if the other party has closed the connection
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *         SPDY_IO_ERROR code on error
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_send(struct SPDY_Session *session,
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				const void * buffer,
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				size_t size);
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Checks if there is data staying in the buffers of the underlying
126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * system that waits to be read. Always returns SPDY_NO, as we do not
127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * use a subsystem here.
128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session which is checked
130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_YES if data is pending or SPDY_NO otherwise
131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_is_pending(struct SPDY_Session *session);
134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Sets TCP_CORK.
138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session
140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return SPDY_NO if writing must not happen in the call;
141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *         SPDY_YES otherwise
142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_before_write(struct SPDY_Session *session);
145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Unsets TCP_CORK.
149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *
150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param session
151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param was_written has the same value as the write function for the
152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat *        session will return
153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return returned value will be used by the write function to return
154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel EratSPDYF_raw_after_write(struct SPDY_Session *session, int was_written);
157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
159