| Index: webkit/api/src/SocketStreamHandle.cpp
|
| diff --git a/webkit/api/src/SocketStreamHandle.cpp b/webkit/api/src/SocketStreamHandle.cpp
|
| index a011482b5262453325bceeab5414f2a972a9c74b..738ea4b463ac2bf250d81b6cf6040f03b52d326c 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
|
|
|