From 4fb18f31865f9766579d7221b040b1da9c98b561 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Sat, 21 Dec 2013 23:49:52 -0800 Subject: WebSockets can now send frames. --- includes/BWebSocket.h | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'includes/BWebSocket.h') diff --git a/includes/BWebSocket.h b/includes/BWebSocket.h index a230a89..49f8cd1 100644 --- a/includes/BWebSocket.h +++ b/includes/BWebSocket.h @@ -9,15 +9,33 @@ namespace Balau { class WebSocketActionBase; +class WebSocketFrame { + public: + WebSocketFrame(const String & str, uint8_t opcode, bool mask = false) : WebSocketFrame((uint8_t *) str.to_charp(), str.strlen(), opcode, mask) { } + WebSocketFrame(size_t len, uint8_t opcode, bool mask = false) : WebSocketFrame(NULL, len, opcode, mask) { } + WebSocketFrame(const uint8_t * data, size_t len, uint8_t opcode, bool mask = false); + ~WebSocketFrame() { free(m_data); } + uint8_t & operator[](size_t idx); + uint8_t * getPtr() { return m_data + m_headerSize; } + void send(IO socket); + private: + uint8_t * m_data = NULL; + size_t m_len = 0; + size_t m_headerSize = 0; + uint32_t m_mask = 'BLAH'; + size_t m_bytesSent = 0; +}; + class WebSocketWorker : public StacklessTask { public: virtual bool parse(Http::Request & req) { return true; } + void sendFrame(WebSocketFrame * frame) { m_sendQueue.push(frame); } protected: - WebSocketWorker(IO socket, const String & url) : m_socket(new BStream(socket)) { m_name = String("WebSocket:") + url + "/" + m_socket->getName(); } - ~WebSocketWorker() { free(m_payload); } + WebSocketWorker(IO socket, const String & url) : m_socket(new BStream(socket)) { m_name = String("WebSocket:") + url + ":" + m_socket->getName(); } + ~WebSocketWorker(); void disconnect() { m_socket->close(); } virtual void receiveMessage(const uint8_t * msg, size_t len, bool binary) = 0; -private: + private: void processMessage(); void processPing(); void processPong(); @@ -34,6 +52,8 @@ private: } m_status = READ_H; enum { MAX_WEBSOCKET_LIMIT = 4 * 1024 * 1024 }; uint8_t * m_payload = NULL; + WebSocketFrame * m_sending = NULL; + TQueue m_sendQueue; uint64_t m_payloadLen; uint64_t m_totalLen; uint64_t m_remainingBytes; -- cgit v1.2.3