SocketStreamHandle.h [plain text]
#pragma once
#include "SocketStreamHandleBase.h"
#if PLATFORM(WIN)
#include <winsock2.h>
#endif
#include "SessionID.h"
#include <curl/curl.h>
#include <wtf/Deque.h>
#include <wtf/Lock.h>
#include <wtf/RefCounted.h>
#include <wtf/Threading.h>
namespace WebCore {
class NetworkingContext;
class SocketStreamHandleClient;
class SocketStreamHandle : public ThreadSafeRefCounted<SocketStreamHandle>, public SocketStreamHandleBase {
public:
static Ref<SocketStreamHandle> create(const URL& url, SocketStreamHandleClient& client, NetworkingContext&, SessionID) { return adoptRef(*new SocketStreamHandle(url, client)); }
virtual ~SocketStreamHandle();
private:
SocketStreamHandle(const URL&, SocketStreamHandleClient&);
int platformSend(const char* data, int length) override;
void platformClose() override;
bool readData(CURL*);
bool sendData(CURL*);
bool waitForAvailableData(CURL*, std::chrono::milliseconds selectTimeout);
void startThread();
void stopThread();
void didReceiveData();
void didOpenSocket();
static std::unique_ptr<char[]> createCopy(const char* data, int length);
struct SocketData {
SocketData(std::unique_ptr<char[]>&& source, int length)
{
data = WTFMove(source);
size = length;
}
SocketData(SocketData&& other)
{
data = WTFMove(other.data);
size = other.size;
other.size = 0;
}
std::unique_ptr<char[]> data;
int size { 0 };
};
ThreadIdentifier m_workerThread { 0 };
std::atomic<bool> m_stopThread { false };
Lock m_mutexSend;
Lock m_mutexReceive;
Deque<SocketData> m_sendData;
Deque<SocketData> m_receiveData;
};
}