LibWebRTCDataChannelHandler.cpp [plain text]
#include "config.h"
#include "LibWebRTCDataChannelHandler.h"
#if USE(LIBWEBRTC)
#include "RTCDataChannel.h"
#include <wtf/MainThread.h>
namespace WebCore {
LibWebRTCDataChannelHandler::~LibWebRTCDataChannelHandler()
{
if (m_client)
m_channel->UnregisterObserver();
}
void LibWebRTCDataChannelHandler::setClient(RTCDataChannelHandlerClient& client)
{
ASSERT(!m_client);
m_client = &client;
m_channel->RegisterObserver(this);
}
bool LibWebRTCDataChannelHandler::sendStringData(const String& text)
{
return m_channel->Send({rtc::CopyOnWriteBuffer(text.utf8().data(), text.length()), false});
}
bool LibWebRTCDataChannelHandler::sendRawData(const char* data, size_t length)
{
return m_channel->Send({rtc::CopyOnWriteBuffer(data, length), true});
}
void LibWebRTCDataChannelHandler::close()
{
if (m_client) {
m_channel->UnregisterObserver();
m_client = nullptr;
}
m_channel->Close();
}
void LibWebRTCDataChannelHandler::OnStateChange()
{
if (!m_client)
return;
RTCDataChannelState state;
switch (m_channel->state()) {
case webrtc::DataChannelInterface::kConnecting:
state = RTCDataChannelState::Connecting;
break;
case webrtc::DataChannelInterface::kOpen:
state = RTCDataChannelState::Open;
break;
case webrtc::DataChannelInterface::kClosing:
state = RTCDataChannelState::Closing;
break;
case webrtc::DataChannelInterface::kClosed:
state = RTCDataChannelState::Closed;
break;
}
callOnMainThread([protectedClient = makeRef(*m_client), state] {
protectedClient->didChangeReadyState(state);
});
}
void LibWebRTCDataChannelHandler::OnMessage(const webrtc::DataBuffer& buffer)
{
if (!m_client)
return;
std::unique_ptr<webrtc::DataBuffer> protectedBuffer(new webrtc::DataBuffer(buffer));
callOnMainThread([protectedClient = makeRef(*m_client), buffer = WTFMove(protectedBuffer)] {
const char* data = reinterpret_cast<const char*>(buffer->data.data());
if (buffer->binary)
protectedClient->didReceiveRawData(data, buffer->size());
else
protectedClient->didReceiveStringData(String(data, buffer->size()));
});
}
void LibWebRTCDataChannelHandler::OnBufferedAmountChange(uint64_t previousAmount)
{
if (!m_client)
return;
if (previousAmount <= m_channel->buffered_amount())
return;
callOnMainThread([protectedClient = makeRef(*m_client), amount = m_channel->buffered_amount()] {
protectedClient->bufferedAmountIsDecreasing(static_cast<size_t>(amount));
});
}
}
#endif // USE(LIBWEBRTC)