Skip to content

Commit

Permalink
Add PeerConnection::setConfiguration() method
Browse files Browse the repository at this point in the history
  • Loading branch information
murillo128 committed Jun 27, 2023
1 parent e420698 commit 7c42ccc
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 24 deletions.
1 change: 1 addition & 0 deletions include/rtc/peerconnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class RTC_CPP_EXPORT PeerConnection final : CheshireCat<impl::PeerConnection> {
void close();

const Configuration *config() const;
void setConfiguration(const Configuration& config);
State state() const;
GatheringState gatheringState() const;
SignalingState signalingState() const;
Expand Down
2 changes: 2 additions & 0 deletions include/rtc/rtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ RTC_C_EXPORT int rtcCreatePeerConnection(const rtcConfiguration *config); // ret
RTC_C_EXPORT int rtcClosePeerConnection(int pc);
RTC_C_EXPORT int rtcDeletePeerConnection(int pc);

RTC_C_EXPORT int rtcSetConfiguration(int pc, const rtcConfiguration *config);

RTC_C_EXPORT int rtcSetLocalDescriptionCallback(int pc, rtcDescriptionCallbackFunc cb);
RTC_C_EXPORT int rtcSetLocalCandidateCallback(int pc, rtcCandidateCallbackFunc cb);
RTC_C_EXPORT int rtcSetStateChangeCallback(int pc, rtcStateChangeCallbackFunc cb);
Expand Down
65 changes: 42 additions & 23 deletions src/capi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,36 +401,46 @@ void rtcSetUserPointer(int i, void *ptr) { setUserPointer(i, ptr); }

void *rtcGetUserPointer(int i) { return getUserPointer(i).value_or(nullptr); }

int rtcCreatePeerConnection(const rtcConfiguration *config) {
return wrap([config] {
Configuration c;
for (int i = 0; i < config->iceServersCount; ++i)
c.iceServers.emplace_back(string(config->iceServers[i]));
Configuration convertConfiguration(const rtcConfiguration *config)
{
Configuration c;

if (config->proxyServer)
c.proxyServer.emplace(config->proxyServer);
if (!config)
return c;

if (config->bindAddress)
c.bindAddress = string(config->bindAddress);
for (int i = 0; i < config->iceServersCount; ++i)
c.iceServers.emplace_back(string(config->iceServers[i]));

if (config->portRangeBegin > 0 || config->portRangeEnd > 0) {
c.portRangeBegin = config->portRangeBegin;
c.portRangeEnd = config->portRangeEnd;
}
if (config->proxyServer)
c.proxyServer.emplace(config->proxyServer);

c.certificateType = static_cast<CertificateType>(config->certificateType);
c.iceTransportPolicy = static_cast<TransportPolicy>(config->iceTransportPolicy);
c.enableIceTcp = config->enableIceTcp;
c.enableIceUdpMux = config->enableIceUdpMux;
c.disableAutoNegotiation = config->disableAutoNegotiation;
c.forceMediaTransport = config->forceMediaTransport;
if (config->bindAddress)
c.bindAddress = string(config->bindAddress);

if (config->mtu > 0)
c.mtu = size_t(config->mtu);
if (config->portRangeBegin > 0 || config->portRangeEnd > 0) {
c.portRangeBegin = config->portRangeBegin;
c.portRangeEnd = config->portRangeEnd;
}

c.certificateType = static_cast<CertificateType>(config->certificateType);
c.iceTransportPolicy = static_cast<TransportPolicy>(config->iceTransportPolicy);
c.enableIceTcp = config->enableIceTcp;
c.enableIceUdpMux = config->enableIceUdpMux;
c.disableAutoNegotiation = config->disableAutoNegotiation;
c.forceMediaTransport = config->forceMediaTransport;

if (config->maxMessageSize)
c.maxMessageSize = size_t(config->maxMessageSize);
if (config->mtu > 0)
c.mtu = size_t(config->mtu);

if (config->maxMessageSize)
c.maxMessageSize = size_t(config->maxMessageSize);

return c;
}

int rtcCreatePeerConnection(const rtcConfiguration *config) {
return wrap([config] {
Configuration c = convertConfiguration(config);
return emplacePeerConnection(std::make_shared<PeerConnection>(std::move(c)));
});
}
Expand All @@ -452,6 +462,15 @@ int rtcDeletePeerConnection(int pc) {
});
}

int rtcSetConfiguration(int pc, const rtcConfiguration *config) {
return wrap([=] {
Configuration c = convertConfiguration(config);
auto peerConnection = getPeerConnection(pc);
peerConnection->setConfiguration(c);
return RTC_ERR_SUCCESS;
});
}

int rtcSetLocalDescriptionCallback(int pc, rtcDescriptionCallbackFunc cb) {
return wrap([&] {
auto peerConnection = getPeerConnection(pc);
Expand Down
7 changes: 7 additions & 0 deletions src/impl/peerconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1247,4 +1247,11 @@ void PeerConnection::updateTrackSsrcCache(const Description &description) {
description.media(i));
}

void PeerConnection::setConfiguration(const Configuration& config_) {
if (state!=State::New)
throw std::invalid_argument("Cannot chante configuration if the ICE transport has already been started");

config = config_;
}

} // namespace rtc::impl
4 changes: 3 additions & 1 deletion src/impl/peerconnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {

void resetCallbacks();

void setConfiguration(const Configuration &config_);

// Helper method for asynchronous callback invocation
template <typename... Args> void trigger(synchronized_callback<Args...> *cb, Args... args) {
try {
Expand All @@ -106,7 +108,7 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
}
}

const Configuration config;
Configuration config;
std::atomic<State> state = State::New;
std::atomic<GatheringState> gatheringState = GatheringState::New;
std::atomic<SignalingState> signalingState = SignalingState::Stable;
Expand Down
4 changes: 4 additions & 0 deletions src/peerconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ void PeerConnection::close() { impl()->close(); }

const Configuration *PeerConnection::config() const { return &impl()->config; }

void PeerConnection::setConfiguration(const Configuration &config) {
impl()->setConfiguration(config);
}

PeerConnection::State PeerConnection::state() const { return impl()->state; }

PeerConnection::GatheringState PeerConnection::gatheringState() const {
Expand Down

0 comments on commit 7c42ccc

Please sign in to comment.