|  | /* | 
|  | *  Copyright 2016 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_API_QUICDATATRANSPORT_H_ | 
|  | #define WEBRTC_API_QUICDATATRANSPORT_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <unordered_map> | 
|  |  | 
|  | #include "webrtc/api/datachannelinterface.h" | 
|  | #include "webrtc/api/quicdatachannel.h" | 
|  | #include "webrtc/base/scoped_ref_ptr.h" | 
|  | #include "webrtc/base/sigslot.h" | 
|  | #include "webrtc/base/thread.h" | 
|  | #include "webrtc/p2p/base/transportcontroller.h" | 
|  |  | 
|  | namespace cricket { | 
|  | class QuicTransportChannel; | 
|  | class ReliableQuicStream; | 
|  | }  // namepsace cricket | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // QuicDataTransport creates QuicDataChannels for the PeerConnection. It also | 
|  | // handles QUIC stream demuxing by distributing incoming QUIC streams from the | 
|  | // QuicTransportChannel among the QuicDataChannels that it has created. | 
|  | // | 
|  | // QuicDataTransport reads the data channel ID from the incoming QUIC stream, | 
|  | // then looks it up in a map of ID => QuicDataChannel. If the data channel | 
|  | // exists, it sends the QUIC stream to the QuicDataChannel. | 
|  | class QuicDataTransport : public sigslot::has_slots<> { | 
|  | public: | 
|  | QuicDataTransport(rtc::Thread* signaling_thread, | 
|  | rtc::Thread* worker_thread, | 
|  | rtc::Thread* network_thread, | 
|  | cricket::TransportController* transport_controller); | 
|  | ~QuicDataTransport() override; | 
|  |  | 
|  | // The QuicDataTransport acts like a BaseChannel with these functions. | 
|  | bool SetTransport(const std::string& transport_name); | 
|  | const std::string& transport_name() const { return transport_name_; } | 
|  | const std::string& content_name() const { return content_name_; } | 
|  | void set_content_name(const std::string& content_name) { | 
|  | content_name_ = content_name; | 
|  | } | 
|  |  | 
|  | // Creates a QuicDataChannel that uses this QuicDataTransport. | 
|  | rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( | 
|  | const std::string& label, | 
|  | const DataChannelInit* config); | 
|  |  | 
|  | // Removes a QuicDataChannel with the given ID from the QuicDataTransport's | 
|  | // data channel map. | 
|  | void DestroyDataChannel(int id); | 
|  |  | 
|  | // True if the QuicDataTransport has a data channel with the given ID. | 
|  | bool HasDataChannel(int id) const; | 
|  |  | 
|  | // True if the QuicDataTransport has data channels. | 
|  | bool HasDataChannels() const; | 
|  |  | 
|  | cricket::QuicTransportChannel* quic_transport_channel() { | 
|  | return quic_transport_channel_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | // Sets the QUIC transport channel for the QuicDataChannels and the | 
|  | // QuicDataTransport. Returns false if a different QUIC transport channel is | 
|  | // already set, the QUIC transport channel cannot be set for any of the | 
|  | // QuicDataChannels, or |channel| is NULL. | 
|  | bool SetTransportChannel(cricket::QuicTransportChannel* channel); | 
|  |  | 
|  | // Called from the QuicTransportChannel when a ReliableQuicStream is created | 
|  | // to receive incoming data. | 
|  | void OnIncomingStream(cricket::ReliableQuicStream* stream); | 
|  | // Called from the ReliableQuicStream when the first QUIC stream frame is | 
|  | // received for incoming data. The QuicDataTransport reads the data channel ID | 
|  | // and message ID from the incoming data, then dispatches the | 
|  | // ReliableQuicStream to the QuicDataChannel with the same data channel ID. | 
|  | void OnDataReceived(net::QuicStreamId stream_id, | 
|  | const char* data, | 
|  | size_t len); | 
|  |  | 
|  | cricket::QuicTransportChannel* CreateTransportChannel( | 
|  | const std::string& transport_name); | 
|  | void DestroyTransportChannel(cricket::TransportChannel* transport_channel); | 
|  |  | 
|  | // Map of data channel ID => QUIC data channel values. | 
|  | std::unordered_map<int, rtc::scoped_refptr<QuicDataChannel>> | 
|  | data_channel_by_id_; | 
|  | // Map of QUIC stream ID => ReliableQuicStream* values. | 
|  | std::unordered_map<net::QuicStreamId, cricket::ReliableQuicStream*> | 
|  | quic_stream_by_id_; | 
|  | // QuicTransportChannel for sending/receiving data. | 
|  | cricket::QuicTransportChannel* quic_transport_channel_ = nullptr; | 
|  | // Threads for the QUIC data channel. | 
|  | rtc::Thread* const signaling_thread_; | 
|  | rtc::Thread* const worker_thread_; | 
|  | rtc::Thread* const network_thread_; | 
|  |  | 
|  | cricket::TransportController* transport_controller_; | 
|  | std::string content_name_; | 
|  | std::string transport_name_; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // WEBRTC_API_QUICDATATRANSPORT_H_ |