defuze.me  Client
remotesock.cpp
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 #include <QHostAddress>
00012 #include "remotesock.hpp"
00013 #include "logger.hpp"
00014 #include "status.hpp"
00015 
00016 using namespace Network;
00017 
00018 RemoteSock::RemoteSock(QTcpSocket *sock) : sock(sock)
00019 {
00020     connect(sock, SIGNAL(disconnected()), SLOT(deleteLater()));
00021     connect(sock, SIGNAL(readyRead()), SLOT(receive()));
00022     nextEventId = 1;
00023 }
00024 
00025 RemoteSock::~RemoteSock()
00026 {
00027     sock->deleteLater();
00028 }
00029 
00030 QString     RemoteSock::ip() const {
00031     return sock->peerAddress().toString();
00032 }
00033 
00034 int         RemoteSock::port() const {
00035     return sock->peerPort();
00036 }
00037 
00038 const Parser&       RemoteSock::eventParser() const
00039 {
00040     static JsonParser   parser;
00041     return parser;
00042 }
00043 
00044 RemoteEvent&    RemoteSock::newEvent(const QString& name)
00045 {
00046     RemoteEvent *event = new RemoteEvent(this);
00047 
00048     event->uid = nextEventId;
00049     event->event = name;
00050     nextEventId++;
00051     return *event;
00052 }
00053 
00054 void            RemoteSock::sendEvent(RemoteEvent *event)
00055 {
00056     sock->write(event->toStream());
00057 }
00058 
00059 const QString&  RemoteSock::getToken() const
00060 {
00061     return token;
00062 }
00063 
00064 const QString&  RemoteSock::getDevice() const
00065 {
00066     return device;
00067 }
00068 
00069 const QString&  RemoteSock::getVersion() const
00070 {
00071     return version;
00072 }
00073 
00074 void            RemoteSock::receive()
00075 {
00076     int         split;
00077 
00078     buffer += sock->readAll();
00079     while ((split = buffer.indexOf('\0')) >= 0)
00080     {
00081         qDebug() << "received event (" + QString::number(split) + "): " + buffer.left(split);
00082         RemoteEvent event(this, buffer.left(split));
00083 
00084         buffer.remove(0, split+1);
00085         if (event.isReply())
00086         {
00087             RemoteEvent *request = event.getRequest();
00088             if (request)
00089             {
00090                 emit request->receiveReply(event);
00091                 events.remove(request->getUid());
00092                 delete request;
00093             }
00094             else
00095             {
00096                 Logger::log(QString("Remote: bad event reply id received: %1").arg(event.getRequestId()));
00097             }
00098         }
00099         else
00100         {
00101             emit receiveEvent(event);
00102         }
00103     }
00104 }