Added optional stream to emplaceDataChannel()

This commit is contained in:
Paul-Louis Ageneau
2020-11-07 16:19:54 +01:00
parent 973f58ec8b
commit 5eaed06b01
2 changed files with 15 additions and 11 deletions

View File

@ -135,7 +135,8 @@ private:
void forwardBufferedAmount(uint16_t stream, size_t amount);
std::shared_ptr<DataChannel> emplaceDataChannel(Description::Role role, string label,
string protocol, Reliability reliability);
string protocol, Reliability reliability,
std::optional<unsigned int> stream = nullopt);
std::shared_ptr<DataChannel> findDataChannel(uint16_t stream);
void iterateDataChannels(std::function<void(std::shared_ptr<DataChannel> channel)> func);
void openDataChannels();

View File

@ -735,18 +735,21 @@ void PeerConnection::forwardBufferedAmount(uint16_t stream, size_t amount) {
shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(Description::Role role, string label,
string protocol,
Reliability reliability) {
// The active side must use streams with even identifiers, whereas the passive side must use
// streams with odd identifiers.
// See https://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-09#section-6
Reliability reliability,
std::optional<unsigned int> stream) {
std::unique_lock lock(mDataChannelsMutex); // we are going to emplace
unsigned int stream = (role == Description::Role::Active) ? 0 : 1;
while (mDataChannels.find(stream) != mDataChannels.end()) {
stream += 2;
if (stream >= 65535)
throw std::runtime_error("Too many DataChannels");
if(!stream) {
// The active side must use streams with even identifiers, whereas the passive side must use
// streams with odd identifiers.
// See https://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-09#section-6
*stream = (role == Description::Role::Active) ? 0 : 1;
while (mDataChannels.find(*stream) != mDataChannels.end()) {
*stream += 2;
if (*stream >= 65535)
throw std::runtime_error("Too many DataChannels");
}
}
auto channel = std::make_shared<DataChannel>(shared_from_this(), stream, std::move(label),
auto channel = std::make_shared<DataChannel>(shared_from_this(), *stream, std::move(label),
std::move(protocol), std::move(reliability));
mDataChannels.emplace(std::make_pair(stream, channel));
return channel;