defuze.me  Client
websocket.hpp
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