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