|
| 1 | +// |
| 2 | +// Copyright 2022 Il`ya (Marshal) <https://github.com/MarshalX>. All rights reserved. |
| 3 | +// |
| 4 | +// Use of this source code is governed by a BSD-style license |
| 5 | +// that can be found in the LICENSE.md file in the root of the project. |
| 6 | +// |
| 7 | + |
| 8 | +#include "rtc_sctp_transport.h" |
| 9 | + |
| 10 | +namespace python_webrtc { |
| 11 | + |
| 12 | + RTCSctpTransport::RTCSctpTransport( |
| 13 | + python_webrtc::PeerConnectionFactory *factory, rtc::scoped_refptr<webrtc::SctpTransportInterface> transport |
| 14 | + ) { |
| 15 | + _factory = factory; |
| 16 | + _transport = std::move(transport); |
| 17 | + |
| 18 | + _factory->_workerThread->Invoke<void>(RTC_FROM_HERE, [this]() { |
| 19 | + _dtls_transport = _transport->dtls_transport(); |
| 20 | + _transport->RegisterObserver(this); |
| 21 | + }); |
| 22 | + |
| 23 | + if (_transport->Information().state() == webrtc::SctpTransportState::kClosed) { |
| 24 | + Stop(); |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + RTCSctpTransport::~RTCSctpTransport() { |
| 29 | + _factory = nullptr; |
| 30 | + holder()->Release(this); |
| 31 | + } |
| 32 | + |
| 33 | + void RTCSctpTransport::Init(pybind11::module &m) { |
| 34 | + pybind11::class_<RTCSctpTransport>(m, "RTCSctpTransport") |
| 35 | + .def_property_readonly("transport", &RTCSctpTransport::GetTransport, pybind11::return_value_policy::reference) |
| 36 | + .def_property_readonly("state", &RTCSctpTransport::GetState) |
| 37 | + .def_property_readonly("maxMessageSize", &RTCSctpTransport::GetMaxMessageSize) |
| 38 | + .def_property_readonly("maxChannels", &RTCSctpTransport::GetMaxChannels); |
| 39 | + } |
| 40 | + |
| 41 | + InstanceHolder<RTCSctpTransport *, rtc::scoped_refptr<webrtc::SctpTransportInterface>, PeerConnectionFactory *> * |
| 42 | + RTCSctpTransport::holder() { |
| 43 | + static auto holder = new InstanceHolder< |
| 44 | + RTCSctpTransport *, rtc::scoped_refptr<webrtc::SctpTransportInterface>, PeerConnectionFactory * |
| 45 | + >(RTCSctpTransport::Create); |
| 46 | + return holder; |
| 47 | + } |
| 48 | + |
| 49 | + RTCSctpTransport *RTCSctpTransport::Create( |
| 50 | + PeerConnectionFactory *factory, rtc::scoped_refptr<webrtc::SctpTransportInterface> transport |
| 51 | + ) { |
| 52 | + // who caring about freeing memory? |
| 53 | + return new RTCSctpTransport(factory, std::move(transport)); |
| 54 | + } |
| 55 | + |
| 56 | + void RTCSctpTransport::Stop() { |
| 57 | + _transport->UnregisterObserver(); |
| 58 | + } |
| 59 | + |
| 60 | + void RTCSctpTransport::OnStateChange(webrtc::SctpTransportInformation info) { |
| 61 | + // TODO call callback |
| 62 | + |
| 63 | + if (info.state() == webrtc::SctpTransportState::kClosed) { |
| 64 | + Stop(); |
| 65 | + } |
| 66 | + } |
| 67 | + |
| 68 | + RTCDtlsTransport *RTCSctpTransport::GetTransport() { |
| 69 | + return RTCDtlsTransport::holder()->GetOrCreate(_factory, _dtls_transport.get()); |
| 70 | + } |
| 71 | + |
| 72 | + webrtc::SctpTransportState RTCSctpTransport::GetState() { |
| 73 | + return _transport->Information().state(); |
| 74 | + } |
| 75 | + |
| 76 | + std::optional<double> RTCSctpTransport::GetMaxMessageSize() { |
| 77 | + auto size = _transport->Information().MaxMessageSize(); |
| 78 | + if (size.has_value()) { |
| 79 | + return size.value(); |
| 80 | + } |
| 81 | + |
| 82 | + return {}; |
| 83 | + } |
| 84 | + |
| 85 | + std::optional<int> RTCSctpTransport::GetMaxChannels() { |
| 86 | + auto maxChannels = _transport->Information().MaxChannels(); |
| 87 | + if (maxChannels.has_value()) { |
| 88 | + return maxChannels.value(); |
| 89 | + } |
| 90 | + |
| 91 | + return {}; |
| 92 | + } |
| 93 | + |
| 94 | +} // namespace python_webrtc |
0 commit comments