Ticket #10510: 0001-WebSocketsImplemented.2.patch

File 0001-WebSocketsImplemented.2.patch, 9.8 KB (added by akshay1994, 10 years ago)

WebSocketsImplemented

  • Source/WebCore/PlatformHaiku.cmake

    From 3ef2b6b021e1fe193fad5740c0d8b84e37fc90e6 Mon Sep 17 00:00:00 2001
    From: Akshay Jaggi <akshay1994.leo@gmail.com>
    Date: Thu, 20 Mar 2014 12:27:37 +0000
    Subject: [PATCH] WebSocketsImplemented
    
    ---
     Source/WebCore/PlatformHaiku.cmake                 |   2 +-
     .../platform/network/haiku/SocketStreamHandle.h    |  23 +-
     .../network/haiku/SocketStreamHandleHaiku.cpp      | 265 +++++++++++++++++++++
     3 files changed, 281 insertions(+), 9 deletions(-)
     create mode 100644 Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp
    
    diff --git a/Source/WebCore/PlatformHaiku.cmake b/Source/WebCore/PlatformHaiku.cmake
    index 3d4514f..f291d0c 100644
    a b LIST(APPEND WebCore_SOURCES  
    8181  platform/network/haiku/ResourceRequestHaiku.cpp
    8282  platform/network/haiku/CookieJarHaiku.cpp
    8383
    84   platform/network/curl/SocketStreamHandleCurl.cpp # not implemented
     84  platform/network/haiku/SocketStreamHandleHaiku.cpp
    8585  platform/network/NetworkStorageSessionStub.cpp
    8686 
    8787  platform/posix/FileSystemPOSIX.cpp
  • Source/WebCore/platform/network/haiku/SocketStreamHandle.h

    diff --git a/Source/WebCore/platform/network/haiku/SocketStreamHandle.h b/Source/WebCore/platform/network/haiku/SocketStreamHandle.h
    index a82319f..5092bc8 100644
    a b  
    3333#define SocketStreamHandle_h
    3434
    3535#include "SocketStreamHandleBase.h"
    36 
     36#include <Socket.h>
    3737#include <wtf/PassRefPtr.h>
    3838#include <wtf/RefCounted.h>
    3939
    namespace WebCore {  
    4545
    4646    class SocketStreamHandle : public RefCounted<SocketStreamHandle>, public SocketStreamHandleBase {
    4747    public:
    48         static PassRefPtr<SocketStreamHandle> create(const URL& url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); }
    49 
    50         virtual ~SocketStreamHandle();
     48        static              PassRefPtr<SocketStreamHandle> create(const URL& url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); }
     49        virtual             ~SocketStreamHandle();
     50        int32               AsyncHandleRead(int32 length);
     51        int32               AsyncHandleWrite();
     52        int32               AsyncHandleConnect(int32 error);
     53        char*               readBuffer;
     54        BSocket*            socket;
     55        BNetworkAddress*    peer;
    5156
    5257    protected:
    53         virtual int platformSend(const char* data, int length);
    54         virtual void platformClose();
     58        virtual int         platformSend(const char* data, int length);
     59        virtual void        platformClose();
    5560
    5661    private:
    57         SocketStreamHandle(const URL&, SocketStreamHandleClient*);
    58 
     62                            SocketStreamHandle(const URL&, SocketStreamHandleClient*);
     63        thread_id           fConnectThreadId;
     64        thread_id           fReadThreadId;
     65        thread_id           fWriteThreadId;
    5966        // No authentication for streams per se, but proxy may ask for credentials.
    6067        void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
    6168        void receivedCredential(const AuthenticationChallenge&, const Credential&);
  • new file Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp

    diff --git a/Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp b/Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp
    new file mode 100644
    index 0000000..6ccc94c
    - +  
     1/*
     2The MIT License (MIT)
     3
     4Copyright (c) 2014 Akshay Jaggi.
     5Copyright (c) 2014 Haiku, Inc.
     6
     7Permission is hereby granted, free of charge, to any person obtaining a copy
     8of this software and associated documentation files (the "Software"), to deal
     9in the Software without restriction, including without limitation the rights
     10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11copies of the Software, and to permit persons to whom the Software is
     12furnished to do so, subject to the following conditions:
     13
     14The above copyright notice and this permission notice shall be included in
     15all copies or substantial portions of the Software.
     16
     17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23THE SOFTWARE.
     24*/
     25
     26#include "config.h"
     27#include "SocketStreamHandle.h"
     28#include "SocketStreamError.h"
     29
     30#include "URL.h"
     31#include "Logging.h"
     32#include "NotImplemented.h"
     33#include "SocketStreamHandleClient.h"
     34
     35#include <wtf/text/CString.h>
     36#include <wtf/MainThread.h>
     37#include <kernel/OS.h>
     38
     39namespace WebCore {
     40
     41static const int kReadBufferSize = 1024;
     42
     43int32 SocketStreamHandle::AsyncHandleRead(int32 length)
     44{
     45    if(length<0)
     46    {
     47        m_client->didFailSocketStream(this,SocketStreamError(length));
     48    }
     49    else
     50    {
     51        m_client->didReceiveSocketStreamData(this,readBuffer,length);
     52    }
     53    return 0;
     54}
     55
     56
     57int32 SocketStreamHandle::AsyncHandleWrite()
     58{
     59    sendPendingData();
     60    return 0;
     61}
     62
     63
     64void CallOnMainThreadAndWaitRead(SocketStreamHandle* handle, int32 length)
     65{
     66    if(isMainThread())
     67    {
     68        handle->AsyncHandleRead(length);
     69        return;
     70    }
     71    sem_id sem;
     72    sem = create_sem(1,"AsyncHandleRead");
     73    acquire_sem(sem);
     74    callOnMainThread([&]{
     75        handle->AsyncHandleRead(length);       
     76        release_sem(sem);
     77        });
     78    acquire_sem(sem);
     79    release_sem(sem);       
     80}
     81
     82
     83void CallOnMainThreadAndWaitConnect(SocketStreamHandle* handle, int32 error)
     84{
     85    if(isMainThread())
     86    {
     87        handle->AsyncHandleConnect(error);
     88        return;
     89    }
     90    sem_id sem;
     91    sem = create_sem(1,"AsyncHandleConnect");
     92    acquire_sem(sem);
     93    callOnMainThread([&]{
     94        handle->AsyncHandleConnect(error);
     95        release_sem(sem);
     96        });
     97    acquire_sem(sem);
     98    release_sem(sem);       
     99}
     100
     101
     102void CallOnMainThreadAndWaitWrite(SocketStreamHandle* handle)
     103{
     104    if(isMainThread())
     105    {
     106        handle->AsyncHandleWrite();
     107        return;
     108    }
     109    sem_id sem;
     110    sem = create_sem(1,"AsyncHandleWrite");
     111    acquire_sem(sem);
     112    callOnMainThread([&]{
     113        handle->AsyncHandleWrite();
     114        release_sem(sem);
     115        });
     116    acquire_sem(sem);
     117    release_sem(sem);       
     118}
     119
     120
     121int32 AsyncReadThread(void* data)
     122{
     123    thread_id sender;
     124    int32 code;
     125    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     126    while(true)
     127    {
     128        if(has_data(find_thread(NULL)))
     129        {
     130            code = receive_data(&sender,NULL,0);
     131            if(code==1)
     132                exit_thread(0);
     133        }
     134        int32 numberReadBytes = (handle->socket)->Read(handle->readBuffer,kReadBufferSize);     
     135        CallOnMainThreadAndWaitRead(handle,numberReadBytes);       
     136    }
     137    return 0;
     138}
     139
     140
     141int32 SocketStreamHandle::AsyncHandleConnect(int32 error)
     142{
     143    if(error != B_OK)
     144    {
     145        m_client->didFailSocketStream(this,SocketStreamError(error));
     146    }
     147    else
     148    {
     149        fReadThreadId = spawn_thread(AsyncReadThread,"AsyncReadThread",63,(void*)this);
     150        resume_thread(fReadThreadId);
     151        m_state = Open;
     152        m_client->didOpenSocketStream(this);
     153    }
     154    return error;
     155}
     156
     157
     158int32 AsyncWriteThread(void* data)
     159{
     160    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     161    status_t response=(handle->socket)->WaitForWritable(B_INFINITE_TIMEOUT);
     162    CallOnMainThreadAndWaitWrite(handle);
     163    return response;
     164}
     165
     166
     167int32 AsyncConnectThread(void* data)
     168{
     169    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     170    status_t error=(handle->socket)->Connect(*(handle->peer));
     171    CallOnMainThreadAndWaitConnect(handle, error);
     172    return 0;
     173}
     174
     175SocketStreamHandle::SocketStreamHandle(const URL& url, SocketStreamHandleClient* client)
     176    :
     177    SocketStreamHandleBase(url, client)
     178{
     179    LOG(Network, "SocketStreamHandle %p new client %p", this, m_client);
     180    fReadThreadId = 0;
     181    fWriteThreadId = 0;
     182    fConnectThreadId=0;
     183    readBuffer = new char[kReadBufferSize];
     184    unsigned int port = url.hasPort() ? url.port() : (url.protocolIs("wss") ? 443 : 80);   
     185    peer = new BNetworkAddress(url.host().utf8().data(),port);
     186    socket = new BSocket();
     187    fConnectThreadId = spawn_thread(AsyncConnectThread,"AsyncConnectThread",63,(void*)this);
     188    resume_thread(fConnectThreadId);
     189}
     190
     191
     192SocketStreamHandle::~SocketStreamHandle()
     193{
     194    LOG(Network, "SocketStreamHandle %p delete", this);
     195    delete readBuffer;
     196    delete peer;
     197    delete socket;
     198    setClient(0);
     199}
     200
     201
     202int SocketStreamHandle::platformSend(const char* buffer, int length)
     203{
     204    int32 writtenLength = 0;
     205    bool flagForPending = false;
     206    LOG(Network, "SocketStreamHandle %p platformSend", this);
     207    status_t response=socket->WaitForWritable(0);
     208    if(response == B_OK)
     209    {
     210        writtenLength=socket->Write(buffer,length);
     211        if(writtenLength < length)
     212            flagForPending = true;
     213    }
     214    else if(response == B_TIMED_OUT
     215                || response == B_WOULD_BLOCK)
     216    {
     217        flagForPending = true;
     218    }
     219    else
     220    {
     221        m_client->didFailSocketStream(this,SocketStreamError(response));
     222    }
     223    if(flagForPending)
     224    {
     225        fWriteThreadId = spawn_thread(AsyncWriteThread,"AsyncWriteThread",63,(void*)this);
     226        resume_thread(fWriteThreadId);
     227    }
     228    return writtenLength;
     229}
     230
     231
     232void SocketStreamHandle::platformClose()
     233{
     234    LOG(Network, "SocketStreamHandle %p platformClose", this);
     235    send_data(fReadThreadId,1,NULL,0);
     236    socket->Disconnect();
     237    m_client->didCloseSocketStream(this);
     238}
     239
     240
     241void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge&)
     242{
     243    notImplemented();
     244}
     245
     246
     247void SocketStreamHandle::receivedCredential(const AuthenticationChallenge&, const Credential&)
     248{
     249    notImplemented();
     250}
     251
     252
     253void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&)
     254{
     255    notImplemented();
     256}
     257
     258
     259void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge&)
     260{
     261    notImplemented();
     262}
     263
     264
     265}  // namespace WebCore