123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- #ifndef PC_DATA_CHANNEL_CONTROLLER_H_
- #define PC_DATA_CHANNEL_CONTROLLER_H_
- #include <map>
- #include <memory>
- #include <string>
- #include <vector>
- #include "pc/channel.h"
- #include "pc/rtp_data_channel.h"
- #include "pc/sctp_data_channel.h"
- #include "rtc_base/weak_ptr.h"
- namespace webrtc {
- class PeerConnection;
- class DataChannelController : public RtpDataChannelProviderInterface,
- public SctpDataChannelProviderInterface,
- public DataChannelSink {
- public:
- explicit DataChannelController(PeerConnection* pc) : pc_(pc) {}
-
- DataChannelController(DataChannelController&) = delete;
- DataChannelController& operator=(const DataChannelController& other) = delete;
- DataChannelController(DataChannelController&&) = delete;
- DataChannelController& operator=(DataChannelController&& other) = delete;
-
-
- bool SendData(const cricket::SendDataParams& params,
- const rtc::CopyOnWriteBuffer& payload,
- cricket::SendDataResult* result) override;
- bool ConnectDataChannel(RtpDataChannel* webrtc_data_channel) override;
- void DisconnectDataChannel(RtpDataChannel* webrtc_data_channel) override;
- bool ConnectDataChannel(SctpDataChannel* webrtc_data_channel) override;
- void DisconnectDataChannel(SctpDataChannel* webrtc_data_channel) override;
- void AddSctpDataStream(int sid) override;
- void RemoveSctpDataStream(int sid) override;
- bool ReadyToSendData() const override;
-
- void OnDataReceived(int channel_id,
- DataMessageType type,
- const rtc::CopyOnWriteBuffer& buffer) override;
- void OnChannelClosing(int channel_id) override;
- void OnChannelClosed(int channel_id) override;
- void OnReadyToSend() override;
- void OnTransportClosed() override;
-
- void SetupDataChannelTransport_n();
-
- void TeardownDataChannelTransport_n();
-
-
- void OnTransportChanged(
- DataChannelTransportInterface* data_channel_transport);
-
- std::vector<DataChannelStats> GetDataChannelStats() const;
-
-
- rtc::scoped_refptr<DataChannelInterface> InternalCreateDataChannelWithProxy(
- const std::string& label,
- const InternalDataChannelInit*
- config) ;
- void AllocateSctpSids(rtc::SSLRole role);
- SctpDataChannel* FindDataChannelBySid(int sid) const;
-
- bool HasDataChannels() const;
- bool HasSctpDataChannels() const {
- RTC_DCHECK_RUN_ON(signaling_thread());
- return !sctp_data_channels_.empty();
- }
- bool HasRtpDataChannels() const {
- RTC_DCHECK_RUN_ON(signaling_thread());
- return !rtp_data_channels_.empty();
- }
- void UpdateLocalRtpDataChannels(const cricket::StreamParamsVec& streams);
- void UpdateRemoteRtpDataChannels(const cricket::StreamParamsVec& streams);
-
- cricket::DataChannelType data_channel_type() const;
- void set_data_channel_type(cricket::DataChannelType type);
- cricket::RtpDataChannel* rtp_data_channel() const {
- return rtp_data_channel_;
- }
- void set_rtp_data_channel(cricket::RtpDataChannel* channel) {
- rtp_data_channel_ = channel;
- }
- DataChannelTransportInterface* data_channel_transport() const;
- void set_data_channel_transport(DataChannelTransportInterface* transport);
- const std::map<std::string, rtc::scoped_refptr<RtpDataChannel>>*
- rtp_data_channels() const;
- sigslot::signal1<RtpDataChannel*>& SignalRtpDataChannelCreated() {
- RTC_DCHECK_RUN_ON(signaling_thread());
- return SignalRtpDataChannelCreated_;
- }
- sigslot::signal1<SctpDataChannel*>& SignalSctpDataChannelCreated() {
- RTC_DCHECK_RUN_ON(signaling_thread());
- return SignalSctpDataChannelCreated_;
- }
-
- void OnTransportChannelClosed();
- void OnSctpDataChannelClosed(SctpDataChannel* channel);
- private:
- rtc::scoped_refptr<RtpDataChannel> InternalCreateRtpDataChannel(
- const std::string& label,
- const DataChannelInit* config) ;
- rtc::scoped_refptr<SctpDataChannel> InternalCreateSctpDataChannel(
- const std::string& label,
- const InternalDataChannelInit*
- config) ;
-
-
- bool HandleOpenMessage_s(const cricket::ReceiveDataParams& params,
- const rtc::CopyOnWriteBuffer& buffer)
- RTC_RUN_ON(signaling_thread());
-
- void OnDataChannelOpenMessage(const std::string& label,
- const InternalDataChannelInit& config)
- RTC_RUN_ON(signaling_thread());
- void CreateRemoteRtpDataChannel(const std::string& label,
- uint32_t remote_ssrc)
- RTC_RUN_ON(signaling_thread());
- void UpdateClosingRtpDataChannels(
- const std::vector<std::string>& active_channels,
- bool is_local_update) RTC_RUN_ON(signaling_thread());
-
- bool DataChannelSendData(const cricket::SendDataParams& params,
- const rtc::CopyOnWriteBuffer& payload,
- cricket::SendDataResult* result);
-
-
- void NotifyDataChannelsOfTransportCreated();
- rtc::Thread* network_thread() const;
- rtc::Thread* signaling_thread() const;
-
-
-
-
-
-
-
- cricket::DataChannelType data_channel_type_ =
- cricket::DCT_NONE;
-
-
-
-
-
-
- DataChannelTransportInterface* data_channel_transport_ = nullptr;
-
- bool data_channel_transport_ready_to_send_
- RTC_GUARDED_BY(signaling_thread()) = false;
-
-
- cricket::RtpDataChannel* rtp_data_channel_ = nullptr;
-
-
- SctpSidAllocator sid_allocator_ ;
- std::vector<rtc::scoped_refptr<SctpDataChannel>> sctp_data_channels_
- RTC_GUARDED_BY(signaling_thread());
- std::vector<rtc::scoped_refptr<SctpDataChannel>> sctp_data_channels_to_free_
- RTC_GUARDED_BY(signaling_thread());
-
- std::map<std::string, rtc::scoped_refptr<RtpDataChannel>> rtp_data_channels_
- RTC_GUARDED_BY(signaling_thread());
-
-
-
-
- sigslot::signal1<bool> SignalDataChannelTransportWritable_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal2<const cricket::ReceiveDataParams&,
- const rtc::CopyOnWriteBuffer&>
- SignalDataChannelTransportReceivedData_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal1<int> SignalDataChannelTransportChannelClosing_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal1<int> SignalDataChannelTransportChannelClosed_s
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal1<RtpDataChannel*> SignalRtpDataChannelCreated_
- RTC_GUARDED_BY(signaling_thread());
- sigslot::signal1<SctpDataChannel*> SignalSctpDataChannelCreated_
- RTC_GUARDED_BY(signaling_thread());
-
-
- rtc::AsyncInvoker data_channel_transport_invoker_
- RTC_GUARDED_BY(network_thread());
-
- PeerConnection* const pc_;
- rtc::WeakPtrFactory<DataChannelController> weak_factory_{this};
- };
- }
- #endif
|