SocketStreamHandleImpl.cpp [plain text]
#include "config.h"
#include "SocketStreamHandleImpl.h"
#include "SocketStreamHandleClient.h"
#include <wtf/Function.h>
namespace WebCore {
void SocketStreamHandleImpl::platformSend(const char* data, size_t length, Function<void(bool)>&& completionHandler)
{
if (!m_buffer.isEmpty()) {
if (m_buffer.size() + length > maxBufferSize) {
return completionHandler(false);
}
m_buffer.append(data, length);
m_client.didUpdateBufferedAmount(*this, bufferedAmount());
return completionHandler(true);
}
size_t bytesWritten = 0;
if (m_state == Open) {
if (auto result = platformSendInternal(data, length))
bytesWritten = result.value();
else
return completionHandler(false);
}
if (m_buffer.size() + length - bytesWritten > maxBufferSize) {
return completionHandler(false);
}
if (bytesWritten < length) {
m_buffer.append(data + bytesWritten, length - bytesWritten);
m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
}
return completionHandler(true);
}
bool SocketStreamHandleImpl::sendPendingData()
{
if (m_state != Open && m_state != Closing)
return false;
if (m_buffer.isEmpty()) {
if (m_state == Open)
return false;
if (m_state == Closing) {
disconnect();
return false;
}
}
bool pending;
do {
auto result = platformSendInternal(m_buffer.firstBlockData(), m_buffer.firstBlockSize());
if (!result)
return false;
size_t bytesWritten = result.value();
if (!bytesWritten)
return false;
pending = bytesWritten != m_buffer.firstBlockSize();
ASSERT(m_buffer.size() - bytesWritten <= maxBufferSize);
m_buffer.consume(bytesWritten);
} while (!pending && !m_buffer.isEmpty());
m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
return true;
}
size_t SocketStreamHandleImpl::bufferedAmount()
{
return m_buffer.size();
}
}