blob: 9c962c0cdd82eb538d12fe8e9045d471b7a4838d [file] [log] [blame]
James Kuszmaul4a42b182021-01-17 11:32:46 -08001#pragma once
2#include "ice_gatherer.h"
3#include "ice_transport.h"
4#include "peer_connection_state.h"
5#include <rawrtc/peer_connection_configuration.h>
6#include <rawrtcc/code.h>
7#include <rawrtcdc/data_channel.h>
8#include <rawrtcdc/data_channel_parameters.h>
9#include <re.h>
10
11// Dependencies
12struct rawrtc_peer_connection_description;
13struct rawrtc_peer_connection_ice_candidate;
14
15/*
16 * Peer connection.
17 */
18struct rawrtc_peer_connection;
19
20/*
21 * Peer connection state change handler.
22 */
23typedef void (*rawrtc_peer_connection_state_change_handler)(
24 enum rawrtc_peer_connection_state const state, // read-only
25 void* const arg);
26
27/*
28 * Negotiation needed handler.
29 */
30typedef void (*rawrtc_negotiation_needed_handler)(void* const arg);
31
32/*
33 * Peer connection ICE local candidate handler.
34 * Note: 'candidate' and 'url' will be NULL in case gathering is complete.
35 * 'url' will be NULL in case a host candidate has been gathered.
36 */
37typedef void (*rawrtc_peer_connection_local_candidate_handler)(
38 struct rawrtc_peer_connection_ice_candidate* const candidate,
39 char const* const url, // read-only
40 void* const arg);
41
42/*
43 * Peer connection ICE local candidate error handler.
44 * Note: 'candidate' and 'url' will be NULL in case gathering is complete.
45 * 'url' will be NULL in case a host candidate has been gathered.
46 */
47typedef void (*rawrtc_peer_connection_local_candidate_error_handler)(
48 struct rawrtc_peer_connection_ice_candidate* const candidate, // read-only, nullable
49 char const* const url, // read-only
50 uint16_t const error_code, // read-only
51 char const* const error_text, // read-only
52 void* const arg);
53
54/*
55 * Signaling state handler.
56 */
57typedef void (*rawrtc_signaling_state_change_handler)(
58 enum rawrtc_signaling_state const state, // read-only
59 void* const arg);
60
61/*
62 * Create a new peer connection.
63 * `*connectionp` must be unreferenced.
64 */
65enum rawrtc_code rawrtc_peer_connection_create(
66 struct rawrtc_peer_connection** const connectionp, // de-referenced
67 struct rawrtc_peer_connection_configuration* configuration, // referenced
68 rawrtc_negotiation_needed_handler const negotiation_needed_handler, // nullable
69 rawrtc_peer_connection_local_candidate_handler const local_candidate_handler, // nullable
70 rawrtc_peer_connection_local_candidate_error_handler const
71 local_candidate_error_handler, // nullable
72 rawrtc_signaling_state_change_handler const signaling_state_change_handler, // nullable
73 rawrtc_ice_transport_state_change_handler const
74 ice_connection_state_change_handler, // nullable
75 rawrtc_ice_gatherer_state_change_handler const ice_gathering_state_change_handler, // nullable
76 rawrtc_peer_connection_state_change_handler const connection_state_change_handler, // nullable
77 rawrtc_data_channel_handler const data_channel_handler, // nullable
78 void* const arg // nullable
79);
80
81/*
82 * Close the peer connection. This will stop all underlying transports
83 * and results in a final 'closed' state.
84 */
85enum rawrtc_code rawrtc_peer_connection_close(struct rawrtc_peer_connection* const connection);
86
87/*
88 * Create an offer.
89 * `*descriptionp` must be unreferenced.
90 */
91enum rawrtc_code rawrtc_peer_connection_create_offer(
92 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
93 struct rawrtc_peer_connection* const connection,
94 bool const ice_restart);
95
96/*
97 * Create an answer.
98 * `*descriptionp` must be unreferenced.
99 */
100enum rawrtc_code rawrtc_peer_connection_create_answer(
101 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
102 struct rawrtc_peer_connection* const connection);
103
104/*
105 * Set and apply the local description.
106 */
107enum rawrtc_code rawrtc_peer_connection_set_local_description(
108 struct rawrtc_peer_connection* const connection,
109 struct rawrtc_peer_connection_description* const description // referenced
110);
111
112/*
113 * Get local description.
114 * Returns `RAWRTC_CODE_NO_VALUE` in case no local description has been
115 * set. Otherwise, `RAWRTC_CODE_SUCCESS` will be returned and
116 * `*descriptionp` must be unreferenced.
117 */
118enum rawrtc_code rawrtc_peer_connection_get_local_description(
119 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
120 struct rawrtc_peer_connection* const connection);
121
122/*
123 * Set and apply the remote description.
124 */
125enum rawrtc_code rawrtc_peer_connection_set_remote_description(
126 struct rawrtc_peer_connection* const connection,
127 struct rawrtc_peer_connection_description* const description // referenced
128);
129
130/*
131 * Get remote description.
132 * Returns `RAWRTC_CODE_NO_VALUE` in case no remote description has been
133 * set. Otherwise, `RAWRTC_CODE_SUCCESS` will be returned and
134 * `*descriptionp` must be unreferenced.
135 */
136enum rawrtc_code rawrtc_peer_connection_get_remote_description(
137 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
138 struct rawrtc_peer_connection* const connection);
139
140/*
141 * Add an ICE candidate to the peer connection.
142 */
143enum rawrtc_code rawrtc_peer_connection_add_ice_candidate(
144 struct rawrtc_peer_connection* const connection,
145 struct rawrtc_peer_connection_ice_candidate* const candidate);
146
147/*
148 * Get the current signalling state of a peer connection.
149 */
150enum rawrtc_code rawrtc_peer_connection_get_signaling_state(
151 enum rawrtc_signaling_state* const statep, // de-referenced
152 struct rawrtc_peer_connection* const connection);
153
154/*
155 * Get the current ICE gathering state of a peer connection.
156 */
157enum rawrtc_code rawrtc_peer_connection_get_ice_gathering_state(
158 enum rawrtc_ice_gatherer_state* const statep, // de-referenced
159 struct rawrtc_peer_connection* const connection);
160
161/*
162 * Get the current ICE connection state of a peer connection.
163 */
164enum rawrtc_code rawrtc_peer_connection_get_ice_connection_state(
165 enum rawrtc_ice_transport_state* const statep, // de-referenced
166 struct rawrtc_peer_connection* const connection);
167
168/*
169 * Get the current (peer) connection state of the peer connection.
170 */
171enum rawrtc_code rawrtc_peer_connection_get_connection_state(
172 enum rawrtc_peer_connection_state* const statep, // de-referenced
173 struct rawrtc_peer_connection* const connection);
174
175/*
176 * Get indication whether the remote peer accepts trickled ICE
177 * candidates.
178 *
179 * Returns `RAWRTC_CODE_NO_VALUE` in case no remote description has been
180 * set.
181 */
182enum rawrtc_code rawrtc_peer_connection_can_trickle_ice_candidates(
183 bool* const can_trickle_ice_candidatesp, // de-referenced
184 struct rawrtc_peer_connection* const connection);
185
186/*
187 * Create a data channel on a peer connection.
188 * `*channelp` must be unreferenced.
189 */
190enum rawrtc_code rawrtc_peer_connection_create_data_channel(
191 struct rawrtc_data_channel** const channelp, // de-referenced
192 struct rawrtc_peer_connection* const connection,
193 struct rawrtc_data_channel_parameters* const parameters, // referenced
194 rawrtc_data_channel_open_handler const open_handler, // nullable
195 rawrtc_data_channel_buffered_amount_low_handler const buffered_amount_low_handler, // nullable
196 rawrtc_data_channel_error_handler const error_handler, // nullable
197 rawrtc_data_channel_close_handler const close_handler, // nullable
198 rawrtc_data_channel_message_handler const message_handler, // nullable
199 void* const arg // nullable
200);
201
202/*
203 * Unset the handler argument and all handlers of the peer connection.
204 */
205enum rawrtc_code rawrtc_peer_connection_unset_handlers(
206 struct rawrtc_peer_connection* const connection);
207
208/*
209 * Set the peer connection's negotiation needed handler.
210 */
211enum rawrtc_code rawrtc_peer_connection_set_negotiation_needed_handler(
212 struct rawrtc_peer_connection* const connection,
213 rawrtc_negotiation_needed_handler const negotiation_needed_handler // nullable
214);
215
216/*
217 * Get the peer connection's negotiation needed handler.
218 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
219 */
220enum rawrtc_code rawrtc_peer_connection_get_negotiation_needed_handler(
221 rawrtc_negotiation_needed_handler* const negotiation_needed_handlerp, // de-referenced
222 struct rawrtc_peer_connection* const connection);
223
224/*
225 * Set the peer connection's ICE local candidate handler.
226 */
227enum rawrtc_code rawrtc_peer_connection_set_local_candidate_handler(
228 struct rawrtc_peer_connection* const connection,
229 rawrtc_peer_connection_local_candidate_handler const local_candidate_handler // nullable
230);
231
232/*
233 * Get the peer connection's ICE local candidate handler.
234 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
235 */
236enum rawrtc_code rawrtc_peer_connection_get_local_candidate_handler(
237 rawrtc_peer_connection_local_candidate_handler* const
238 local_candidate_handlerp, // de-referenced
239 struct rawrtc_peer_connection* const connection);
240
241/*
242 * Set the peer connection's ICE local candidate error handler.
243 */
244enum rawrtc_code rawrtc_peer_connection_set_local_candidate_error_handler(
245 struct rawrtc_peer_connection* const connection,
246 rawrtc_peer_connection_local_candidate_error_handler const
247 local_candidate_error_handler // nullable
248);
249
250/*
251 * Get the peer connection's ICE local candidate error handler.
252 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
253 */
254enum rawrtc_code rawrtc_peer_connection_get_local_candidate_error_handler(
255 rawrtc_peer_connection_local_candidate_error_handler* const
256 local_candidate_error_handlerp, // de-referenced
257 struct rawrtc_peer_connection* const connection);
258
259/*
260 * Set the peer connection's signaling state change handler.
261 */
262enum rawrtc_code rawrtc_peer_connection_set_signaling_state_change_handler(
263 struct rawrtc_peer_connection* const connection,
264 rawrtc_signaling_state_change_handler const signaling_state_change_handler // nullable
265);
266
267/*
268 * Get the peer connection's signaling state change handler.
269 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
270 */
271enum rawrtc_code rawrtc_peer_connection_get_signaling_state_change_handler(
272 rawrtc_signaling_state_change_handler* const signaling_state_change_handlerp, // de-referenced
273 struct rawrtc_peer_connection* const connection);
274
275/*
276 * Set the peer connection's ice connection state change handler.
277 */
278enum rawrtc_code rawrtc_peer_connection_set_ice_connection_state_change_handler(
279 struct rawrtc_peer_connection* const connection,
280 rawrtc_ice_transport_state_change_handler const ice_connection_state_change_handler // nullable
281);
282
283/*
284 * Get the peer connection's ice connection state change handler.
285 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
286 */
287enum rawrtc_code rawrtc_peer_connection_get_ice_connection_state_change_handler(
288 rawrtc_ice_transport_state_change_handler* const
289 ice_connection_state_change_handlerp, // de-referenced
290 struct rawrtc_peer_connection* const connection);
291
292/*
293 * Set the peer connection's ice gathering state change handler.
294 */
295enum rawrtc_code rawrtc_peer_connection_set_ice_gathering_state_change_handler(
296 struct rawrtc_peer_connection* const connection,
297 rawrtc_ice_gatherer_state_change_handler const ice_gathering_state_change_handler // nullable
298);
299
300/*
301 * Get the peer connection's ice gathering state change handler.
302 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
303 */
304enum rawrtc_code rawrtc_peer_connection_get_ice_gathering_state_change_handler(
305 rawrtc_ice_gatherer_state_change_handler* const
306 ice_gathering_state_change_handlerp, // de-referenced
307 struct rawrtc_peer_connection* const connection);
308
309/*
310 * Set the peer connection's (peer) connection state change handler.
311 */
312enum rawrtc_code rawrtc_peer_connection_set_connection_state_change_handler(
313 struct rawrtc_peer_connection* const connection,
314 rawrtc_peer_connection_state_change_handler const connection_state_change_handler // nullable
315);
316
317/*
318 * Get the peer connection's (peer) connection state change handler.
319 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
320 */
321enum rawrtc_code rawrtc_peer_connection_get_connection_state_change_handler(
322 rawrtc_peer_connection_state_change_handler* const
323 connection_state_change_handlerp, // de-referenced
324 struct rawrtc_peer_connection* const connection);
325
326/*
327 * Set the peer connection's data channel handler.
328 */
329enum rawrtc_code rawrtc_peer_connection_set_data_channel_handler(
330 struct rawrtc_peer_connection* const connection,
331 rawrtc_data_channel_handler const data_channel_handler // nullable
332);
333
334/*
335 * Get the peer connection's data channel handler.
336 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
337 */
338enum rawrtc_code rawrtc_peer_connection_get_data_channel_handler(
339 rawrtc_data_channel_handler* const data_channel_handlerp, // de-referenced
340 struct rawrtc_peer_connection* const connection);