#ifndef RTCDataChannel_h
#define RTCDataChannel_h
#if ENABLE(MEDIA_STREAM)
#include "EventTarget.h"
#include "RTCDataChannelHandlerClient.h"
#include "Timer.h"
#include <wtf/RefCounted.h>
namespace WebCore {
class Blob;
class RTCDataChannelHandler;
class RTCPeerConnectionHandler;
class RTCDataChannel : public RefCounted<RTCDataChannel>, public EventTarget, public RTCDataChannelHandlerClient {
public:
static PassRefPtr<RTCDataChannel> create(ScriptExecutionContext*, RTCPeerConnectionHandler*, const String& label, bool reliable, ExceptionCode&);
static PassRefPtr<RTCDataChannel> create(ScriptExecutionContext*, PassOwnPtr<RTCDataChannelHandler>);
~RTCDataChannel();
String label() const;
bool reliable() const;
String readyState() const;
unsigned long bufferedAmount() const;
String binaryType() const;
void setBinaryType(const String&, ExceptionCode&);
void send(const String&, ExceptionCode&);
void send(PassRefPtr<ArrayBuffer>, ExceptionCode&);
void send(PassRefPtr<ArrayBufferView>, ExceptionCode&);
void send(PassRefPtr<Blob>, ExceptionCode&);
void close();
DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
void stop();
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE;
using RefCounted<RTCDataChannel>::ref;
using RefCounted<RTCDataChannel>::deref;
private:
RTCDataChannel(ScriptExecutionContext*, PassOwnPtr<RTCDataChannelHandler>);
void scheduleDispatchEvent(PassRefPtr<Event>);
void scheduledEventTimerFired(Timer<RTCDataChannel>*);
virtual EventTargetData* eventTargetData();
virtual EventTargetData* ensureEventTargetData();
virtual void refEventTarget() { ref(); }
virtual void derefEventTarget() { deref(); }
EventTargetData m_eventTargetData;
ScriptExecutionContext* m_scriptExecutionContext;
virtual void didChangeReadyState(ReadyState) OVERRIDE;
virtual void didReceiveStringData(const String&) OVERRIDE;
virtual void didReceiveRawData(const char*, size_t) OVERRIDE;
virtual void didDetectError() OVERRIDE;
OwnPtr<RTCDataChannelHandler> m_handler;
bool m_stopped;
ReadyState m_readyState;
enum BinaryType {
BinaryTypeBlob,
BinaryTypeArrayBuffer
};
BinaryType m_binaryType;
Timer<RTCDataChannel> m_scheduledEventTimer;
Vector<RefPtr<Event> > m_scheduledEvents;
};
}
#endif // ENABLE(MEDIA_STREAM)
#endif // RTCDataChannel_h