#ifndef RTCDataChannel_h
#define RTCDataChannel_h
#include "bindings/v8/ScriptWrappable.h"
#include "core/events/EventTarget.h"
#include "heap/Handle.h"
#include "platform/Timer.h"
#include "public/platform/WebRTCDataChannelHandler.h"
#include "public/platform/WebRTCDataChannelHandlerClient.h"
#include "wtf/RefCounted.h"
namespace blink {
class WebRTCDataChannelHandler;
class WebRTCPeerConnectionHandler;
struct WebRTCDataChannelInit;
}
namespace WebCore {
class Blob;
class ExceptionState;
class RTCDataChannel FINAL : public RefCounted<RTCDataChannel>, public ScriptWrappable, public EventTargetWithInlineData, public blink::WebRTCDataChannelHandlerClient {
REFCOUNTED_EVENT_TARGET(RTCDataChannel);
public:
static PassRefPtr<RTCDataChannel> create(ExecutionContext*, PassOwnPtr<blink::WebRTCDataChannelHandler>);
static PassRefPtr<RTCDataChannel> create(ExecutionContext*, blink::WebRTCPeerConnectionHandler*, const String& label, const blink::WebRTCDataChannelInit&, ExceptionState&);
virtual ~RTCDataChannel();
String label() const;
bool reliable() const;
bool ordered() const;
unsigned short maxRetransmitTime() const;
unsigned short maxRetransmits() const;
String protocol() const;
bool negotiated() const;
unsigned short id() const;
String readyState() const;
unsigned long bufferedAmount() const;
String binaryType() const;
void setBinaryType(const String&, ExceptionState&);
void send(const String&, ExceptionState&);
void send(PassRefPtr<ArrayBuffer>, ExceptionState&);
void send(PassRefPtr<ArrayBufferView>, ExceptionState&);
void send(PassRefPtrWillBeRawPtr<Blob>, ExceptionState&);
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 ExecutionContext* executionContext() const OVERRIDE;
private:
RTCDataChannel(ExecutionContext*, PassOwnPtr<blink::WebRTCDataChannelHandler>);
void scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event>);
void scheduledEventTimerFired(Timer<RTCDataChannel>*);
ExecutionContext* m_executionContext;
virtual void didChangeReadyState(blink::WebRTCDataChannelHandlerClient::ReadyState) OVERRIDE;
virtual void didReceiveStringData(const blink::WebString&) OVERRIDE;
virtual void didReceiveRawData(const char*, size_t) OVERRIDE;
virtual void didDetectError() OVERRIDE;
OwnPtr<blink::WebRTCDataChannelHandler> m_handler;
bool m_stopped;
blink::WebRTCDataChannelHandlerClient::ReadyState m_readyState;
enum BinaryType {
BinaryTypeBlob,
BinaryTypeArrayBuffer
};
BinaryType m_binaryType;
Timer<RTCDataChannel> m_scheduledEventTimer;
WillBePersistentHeapVector<RefPtrWillBeMember<Event> > m_scheduledEvents;
};
}
#endif