defuze.me
Client
|
00001 /************************************************************************** 00002 ** defuze.me Epitech Innovative Project 00003 ** 00004 ** Copyright 2010-2011 00005 ** Athena Calmettes - Jocelyn De La Rosa - Francois Gaillard 00006 ** Adrien Jarthon - Alexandre Moore - Luc Peres - Arnaud Sellier 00007 ** 00008 ** All rights reserved. 00009 **************************************************************************/ 00010 00011 namespace Network { 00012 class WebSocket; 00013 } 00014 00015 #ifndef WEBSOCKET_HPP 00016 #define WEBSOCKET_HPP 00017 00018 #include <QTcpSocket> 00019 #include <QUrl> 00020 #include "webframe.hpp" 00021 00022 namespace Network 00023 { 00028 const QByteArray WebSocketSecret = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 00029 00030 class WebSocket : public QTcpSocket 00031 { 00032 Q_OBJECT 00033 public: 00034 explicit WebSocket(const QString& uri); 00035 ~WebSocket(); 00036 void onMessage(const QObject* receiver, const char* method); 00037 void onOpen(const QObject* receiver, const char* method); 00038 void onClose(const QObject* receiver, const char* method); 00039 void send(WebFrame& frame); 00040 00041 signals: 00042 void messageSignal(const QByteArray& data); 00043 void openSignal(); 00044 void closeSignal(const QString& error); 00045 00046 public slots: 00047 void connect(); 00048 00049 private slots: 00050 void errorSlot(QAbstractSocket::SocketError error); 00051 void handshake(); 00052 void receive(); 00053 00054 private: 00055 void generateToken(); 00056 bool validToken(const QByteArray& accept); 00057 bool parseHandshake(); 00058 bool parseFrame(); 00059 00060 QUrl uri; 00061 QByteArray buffer; 00062 WebFrame* frame; 00063 QVariantMap header; 00064 QByteArray token; 00065 bool handshaking; 00066 }; 00067 } 00068 00069 #endif // WEBSOCKET_HPP