[Libreoffice-commits] online.git: Branch 'private/Ashod/nonblocking' - net/loolnb.cpp net/Socket.hpp net/SslSocket.hpp
Jan Holesovsky
kendy at collabora.com
Thu Feb 23 12:29:17 UTC 2017
net/Socket.hpp | 20 +++++++++-----------
net/SslSocket.hpp | 2 +-
net/loolnb.cpp | 29 ++++++++++++++++++++---------
3 files changed, 30 insertions(+), 21 deletions(-)
New commits:
commit e16fee0341b2c42f355db5a9f9f02b3373880d52
Author: Jan Holesovsky <kendy at collabora.com>
Date: Thu Feb 23 13:14:01 2017 +0100
nb: Abstract WebSocketHandler.
We don't need a special "WebSocket" class, as websocket itself is just an
upgrade of an existing socket / connection, and trying to come up with a
concept where a Socket class magically upgrades to a WebSocket class would be
messy.
So let's have just a WebSocketHandler, that communicates over a StreamSocket
or SslStreamSocket, and be done with that :-)
Change-Id: I449e4d662fbe2c5b1789e308053e4a71376fe481
diff --git a/net/Socket.hpp b/net/Socket.hpp
index 9c037e9..6020ca8 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -286,7 +286,7 @@ private:
class StreamSocket;
/// Interface that handles the actual incoming message.
-class ResponseClientInterface
+class SocketHandlerInterface
{
public:
/// Set the socket associated with this ResponseClient.
@@ -300,11 +300,11 @@ public:
class StreamSocket : public Socket
{
public:
- StreamSocket(const int fd, ResponseClientInterface* responseClient) :
+ StreamSocket(const int fd, SocketHandlerInterface* socketHandler) :
Socket(fd),
- _responseClient(responseClient)
+ _socketHandler(socketHandler)
{
- _responseClient->setSocket(this);
+ _socketHandler->setSocket(this);
}
/// Called when a polling event is received.
@@ -322,8 +322,8 @@ public:
while (!_inBuffer.empty() && oldSize != _inBuffer.size())
{
oldSize = _inBuffer.size();
- if (_responseClient)
- _responseClient->handleIncomingMessage();
+ if (_socketHandler)
+ _socketHandler->handleIncomingMessage();
}
// SSL might want to do handshake,
@@ -415,15 +415,13 @@ public:
protected:
/// Client handling the actual data.
- std::unique_ptr<ResponseClientInterface> _responseClient;
+ std::unique_ptr<SocketHandlerInterface> _socketHandler;
std::vector< char > _inBuffer;
std::vector< char > _outBuffer;
- // FIXME temporarily make this friend class; when integrating, we'll see
- // what methods we need to introduce instead of direct access to the
- // _inBuffer / _outBuffer.
- friend class SimpleResponseClient;
+ // To be able to access _inBuffer and _outBuffer.
+ friend class WebSocketHandler;
};
#endif
diff --git a/net/SslSocket.hpp b/net/SslSocket.hpp
index c46ffbc..87b4b33 100644
--- a/net/SslSocket.hpp
+++ b/net/SslSocket.hpp
@@ -21,7 +21,7 @@
class SslStreamSocket : public StreamSocket
{
public:
- SslStreamSocket(const int fd, ResponseClientInterface* responseClient) :
+ SslStreamSocket(const int fd, SocketHandlerInterface* responseClient) :
StreamSocket(fd, responseClient),
_ssl(nullptr),
_sslWantsTo(SslWantsTo::ReadOrWrite),
diff --git a/net/loolnb.cpp b/net/loolnb.cpp
index 4e4ac38..0428b4b 100644
--- a/net/loolnb.cpp
+++ b/net/loolnb.cpp
@@ -37,7 +37,7 @@ constexpr int SslPortNumber = 9193;
static std::string computeAccept(const std::string &key);
-class SimpleResponseClient : public ResponseClientInterface
+class WebSocketHandler : public SocketHandlerInterface
{
std::unique_ptr<StreamSocket> _socket;
int _wsVersion;
@@ -47,18 +47,19 @@ class SimpleResponseClient : public ResponseClientInterface
enum { HTTP, WEBSOCKET } _wsState;
public:
- SimpleResponseClient() :
+ WebSocketHandler() :
_wsVersion(0),
_wsState(HTTP)
{
}
+ /// Implementation of the SocketHandlerInterface.
virtual void setSocket(StreamSocket* socket) override
{
_socket.reset(socket);
}
- void handleHTTP()
+ void handleWebsocketUpgrade()
{
int number = 0;
MemoryInputStream message(&_socket->_inBuffer[0], _socket->_inBuffer.size());
@@ -133,12 +134,13 @@ public:
// ... reserved
};
+ /// Implementation of the SocketHandlerInterface.
virtual void handleIncomingMessage() override
{
std::cerr << "incoming message with buffer size " << _socket->_inBuffer.size() << "\n";
if (_wsState == HTTP)
{
- handleHTTP();
+ handleWebsocketUpgrade();
return;
}
@@ -204,11 +206,11 @@ public:
_socket->_inBuffer.erase(_socket->_inBuffer.begin(), _socket->_inBuffer.begin() + headerLen + payloadLen);
// FIXME: fin, aggregating payloads into _wsPayload etc.
- handleWSMessage(fin, code, _wsPayload);
+ handleMessage(fin, code, _wsPayload);
_wsPayload.clear();
}
- void queueWSMessage(const std::vector<char> &data,
+ void sendMessage(const std::vector<char> &data,
WSOpCode code = WSOpCode::Binary)
{
size_t len = data.size();
@@ -253,7 +255,17 @@ public:
_socket->_outBuffer.insert(_socket->_outBuffer.end(), data.begin(), data.end());
}
- void handleWSMessage(bool fin, WSOpCode code, std::vector<char> &data)
+ virtual void handleMessage(bool fin, WSOpCode code, std::vector<char> &data) = 0;
+};
+
+class SimpleResponseClient : public WebSocketHandler
+{
+public:
+ SimpleResponseClient() : WebSocketHandler()
+ {
+ }
+
+ virtual void handleMessage(bool fin, WSOpCode code, std::vector<char> &data) override
{
std::cerr << "Message: fin? " << fin << " code " << code << " data size " << data.size();
if (code == WSOpCode::Text)
@@ -284,9 +296,8 @@ public:
reply.insert(reply.end(), data.begin(), data.end());
}
- queueWSMessage(reply);
+ sendMessage(reply);
}
-
};
// FIXME: use Poco Thread instead (?)
More information about the Libreoffice-commits
mailing list