blob: 392bad1e4952de220685c6d32923a53c240771ea [file] [log] [blame]
James Kuszmaul4a42b182021-01-17 11:32:46 -08001#include "connection.h"
2#include "../peer_connection_description/description.h"
3#include <rawrtc/ice_gatherer.h>
4#include <rawrtc/ice_transport.h>
5#include <rawrtc/peer_connection.h>
6#include <rawrtc/peer_connection_state.h>
7#include <rawrtcc/code.h>
8#include <rawrtcdc/data_channel.h>
9#include <re.h>
10
11/*
12 * Get local description.
13 * Returns `RAWRTC_CODE_NO_VALUE` in case no local description has been
14 * set. Otherwise, `RAWRTC_CODE_SUCCESS` will be returned and
15 * `*descriptionp` must be unreferenced.
16 */
17enum rawrtc_code rawrtc_peer_connection_get_local_description(
18 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
19 struct rawrtc_peer_connection* const connection) {
20 // Check arguments
21 if (!descriptionp || !connection) {
22 return RAWRTC_CODE_INVALID_ARGUMENT;
23 }
24
25 // Reference description (if any)
26 if (connection->local_description) {
27 *descriptionp = mem_ref(connection->local_description);
28 return RAWRTC_CODE_SUCCESS;
29 } else {
30 return RAWRTC_CODE_NO_VALUE;
31 }
32}
33
34/*
35 * Get remote description.
36 * Returns `RAWRTC_CODE_NO_VALUE` in case no remote description has been
37 * set. Otherwise, `RAWRTC_CODE_SUCCESS` will be returned and
38 * `*descriptionp` must be unreferenced.
39 */
40enum rawrtc_code rawrtc_peer_connection_get_remote_description(
41 struct rawrtc_peer_connection_description** const descriptionp, // de-referenced
42 struct rawrtc_peer_connection* const connection) {
43 // Check arguments
44 if (!descriptionp || !connection) {
45 return RAWRTC_CODE_INVALID_ARGUMENT;
46 }
47
48 // Reference description (if any)
49 if (connection->remote_description) {
50 *descriptionp = mem_ref(connection->remote_description);
51 return RAWRTC_CODE_SUCCESS;
52 } else {
53 return RAWRTC_CODE_NO_VALUE;
54 }
55}
56
57/*
58 * Get the current signalling state of a peer connection.
59 */
60enum rawrtc_code rawrtc_peer_connection_get_signaling_state(
61 enum rawrtc_signaling_state* const statep, // de-referenced
62 struct rawrtc_peer_connection* const connection) {
63 // Check arguments
64 if (!statep || !connection) {
65 return RAWRTC_CODE_INVALID_ARGUMENT;
66 }
67
68 // Set state
69 *statep = connection->signaling_state;
70 return RAWRTC_CODE_SUCCESS;
71}
72
73/*
74 * Get the current ICE gathering state of a peer connection.
75 */
76enum rawrtc_code rawrtc_peer_connection_get_ice_gathering_state(
77 enum rawrtc_ice_gatherer_state* const statep, // de-referenced
78 struct rawrtc_peer_connection* const connection) {
79 // Check arguments
80 if (!statep || !connection) {
81 return RAWRTC_CODE_INVALID_ARGUMENT;
82 }
83
84 // Set state
85 // Note: The W3C spec requires us to return 'new' in case no ICE gatherer exists.
86 // Note: Theoretically there's no 'closed' state on the peer connection variant. We ignore
87 // that here.
88 if (connection->context.ice_gatherer) {
89 return rawrtc_ice_gatherer_get_state(statep, connection->context.ice_gatherer);
90 } else {
91 *statep = RAWRTC_ICE_GATHERER_STATE_NEW;
92 return RAWRTC_CODE_SUCCESS;
93 }
94}
95
96/*
97 * Get the current ICE connection state of a peer connection.
98 */
99enum rawrtc_code rawrtc_peer_connection_get_ice_connection_state(
100 enum rawrtc_ice_transport_state* const statep, // de-referenced
101 struct rawrtc_peer_connection* const connection) {
102 // Check arguments
103 if (!statep || !connection) {
104 return RAWRTC_CODE_INVALID_ARGUMENT;
105 }
106
107 // Set state
108 // Note: The W3C spec requires us to return 'new' in case no ICE transport exists.
109 if (connection->context.ice_transport) {
110 return rawrtc_ice_transport_get_state(statep, connection->context.ice_transport);
111 } else {
112 *statep = RAWRTC_ICE_TRANSPORT_STATE_NEW;
113 return RAWRTC_CODE_SUCCESS;
114 }
115}
116
117/*
118 * Get the current (peer) connection state of the peer connection.
119 */
120enum rawrtc_code rawrtc_peer_connection_get_connection_state(
121 enum rawrtc_peer_connection_state* const statep, // de-referenced
122 struct rawrtc_peer_connection* const connection) {
123 // Check arguments
124 if (!statep || !connection) {
125 return RAWRTC_CODE_INVALID_ARGUMENT;
126 }
127
128 // Set state
129 *statep = connection->connection_state;
130 return RAWRTC_CODE_SUCCESS;
131}
132
133/*
134 * Get indication whether the remote peer accepts trickled ICE
135 * candidates.
136 *
137 * Returns `RAWRTC_CODE_NO_VALUE` in case no remote description has been
138 * set.
139 */
140enum rawrtc_code rawrtc_peer_connection_can_trickle_ice_candidates(
141 bool* const can_trickle_ice_candidatesp, // de-referenced
142 struct rawrtc_peer_connection* const connection) {
143 // Check arguments
144 if (!can_trickle_ice_candidatesp || !connection) {
145 return RAWRTC_CODE_INVALID_ARGUMENT;
146 }
147
148 // Set flag (if remote description set)
149 if (connection->remote_description) {
150 *can_trickle_ice_candidatesp = connection->remote_description->trickle_ice;
151 return RAWRTC_CODE_SUCCESS;
152 } else {
153 return RAWRTC_CODE_NO_VALUE;
154 }
155}
156
157/*
158 * Unset the handler argument and all handlers of the peer connection.
159 */
160enum rawrtc_code rawrtc_peer_connection_unset_handlers(
161 struct rawrtc_peer_connection* const connection) {
162 // Check arguments
163 if (!connection) {
164 return RAWRTC_CODE_INVALID_ARGUMENT;
165 }
166
167 // Unset handler argument
168 connection->arg = NULL;
169
170 // Unset all handlers
171 connection->data_channel_handler = NULL;
172 connection->connection_state_change_handler = NULL;
173 connection->ice_gathering_state_change_handler = NULL;
174 connection->ice_connection_state_change_handler = NULL;
175 connection->signaling_state_change_handler = NULL;
176 connection->local_candidate_error_handler = NULL;
177 connection->local_candidate_handler = NULL;
178 connection->negotiation_needed_handler = NULL;
179
180 // Done
181 return RAWRTC_CODE_SUCCESS;
182}
183
184/*
185 * Set the peer connection's negotiation needed handler.
186 */
187enum rawrtc_code rawrtc_peer_connection_set_negotiation_needed_handler(
188 struct rawrtc_peer_connection* const connection,
189 rawrtc_negotiation_needed_handler const negotiation_needed_handler // nullable
190) {
191 // Check arguments
192 if (!connection) {
193 return RAWRTC_CODE_INVALID_ARGUMENT;
194 }
195
196 // Set negotiation needed handler & done
197 connection->negotiation_needed_handler = negotiation_needed_handler;
198 return RAWRTC_CODE_SUCCESS;
199}
200
201/*
202 * Get the peer connection's negotiation needed handler.
203 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
204 */
205enum rawrtc_code rawrtc_peer_connection_get_negotiation_needed_handler(
206 rawrtc_negotiation_needed_handler* const negotiation_needed_handlerp, // de-referenced
207 struct rawrtc_peer_connection* const connection) {
208 // Check arguments
209 if (!negotiation_needed_handlerp || !connection) {
210 return RAWRTC_CODE_INVALID_ARGUMENT;
211 }
212
213 // Get negotiation needed handler (if any)
214 if (connection->negotiation_needed_handler) {
215 *negotiation_needed_handlerp = connection->negotiation_needed_handler;
216 return RAWRTC_CODE_SUCCESS;
217 } else {
218 return RAWRTC_CODE_NO_VALUE;
219 }
220}
221
222/*
223 * Set the peer connection's ICE local candidate handler.
224 */
225enum rawrtc_code rawrtc_peer_connection_set_local_candidate_handler(
226 struct rawrtc_peer_connection* const connection,
227 rawrtc_peer_connection_local_candidate_handler const local_candidate_handler // nullable
228) {
229 // Check arguments
230 if (!connection) {
231 return RAWRTC_CODE_INVALID_ARGUMENT;
232 }
233
234 // Set local candidate handler & done
235 connection->local_candidate_handler = local_candidate_handler;
236 return RAWRTC_CODE_SUCCESS;
237}
238
239/*
240 * Get the peer connection's ICE local candidate handler.
241 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
242 */
243enum rawrtc_code rawrtc_peer_connection_get_local_candidate_handler(
244 rawrtc_peer_connection_local_candidate_handler* const
245 local_candidate_handlerp, // de-referenced
246 struct rawrtc_peer_connection* const connection) {
247 // Check arguments
248 if (!local_candidate_handlerp || !connection) {
249 return RAWRTC_CODE_INVALID_ARGUMENT;
250 }
251
252 // Get local candidate handler (if any)
253 if (connection->local_candidate_handler) {
254 *local_candidate_handlerp = connection->local_candidate_handler;
255 return RAWRTC_CODE_SUCCESS;
256 } else {
257 return RAWRTC_CODE_NO_VALUE;
258 }
259}
260
261/*
262 * Set the peer connection's ICE local candidate error handler.
263 */
264enum rawrtc_code rawrtc_peer_connection_set_local_candidate_error_handler(
265 struct rawrtc_peer_connection* const connection,
266 rawrtc_peer_connection_local_candidate_error_handler const
267 local_candidate_error_handler // nullable
268) {
269 // Check arguments
270 if (!connection) {
271 return RAWRTC_CODE_INVALID_ARGUMENT;
272 }
273
274 // Set local candidate error handler & done
275 connection->local_candidate_error_handler = local_candidate_error_handler;
276 return RAWRTC_CODE_SUCCESS;
277}
278
279/*
280 * Get the peer connection's ICE local candidate error handler.
281 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
282 */
283enum rawrtc_code rawrtc_peer_connection_get_local_candidate_error_handler(
284 rawrtc_peer_connection_local_candidate_error_handler* const
285 local_candidate_error_handlerp, // de-referenced
286 struct rawrtc_peer_connection* const connection) {
287 // Check arguments
288 if (!local_candidate_error_handlerp || !connection) {
289 return RAWRTC_CODE_INVALID_ARGUMENT;
290 }
291
292 // Get local candidate error handler (if any)
293 if (connection->local_candidate_error_handler) {
294 *local_candidate_error_handlerp = connection->local_candidate_error_handler;
295 return RAWRTC_CODE_SUCCESS;
296 } else {
297 return RAWRTC_CODE_NO_VALUE;
298 }
299}
300
301/*
302 * Set the peer connection's signaling state change handler.
303 */
304enum rawrtc_code rawrtc_peer_connection_set_signaling_state_change_handler(
305 struct rawrtc_peer_connection* const connection,
306 rawrtc_signaling_state_change_handler const signaling_state_change_handler // nullable
307) {
308 // Check arguments
309 if (!connection) {
310 return RAWRTC_CODE_INVALID_ARGUMENT;
311 }
312
313 // Set signaling state change handler & done
314 connection->signaling_state_change_handler = signaling_state_change_handler;
315 return RAWRTC_CODE_SUCCESS;
316}
317
318/*
319 * Get the peer connection's signaling state change handler.
320 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
321 */
322enum rawrtc_code rawrtc_peer_connection_get_signaling_state_change_handler(
323 rawrtc_signaling_state_change_handler* const signaling_state_change_handlerp, // de-referenced
324 struct rawrtc_peer_connection* const connection) {
325 // Check arguments
326 if (!signaling_state_change_handlerp || !connection) {
327 return RAWRTC_CODE_INVALID_ARGUMENT;
328 }
329
330 // Get signaling state change handler (if any)
331 if (connection->signaling_state_change_handler) {
332 *signaling_state_change_handlerp = connection->signaling_state_change_handler;
333 return RAWRTC_CODE_SUCCESS;
334 } else {
335 return RAWRTC_CODE_NO_VALUE;
336 }
337}
338
339/*
340 * Set the peer connection's ice connection state change handler.
341 */
342enum rawrtc_code rawrtc_peer_connection_set_ice_connection_state_change_handler(
343 struct rawrtc_peer_connection* const connection,
344 rawrtc_ice_transport_state_change_handler const ice_connection_state_change_handler // nullable
345) {
346 // Check arguments
347 if (!connection) {
348 return RAWRTC_CODE_INVALID_ARGUMENT;
349 }
350
351 // Set ice connection state change handler & done
352 connection->ice_connection_state_change_handler = ice_connection_state_change_handler;
353 return RAWRTC_CODE_SUCCESS;
354}
355
356/*
357 * Get the peer connection's ice connection state change handler.
358 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
359 */
360enum rawrtc_code rawrtc_peer_connection_get_ice_connection_state_change_handler(
361 rawrtc_ice_transport_state_change_handler* const
362 ice_connection_state_change_handlerp, // de-referenced
363 struct rawrtc_peer_connection* const connection) {
364 // Check arguments
365 if (!ice_connection_state_change_handlerp || !connection) {
366 return RAWRTC_CODE_INVALID_ARGUMENT;
367 }
368
369 // Get ice connection state change handler (if any)
370 if (connection->ice_connection_state_change_handler) {
371 *ice_connection_state_change_handlerp = connection->ice_connection_state_change_handler;
372 return RAWRTC_CODE_SUCCESS;
373 } else {
374 return RAWRTC_CODE_NO_VALUE;
375 }
376}
377
378/*
379 * Set the peer connection's ice gathering state change handler.
380 */
381enum rawrtc_code rawrtc_peer_connection_set_ice_gathering_state_change_handler(
382 struct rawrtc_peer_connection* const connection,
383 rawrtc_ice_gatherer_state_change_handler const ice_gathering_state_change_handler // nullable
384) {
385 // Check arguments
386 if (!connection) {
387 return RAWRTC_CODE_INVALID_ARGUMENT;
388 }
389
390 // Set ice gathering state change handler & done
391 connection->ice_gathering_state_change_handler = ice_gathering_state_change_handler;
392 return RAWRTC_CODE_SUCCESS;
393}
394
395/*
396 * Get the peer connection's ice gathering state change handler.
397 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
398 */
399enum rawrtc_code rawrtc_peer_connection_get_ice_gathering_state_change_handler(
400 rawrtc_ice_gatherer_state_change_handler* const
401 ice_gathering_state_change_handlerp, // de-referenced
402 struct rawrtc_peer_connection* const connection) {
403 // Check arguments
404 if (!ice_gathering_state_change_handlerp || !connection) {
405 return RAWRTC_CODE_INVALID_ARGUMENT;
406 }
407
408 // Get ice gathering state change handler (if any)
409 if (connection->ice_gathering_state_change_handler) {
410 *ice_gathering_state_change_handlerp = connection->ice_gathering_state_change_handler;
411 return RAWRTC_CODE_SUCCESS;
412 } else {
413 return RAWRTC_CODE_NO_VALUE;
414 }
415}
416
417/*
418 * Set the peer connection's (peer) connection state change handler.
419 */
420enum rawrtc_code rawrtc_peer_connection_set_connection_state_change_handler(
421 struct rawrtc_peer_connection* const connection,
422 rawrtc_peer_connection_state_change_handler const connection_state_change_handler // nullable
423) {
424 // Check arguments
425 if (!connection) {
426 return RAWRTC_CODE_INVALID_ARGUMENT;
427 }
428
429 // Set (peer) connection state change handler & done
430 connection->connection_state_change_handler = connection_state_change_handler;
431 return RAWRTC_CODE_SUCCESS;
432}
433
434/*
435 * Get the peer connection's (peer) connection state change handler.
436 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
437 */
438enum rawrtc_code rawrtc_peer_connection_get_connection_state_change_handler(
439 rawrtc_peer_connection_state_change_handler* const
440 connection_state_change_handlerp, // de-referenced
441 struct rawrtc_peer_connection* const connection) {
442 // Check arguments
443 if (!connection_state_change_handlerp || !connection) {
444 return RAWRTC_CODE_INVALID_ARGUMENT;
445 }
446
447 // Get (peer) connection state change handler (if any)
448 if (connection->connection_state_change_handler) {
449 *connection_state_change_handlerp = connection->connection_state_change_handler;
450 return RAWRTC_CODE_SUCCESS;
451 } else {
452 return RAWRTC_CODE_NO_VALUE;
453 }
454}
455
456/*
457 * Set the peer connection's data channel handler.
458 */
459enum rawrtc_code rawrtc_peer_connection_set_data_channel_handler(
460 struct rawrtc_peer_connection* const connection,
461 rawrtc_data_channel_handler const data_channel_handler // nullable
462) {
463 // Check arguments
464 if (!connection) {
465 return RAWRTC_CODE_INVALID_ARGUMENT;
466 }
467
468 // Set data channel handler & done
469 connection->data_channel_handler = data_channel_handler;
470 return RAWRTC_CODE_SUCCESS;
471}
472
473/*
474 * Get the peer connection's data channel handler.
475 * Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
476 */
477enum rawrtc_code rawrtc_peer_connection_get_data_channel_handler(
478 rawrtc_data_channel_handler* const data_channel_handlerp, // de-referenced
479 struct rawrtc_peer_connection* const connection) {
480 // Check arguments
481 if (!data_channel_handlerp || !connection) {
482 return RAWRTC_CODE_INVALID_ARGUMENT;
483 }
484
485 // Get data channel handler (if any)
486 if (connection->data_channel_handler) {
487 *data_channel_handlerp = connection->data_channel_handler;
488 return RAWRTC_CODE_SUCCESS;
489 } else {
490 return RAWRTC_CODE_NO_VALUE;
491 }
492}