10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_APP_WEBRTC_DATACHANNEL_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_APP_WEBRTC_DATACHANNEL_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <queue> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/datachannelinterface.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/proxy.h" 364646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org#include "talk/base/messagehandler.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/base/scoped_ref_ptr.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/base/sigslot.h" 39861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org#include "talk/media/base/mediachannel.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/channel.h" 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc { 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 44861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgclass DataChannel; 45861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 46861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgclass DataChannelProviderInterface { 47861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org public: 48d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Sends the data to the transport. 49861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org virtual bool SendData(const cricket::SendDataParams& params, 50861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org const talk_base::Buffer& payload, 51861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org cricket::SendDataResult* result) = 0; 52d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Connects to the transport signals. 53861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org virtual bool ConnectDataChannel(DataChannel* data_channel) = 0; 54d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Disconnects from the transport signals. 55861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org virtual void DisconnectDataChannel(DataChannel* data_channel) = 0; 56d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Adds the data channel SID to the transport for SCTP. 57d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org virtual void AddSctpDataStream(uint32 sid) = 0; 58d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Removes the data channel SID from the transport for SCTP. 59d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org virtual void RemoveSctpDataStream(uint32 sid) = 0; 604646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org // Returns true if the transport channel is ready to send data. 614646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org virtual bool ReadyToSendData() const = 0; 62861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 63861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org protected: 64861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org virtual ~DataChannelProviderInterface() {} 65861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org}; 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 678485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.orgstruct InternalDataChannelInit : public DataChannelInit { 688485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org enum OpenHandshakeRole { 698485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org kOpener, 708485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org kAcker, 718485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org kNone 728485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org }; 738485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org // The default role is kOpener because the default |negotiated| is false. 748485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org InternalDataChannelInit() : open_handshake_role(kOpener) {} 758485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org explicit InternalDataChannelInit(const DataChannelInit& base) 768485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org : DataChannelInit(base), open_handshake_role(kOpener) { 778485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org // If the channel is externally negotiated, do not send the OPEN message. 788485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org if (base.negotiated) { 798485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org open_handshake_role = kNone; 808485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 818485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 828485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 838485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org OpenHandshakeRole open_handshake_role; 848485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org}; 858485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannel is a an implementation of the DataChannelInterface based on 87d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// libjingle's data engine. It provides an implementation of unreliable or 88d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// reliabledata channels. Currently this class is specifically designed to use 89d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// both RtpDataEngine and SctpDataEngine. 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// DataChannel states: 92d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// kConnecting: The channel has been created the transport might not yet be 93d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// ready. 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kOpen: The channel have a local SSRC set by a call to UpdateSendSsrc 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and a remote SSRC set by call to UpdateReceiveSsrc and the transport 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// has been writable once. 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kClosing: DataChannelInterface::Close has been called or UpdateReceiveSsrc 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// has been called with SSRC==0 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kClosed: Both UpdateReceiveSsrc and UpdateSendSsrc has been called with 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SSRC==0. 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DataChannel : public DataChannelInterface, 1024646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org public sigslot::has_slots<>, 1034646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org public talk_base::MessageHandler { 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static talk_base::scoped_refptr<DataChannel> Create( 106d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org DataChannelProviderInterface* provider, 107861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org cricket::DataChannelType dct, 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& label, 1098485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const InternalDataChannelInit& config); 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void RegisterObserver(DataChannelObserver* observer); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void UnregisterObserver(); 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 114fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual std::string label() const { return label_; } 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool reliable() const; 116fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual bool ordered() const { return config_.ordered; } 117fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual uint16 maxRetransmitTime() const { 118fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org return config_.maxRetransmitTime; 119fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org } 120fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual uint16 maxRetransmits() const { 121fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org return config_.maxRetransmits; 122fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org } 123fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual std::string protocol() const { return config_.protocol; } 124fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org virtual bool negotiated() const { return config_.negotiated; } 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int id() const { return config_.id; } 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual uint64 buffered_amount() const; 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void Close(); 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual DataState state() const { return state_; } 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool Send(const DataBuffer& buffer); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1314646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org // talk_base::MessageHandler override. 1324646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org virtual void OnMessage(talk_base::Message* msg); 1334646ae6b3bb147572c89f4aa2fd1ab5566ca3c2ewu@webrtc.org 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called if the underlying data engine is closing. 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnDataEngineClose(); 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1375aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // Called when the channel's ready to use. That can happen when the 1385aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // underlying DataMediaChannel becomes ready, or when this channel is a new 1395aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // stream on an existing DataMediaChannel, and we've finished negotiation. 1405aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org void OnChannelReady(bool writable); 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Sigslots from cricket::DataChannel 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnDataReceived(cricket::DataChannel* channel, 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ReceiveDataParams& params, 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const talk_base::Buffer& payload); 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 147d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // The remote peer request that this channel should be closed. 148d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void RemotePeerRequestClose(); 149d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 150d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // The following methods are for SCTP only. 151d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 152d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Sets the SCTP sid and adds to transport layer if not set yet. 153d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void SetSctpSid(int sid); 154d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Called when the transport channel is created. 155d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void OnTransportChannelCreated(); 156d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 157d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // The following methods are for RTP only. 158d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 159d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Set the SSRC this channel should use to send data on the 160d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // underlying data engine. |send_ssrc| == 0 means that the channel is no 161d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // longer part of the session negotiation. 162d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void SetSendSsrc(uint32 send_ssrc); 163d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // Set the SSRC this channel should use to receive data from the 164d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org // underlying data engine. 165d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void SetReceiveSsrc(uint32 receive_ssrc); 166d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 16719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org cricket::DataChannelType data_channel_type() const { 16819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org return data_channel_type_; 16919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 17019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org 171861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org protected: 172861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org DataChannel(DataChannelProviderInterface* client, 173861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org cricket::DataChannelType dct, 174861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org const std::string& label); 175861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org virtual ~DataChannel(); 176861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1788485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool Init(const InternalDataChannelInit& config); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DoClose(); 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void UpdateState(); 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetState(DataState state); 182d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org void DisconnectFromTransport(); 1835aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org void DeliverQueuedControlData(); 1845aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org void QueueControl(const talk_base::Buffer* buffer); 185fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org void ClearQueuedControlData(); 186d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org void DeliverQueuedReceivedData(); 187d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org void ClearQueuedReceivedData(); 188fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org void DeliverQueuedSendData(); 189d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org void ClearQueuedSendData(); 190d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org bool InternalSendWithoutQueueing(const DataBuffer& buffer, 191d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org cricket::SendDataResult* send_result); 192d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org bool QueueSendData(const DataBuffer& buffer); 193d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org bool SendOpenMessage(const talk_base::Buffer* buffer); 1948485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool SendOpenAckMessage(const talk_base::Buffer* buffer); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string label_; 1978485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org InternalDataChannelInit config_; 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataChannelObserver* observer_; 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataState state_; 2008d131baa4b1d171960b0cec6c200bd99ec9b39d2henrika@webrtc.org cricket::DataChannelType data_channel_type_; 2018d131baa4b1d171960b0cec6c200bd99ec9b39d2henrika@webrtc.org DataChannelProviderInterface* provider_; 2028485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool waiting_for_open_ack_; 2038485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool was_ever_writable_; 2048485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org bool connected_to_provider_; 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool send_ssrc_set_; 2068d131baa4b1d171960b0cec6c200bd99ec9b39d2henrika@webrtc.org bool receive_ssrc_set_; 2078485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org uint32 send_ssrc_; 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 receive_ssrc_; 2095aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // Control messages that always have to get sent out before any queued 2105aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // data. 2115aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org std::queue<const talk_base::Buffer*> queued_control_data_; 212d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org std::queue<DataBuffer*> queued_received_data_; 213d156f12e9ee96258b7b79d0e3d8ddab6b4b87fbbwu@webrtc.org std::deque<DataBuffer*> queued_send_data_; 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DataChannelFactory { 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual talk_base::scoped_refptr<DataChannel> CreateDataChannel( 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& label, 2208485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const InternalDataChannelInit* config) = 0; 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~DataChannelFactory() {} 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Define proxy for DataChannelInterface. 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgBEGIN_PROXY_MAP(DataChannel) 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_METHOD1(void, RegisterObserver, DataChannelObserver*) 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_METHOD0(void, UnregisterObserver) 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_CONSTMETHOD0(std::string, label) 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_CONSTMETHOD0(bool, reliable) 232fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org PROXY_CONSTMETHOD0(bool, ordered) 233fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org PROXY_CONSTMETHOD0(uint16, maxRetransmitTime) 234fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org PROXY_CONSTMETHOD0(uint16, maxRetransmits) 235fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org PROXY_CONSTMETHOD0(std::string, protocol) 236fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org PROXY_CONSTMETHOD0(bool, negotiated) 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_CONSTMETHOD0(int, id) 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_CONSTMETHOD0(DataState, state) 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_CONSTMETHOD0(uint64, buffered_amount) 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_METHOD0(void, Close) 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PROXY_METHOD1(bool, Send, const DataBuffer&) 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgEND_PROXY() 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace webrtc 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_APP_WEBRTC_DATACHANNEL_H_ 247