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 #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 }