diff options
Diffstat (limited to 'webkit/api/src/SocketStreamHandle.cpp')
-rw-r--r-- | webkit/api/src/SocketStreamHandle.cpp | 155 |
1 files changed, 145 insertions, 10 deletions
diff --git a/webkit/api/src/SocketStreamHandle.cpp b/webkit/api/src/SocketStreamHandle.cpp index a011482..738ea4b 100644 --- a/webkit/api/src/SocketStreamHandle.cpp +++ b/webkit/api/src/SocketStreamHandle.cpp @@ -38,13 +38,16 @@ #include "SocketStreamHandleClient.h" #include "WebData.h" #include "WebKit.h" +#include "WebKitClient.h" +#include "WebSocketStreamHandle.h" +#include "WebSocketStreamHandleClient.h" #include <wtf/PassOwnPtr.h> using namespace WebKit; namespace WebCore { -class SocketStreamHandleInternal { +class SocketStreamHandleInternal : public WebSocketStreamHandleClient { public: static PassOwnPtr<SocketStreamHandleInternal> create(SocketStreamHandle* handle) { @@ -52,16 +55,32 @@ public: } virtual ~SocketStreamHandleInternal(); - // TODO(ukai): implement this. + void connect(const KURL&); + int send(const char*, int); + void close(); + + virtual void willOpenStream(WebSocketStreamHandle*, const WebURL&); + + virtual void didOpenStream(WebSocketStreamHandle*, int); + virtual void didSendData(WebSocketStreamHandle*, int); + virtual void didReceiveData(WebSocketStreamHandle*, const WebData&); + virtual void didClose(WebSocketStreamHandle*); + virtual void didFail(WebSocketStreamHandle*, const WebSocketStreamError&); private: explicit SocketStreamHandleInternal(SocketStreamHandle*); SocketStreamHandle* m_handle; + OwnPtr<WebSocketStreamHandle> m_socket; + int m_maxPendingSendAllowed; + int m_pendingAmountSent; }; -SocketStreamHandleInternal::SocketStreamHandleInternal(SocketStreamHandle* handle) +SocketStreamHandleInternal::SocketStreamHandleInternal( + SocketStreamHandle *handle) : m_handle(handle) + , m_maxPendingSendAllowed(0) + , m_pendingAmountSent(0) { } @@ -70,13 +89,125 @@ SocketStreamHandleInternal::~SocketStreamHandleInternal() m_handle = 0; } +void SocketStreamHandleInternal::connect(const KURL& url) +{ + m_socket.set(webKitClient()->createSocketStreamHandle()); + LOG(Network, "connect"); + ASSERT(m_socket.get()); + m_socket->connect(url, this); +} + +int SocketStreamHandleInternal::send(const char* data, int len) +{ + LOG(Network, "send len=%d", len); + ASSERT(m_socket.get()); + if (m_pendingAmountSent + len >= m_maxPendingSendAllowed) + len = m_maxPendingSendAllowed - m_pendingAmountSent - 1; + + if (len <= 0) + return len; + WebData webdata(data, len); + if (m_socket->send(webdata)) { + m_pendingAmountSent += len; + LOG(Network, "sent"); + if (m_handle && m_handle->m_client) + m_handle->m_client->willSendData(m_handle, webdata.data(), webdata.size()); + return len; + } + LOG(Network, "busy. buffering"); + return 0; +} + +void SocketStreamHandleInternal::close() +{ + LOG(Network, "close"); + m_socket->close(); +} + +void SocketStreamHandleInternal::willOpenStream(WebSocketStreamHandle* socketHandle, const WebURL& url) +{ + LOG(Network, "willOpenStream"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + if (m_handle->m_client) + m_handle->m_client->willOpenStream(m_handle, url); + } +} + +void SocketStreamHandleInternal::didOpenStream(WebSocketStreamHandle* socketHandle, int maxPendingSendAllowed) +{ + LOG(Network, "SocketStreamHandleInternal::didOpen %d", + maxPendingSendAllowed); + ASSERT(maxPendingSendAllowed > 0); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_maxPendingSendAllowed = maxPendingSendAllowed; + m_handle->m_state = SocketStreamHandleBase::Open; + if (m_handle->m_client) { + m_handle->m_client->didOpen(m_handle); + return; + } + } + LOG(Network, "no m_handle or m_socket?"); +} + +void SocketStreamHandleInternal::didSendData(WebSocketStreamHandle* socketHandle, int amountSent) +{ + LOG(Network, "SocketStreamHandleInternal::didSendData %d", amountSent); + ASSERT(amountSent > 0); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_pendingAmountSent -= amountSent; + ASSERT(m_pendingAmountSent >= 0); + m_handle->sendPendingData(); + } +} + +void SocketStreamHandleInternal::didReceiveData(WebSocketStreamHandle* socketHandle, const WebData& data) +{ + LOG(Network, "didReceiveData"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + if (m_handle->m_client) + m_handle->m_client->didReceiveData(m_handle, data.data(), data.size()); + } +} + +void SocketStreamHandleInternal::didClose(WebSocketStreamHandle* socketHandle) +{ + LOG(Network, "didClose"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_socket.clear(); + SocketStreamHandle* h = m_handle; + m_handle = NULL; + if (h->m_client) + h->m_client->didClose(h); + } +} + +void SocketStreamHandleInternal::didFail(WebSocketStreamHandle* socketHandle, const WebSocketStreamError& err) +{ + LOG(Network, "didFail"); + if (m_handle && m_socket.get()) { + ASSERT(socketHandle == m_socket.get()); + m_socket.clear(); + SocketStreamHandle* h = m_handle; + m_handle = NULL; + if (h->m_client) + h->m_client->didClose(h); // didFail(h, err); + } +} + +// FIXME: auth + // SocketStreamHandle ---------------------------------------------------------- SocketStreamHandle::SocketStreamHandle(const KURL& url, SocketStreamHandleClient* client) - : SocketStreamHandleBase(url, client) + : SocketStreamHandleBase(url, client) { m_internal = SocketStreamHandleInternal::create(this); - notImplemented(); + m_internal->connect(m_url); } SocketStreamHandle::~SocketStreamHandle() @@ -87,18 +218,21 @@ SocketStreamHandle::~SocketStreamHandle() int SocketStreamHandle::platformSend(const char* buf, int len) { - notImplemented(); - return 0; + if (!m_internal.get()) + return 0; + return m_internal->send(buf, len); } void SocketStreamHandle::platformClose() { - notImplemented(); + if (m_internal.get()) + m_internal->close(); } void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge& challenge) { - notImplemented(); + if (m_client) + m_client->didReceiveAuthenticationChallenge(this, challenge); } void SocketStreamHandle::receivedCredential(const AuthenticationChallenge& challenge, const Credential& credential) @@ -113,7 +247,8 @@ void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const Authen void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge& challenge) { - notImplemented(); + if (m_client) + m_client->receivedCancellation(this, challenge); } } // namespace WebCore |