#ifndef RTCDataChannel_h
#define RTCDataChannel_h
#if ENABLE(WEB_RTC)
#include "EventTarget.h"
#include "RTCDataChannelHandlerClient.h"
#include "ScriptWrappable.h"
#include "Timer.h"
#include <wtf/RefCounted.h>
namespace JSC {
class ArrayBuffer;
class ArrayBufferView;
}
namespace WebCore {
class Blob;
class Dictionary;
class RTCDataChannelHandler;
class RTCPeerConnectionHandler;
class RTCDataChannel final : public RefCounted<RTCDataChannel>, public EventTargetWithInlineData, public RTCDataChannelHandlerClient {
public:
static Ref<RTCDataChannel> create(ScriptExecutionContext*, std::unique_ptr<RTCDataChannelHandler>);
static RefPtr<RTCDataChannel> create(ScriptExecutionContext*, RTCPeerConnectionHandler*, const String& label, const Dictionary& options, ExceptionCode&);
~RTCDataChannel();
String label() const;
bool ordered() const;
unsigned short maxRetransmitTime() const;
unsigned short maxRetransmits() const;
String protocol() const;
bool negotiated() const;
unsigned short id() const;
AtomicString readyState() const;
unsigned long bufferedAmount() const;
AtomicString binaryType() const;
void setBinaryType(const AtomicString&, ExceptionCode&);
void send(const String&, ExceptionCode&);
void send(JSC::ArrayBuffer&, ExceptionCode&);
void send(JSC::ArrayBufferView&, ExceptionCode&);
void send(Blob&, ExceptionCode&);
void close();
void stop();
EventTargetInterface eventTargetInterface() const override { return RTCDataChannelEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const override { return m_scriptExecutionContext; }
using RefCounted<RTCDataChannel>::ref;
using RefCounted<RTCDataChannel>::deref;
private:
RTCDataChannel(ScriptExecutionContext*, std::unique_ptr<RTCDataChannelHandler>);
void scheduleDispatchEvent(Ref<Event>&&);
void scheduledEventTimerFired();
void refEventTarget() override { ref(); }
void derefEventTarget() override { deref(); }
ScriptExecutionContext* m_scriptExecutionContext;
void didChangeReadyState(ReadyState) override;
void didReceiveStringData(const String&) override;
void didReceiveRawData(const char*, size_t) override;
void didDetectError() override;
std::unique_ptr<RTCDataChannelHandler> m_handler;
bool m_stopped;
ReadyState m_readyState;
enum BinaryType {
BinaryTypeBlob,
BinaryTypeArrayBuffer
};
BinaryType m_binaryType;
Timer m_scheduledEventTimer;
Vector<Ref<Event>> m_scheduledEvents;
};
}
#endif // ENABLE(WEB_RTC)
#endif // RTCDataChannel_h