blob: 6bc582ceb58e4d4cb53ea8d17b1c8389d909072a [file] [log] [blame]
#include "transport.h"
#include <rawrtcdc/data_channel.h>
#include <rawrtcdc/sctp_capabilities.h>
#include <rawrtcdc/sctp_transport.h>
#include <re.h>
/*
* Get the current state of the SCTP transport.
*/
enum rawrtc_code rawrtc_sctp_transport_get_state(
enum rawrtc_sctp_transport_state* const statep, // de-referenced
struct rawrtc_sctp_transport* const transport) {
// Check arguments
if (!statep || !transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Set state & done
*statep = transport->state;
return RAWRTC_CODE_SUCCESS;
}
/*
* Get the local port of the SCTP transport.
*/
enum rawrtc_code rawrtc_sctp_transport_get_port(
uint16_t* const portp, // de-referenced
struct rawrtc_sctp_transport* const transport) {
// Check arguments
if (!portp || !transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Set port & done
*portp = transport->port;
return RAWRTC_CODE_SUCCESS;
}
/*
* Get the number of streams allocated for the SCTP transport.
*/
enum rawrtc_code rawrtc_sctp_transport_get_n_streams(
uint16_t* const n_streamsp, // de-referenced
struct rawrtc_sctp_transport* const transport) {
// Check arguments
if (!n_streamsp || !transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Set #streams & done
*n_streamsp = (uint16_t) transport->n_channels;
return RAWRTC_CODE_SUCCESS;
}
/*
* Get the local SCTP transport capabilities (static).
* `*capabilitiesp` must be unreferenced.
*/
enum rawrtc_code rawrtc_sctp_transport_get_capabilities(
struct rawrtc_sctp_capabilities** const capabilitiesp // de-referenced
) {
return rawrtc_sctp_capabilities_create(capabilitiesp, RAWRTC_SCTP_TRANSPORT_MAX_MESSAGE_SIZE);
}
/*
* Set the SCTP transport's data channel handler.
*/
enum rawrtc_code rawrtc_sctp_transport_set_data_channel_handler(
struct rawrtc_sctp_transport* const transport,
rawrtc_data_channel_handler const data_channel_handler // nullable
) {
// Check arguments
if (!transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Set data channel handler & done
transport->data_channel_handler = data_channel_handler;
return RAWRTC_CODE_SUCCESS;
}
/*
* Get the SCTP transport's data channel handler.
* Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
*/
enum rawrtc_code rawrtc_sctp_transport_get_data_channel_handler(
rawrtc_data_channel_handler* const data_channel_handlerp, // de-referenced
struct rawrtc_sctp_transport* const transport) {
// Check arguments
if (!data_channel_handlerp || !transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Get message handler (if any)
if (transport->data_channel_handler) {
*data_channel_handlerp = transport->data_channel_handler;
return RAWRTC_CODE_SUCCESS;
} else {
return RAWRTC_CODE_NO_VALUE;
}
}
/*
* Set the SCTP transport's state change handler.
*/
enum rawrtc_code rawrtc_sctp_transport_set_state_change_handler(
struct rawrtc_sctp_transport* const transport,
rawrtc_sctp_transport_state_change_handler const state_change_handler // nullable
) {
// Check arguments
if (!transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Set data channel handler & done
transport->state_change_handler = state_change_handler;
return RAWRTC_CODE_SUCCESS;
}
/*
* Get the SCTP transport's state change handler.
* Returns `RAWRTC_CODE_NO_VALUE` in case no handler has been set.
*/
enum rawrtc_code rawrtc_sctp_transport_get_state_change_handler(
rawrtc_sctp_transport_state_change_handler* const state_change_handlerp, // de-referenced
struct rawrtc_sctp_transport* const transport) {
// Check arguments
if (!state_change_handlerp || !transport) {
return RAWRTC_CODE_INVALID_ARGUMENT;
}
// Get message handler (if any)
if (transport->state_change_handler) {
*state_change_handlerp = transport->state_change_handler;
return RAWRTC_CODE_SUCCESS;
} else {
return RAWRTC_CODE_NO_VALUE;
}
}