text: #pragma once
  
  #include <utils/Logger.h>
  #include "webserver/WebSocketUtils.h"
  #include <QJsonObject>
  
  class QTcpSocket;
  class JsonAPI;
  
  class WebSocketClient : public QObject {
  	Q_OBJECT
  public:
  	WebSocketClient(QByteArray socketKey, QTcpSocket* sock, QObject* parent);
  
  	struct WebSocketHeader
  	{
  		bool          fin;
  		quint8 opCode;
  		bool          masked;
  		quint64       payloadLength;
  		char          key[4];
  	};
  
  private:
  	QTcpSocket* _socket;
  	QByteArray _secWebSocketKey;
  	Logger* _log;
  	JsonAPI* _jsonAPI;
  
  	void getWsFrameHeader(WebSocketHeader* header);
  	void sendClose(int status, QString reason = "");
  //	void handleBinaryMessage(QByteArray &data);
  	qint64 sendMessage_Raw(const char* data, quint64 size);
  	qint64 sendMessage_Raw(QByteArray &data);
  	QByteArray makeFrameHeader(quint8 opCode, quint64 payloadLength, bool lastFrame);
  
  	/// The buffer used for reading data from the socket
  	QByteArray _receiveBuffer;
  
  	/// buffer for websockets multi frame receive
  	QByteArray _wsReceiveBuffer;
  	quint8 _maskKey[4];
  
  	bool _onContinuation = false;
  
  	// true when data is missing for parsing
  	bool _notEnoughData = false;
  
  	// websocket header store
  	WebSocketHeader _wsh;
  
  	// masks for fields in the basic header
  	static uint8_t const BHB0_OPCODE = 0x0F;
  	static uint8_t const BHB0_RSV3   = 0x10;
  	static uint8_t const BHB0_RSV2   = 0x20;
  	static uint8_t const BHB0_RSV1   = 0x40;
  	static uint8_t const BHB0_FIN    = 0x80;
  
  	static uint8_t const BHB1_PAYLOAD = 0x7F;
  	static uint8_t const BHB1_MASK    = 0x80;
  
  	static uint8_t const payload_size_code_16bit = 0x7E; // 126
  	static uint8_t const payload_size_code_64bit = 0x7F; // 127
  
  	static const quint64 FRAME_SIZE_IN_BYTES = 512 * 512 * 2;  //maximum size of a frame when sending a message
  
  private slots:
  	void handleWebSocketFrame(void);
  	qint64 sendMessage(QJsonObject obj);
  };
  