| Index: webrtc/api/datachannelinterface.h
|
| diff --git a/webrtc/api/datachannelinterface.h b/webrtc/api/datachannelinterface.h
|
| index 5fa657dc53552c32aa2ddfc7d25d1a68833e12d0..92bdee2c0dcb6993baae16b280e39ba938fdb5a2 100644
|
| --- a/webrtc/api/datachannelinterface.h
|
| +++ b/webrtc/api/datachannelinterface.h
|
| @@ -24,31 +24,43 @@
|
|
|
| namespace webrtc {
|
|
|
| +// C++ version of: https://www.w3.org/TR/webrtc/#idl-def-rtcdatachannelinit
|
| +// TODO(deadbeef): Use rtc::Optional for the "-1 if unset" things.
|
| struct DataChannelInit {
|
| - DataChannelInit()
|
| - : reliable(false),
|
| - ordered(true),
|
| - maxRetransmitTime(-1),
|
| - maxRetransmits(-1),
|
| - negotiated(false),
|
| - id(-1) {
|
| - }
|
| -
|
| - bool reliable; // Deprecated.
|
| - bool ordered; // True if ordered delivery is required.
|
| - int maxRetransmitTime; // The max period of time in milliseconds in which
|
| - // retransmissions will be sent. After this time, no
|
| - // more retransmissions will be sent. -1 if unset.
|
| - int maxRetransmits; // The max number of retransmissions. -1 if unset.
|
| - std::string protocol; // This is set by the application and opaque to the
|
| - // WebRTC implementation.
|
| - bool negotiated; // True if the channel has been externally negotiated
|
| - // and we do not send an in-band signalling in the
|
| - // form of an "open" message.
|
| - int id; // The stream id, or SID, for SCTP data channels. -1
|
| - // if unset.
|
| + // Deprecated. Reliability is assumed, and channel will be unreliable if
|
| + // maxRetransmitTime or MaxRetransmits is set.
|
| + bool reliable = false;
|
| +
|
| + // True if ordered delivery is required.
|
| + bool ordered = true;
|
| +
|
| + // The max period of time in milliseconds in which retransmissions will be
|
| + // sent. After this time, no more retransmissions will be sent. -1 if unset.
|
| + //
|
| + // Cannot be set along with |maxRetransmits|.
|
| + int maxRetransmitTime = -1;
|
| +
|
| + // The max number of retransmissions. -1 if unset.
|
| + //
|
| + // Cannot be set along with |maxRetransmitTime|.
|
| + int maxRetransmits = -1;
|
| +
|
| + // This is set by the application and opaque to the WebRTC implementation.
|
| + std::string protocol;
|
| +
|
| + // True if the channel has been externally negotiated and we do not send an
|
| + // in-band signalling in the form of an "open" message. If this is true, |id|
|
| + // below must be set; otherwise it should be unset and will be negotiated
|
| + // in-band.
|
| + bool negotiated = false;
|
| +
|
| + // The stream id, or SID, for SCTP data channels. -1 if unset (see above).
|
| + int id = -1;
|
| };
|
|
|
| +// At the JavaScript level, data can be passed in as a string or a blob, so
|
| +// this structure's |binary| flag tells whether the data should be interpreted
|
| +// as binary or text.
|
| struct DataBuffer {
|
| DataBuffer(const rtc::CopyOnWriteBuffer& data, bool binary)
|
| : data(data),
|
| @@ -68,6 +80,10 @@ struct DataBuffer {
|
| bool binary;
|
| };
|
|
|
| +// Used to implement RTCDataChannel events.
|
| +//
|
| +// The code responding to these callbacks should unwind the stack before
|
| +// using any other webrtc APIs; re-entrancy is not supported.
|
| class DataChannelObserver {
|
| public:
|
| // The data channel state have changed.
|
| @@ -83,7 +99,8 @@ class DataChannelObserver {
|
|
|
| class DataChannelInterface : public rtc::RefCountInterface {
|
| public:
|
| - // Keep in sync with DataChannel.java:State and
|
| + // C++ version of: https://www.w3.org/TR/webrtc/#idl-def-rtcdatachannelstate
|
| + // Unlikely to change, but keep in sync with DataChannel.java:State and
|
| // RTCDataChannel.h:RTCDataChannelState.
|
| enum DataState {
|
| kConnecting,
|
| @@ -107,14 +124,20 @@ class DataChannelInterface : public rtc::RefCountInterface {
|
| return "";
|
| }
|
|
|
| + // Used to receive events from the data channel. Only one observer can be
|
| + // registered at a time. UnregisterObserver should be called before the
|
| + // observer object is destroyed.
|
| virtual void RegisterObserver(DataChannelObserver* observer) = 0;
|
| virtual void UnregisterObserver() = 0;
|
| +
|
| // The label attribute represents a label that can be used to distinguish this
|
| // DataChannel object from other DataChannel objects.
|
| virtual std::string label() const = 0;
|
| - virtual bool reliable() const = 0;
|
|
|
| - // TODO(tommyw): Remove these dummy implementations when all classes have
|
| + // The accessors below simply return the properties from the DataChannelInit
|
| + // the data channel was constructed with.
|
| + virtual bool reliable() const = 0;
|
| + // TODO(deadbeef): Remove these dummy implementations when all classes have
|
| // implemented these APIs. They should all just return the values the
|
| // DataChannel was created with.
|
| virtual bool ordered() const { return false; }
|
| @@ -123,18 +146,33 @@ class DataChannelInterface : public rtc::RefCountInterface {
|
| virtual std::string protocol() const { return std::string(); }
|
| virtual bool negotiated() const { return false; }
|
|
|
| + // Returns the ID from the DataChannelInit, if it was negotiated out-of-band.
|
| + // If negotiated in-band, this ID will be populated once the DTLS role is
|
| + // determined, and until then this will return -1.
|
| virtual int id() const = 0;
|
| virtual DataState state() const = 0;
|
| virtual uint32_t messages_sent() const = 0;
|
| virtual uint64_t bytes_sent() const = 0;
|
| virtual uint32_t messages_received() const = 0;
|
| virtual uint64_t bytes_received() const = 0;
|
| - // The buffered_amount returns the number of bytes of application data
|
| - // (UTF-8 text and binary data) that have been queued using SendBuffer but
|
| - // have not yet been transmitted to the network.
|
| +
|
| + // Returns the number of bytes of application data (UTF-8 text and binary
|
| + // data) that have been queued using Send but have not yet been processed at
|
| + // the SCTP level. See comment above Send below.
|
| virtual uint64_t buffered_amount() const = 0;
|
| +
|
| + // Begins the graceful data channel closing procedure. See:
|
| + // https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-13#section-6.7
|
| virtual void Close() = 0;
|
| - // Sends |data| to the remote peer.
|
| +
|
| + // Sends |data| to the remote peer. If the data can't be sent at the SCTP
|
| + // level (due to congestion control), it's buffered at the data channel level,
|
| + // up to a maximum of 16MB. If Send is called while this buffer is full, the
|
| + // data channel will be closed abruptly.
|
| + //
|
| + // So, it's important to use buffered_amount() and OnBufferedAmountChange to
|
| + // ensure the data channel is used efficiently but without filling this
|
| + // buffer.
|
| virtual bool Send(const DataBuffer& buffer) = 0;
|
|
|
| protected:
|
|
|