2017-11-18 01:29:14 +03:00
|
|
|
#include "ETcpSocket.h"
|
|
|
|
#include "exaptions.h"
|
2018-01-08 17:29:58 +03:00
|
|
|
#include <QTimer>
|
2017-11-18 01:29:14 +03:00
|
|
|
|
|
|
|
ETcpSocket::ETcpSocket()
|
|
|
|
{
|
|
|
|
source=new QTcpSocket();
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
ETcpSocket::ETcpSocket(QTcpSocket*ptr)
|
|
|
|
{
|
|
|
|
source=ptr;
|
|
|
|
init();
|
2018-01-09 22:14:54 +03:00
|
|
|
pingTimer->start(0);
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
ETcpSocket::ETcpSocket(const QString& address, int port){
|
|
|
|
source = new QTcpSocket();
|
2017-11-27 22:59:59 +03:00
|
|
|
source->connectToHost(address, port);
|
|
|
|
if(!source->waitForConnected(DEEP_SCANER_INTERVAL) || !source->open(QIODevice::ReadWrite)){
|
2017-11-24 21:17:41 +03:00
|
|
|
throw AddNodeExaption();
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::init(){
|
2017-12-17 01:23:38 +03:00
|
|
|
array = new QByteArray;
|
|
|
|
fSynced = false;
|
|
|
|
differenceTime = 0;
|
2018-01-08 17:29:58 +03:00
|
|
|
pingTimer = new QTimer();
|
|
|
|
checInterval = CHECK_PING_INTERVAL;
|
2017-12-17 01:23:38 +03:00
|
|
|
|
2018-01-08 17:29:58 +03:00
|
|
|
srand(time(0));
|
|
|
|
|
2018-01-10 19:24:09 +03:00
|
|
|
connect(pingTimer, SIGNAL(timeout()), SLOT(calcPing()));
|
2017-11-18 01:29:14 +03:00
|
|
|
connect(source,SIGNAL(connected()),this,SLOT(connected_()));
|
|
|
|
connect(source,SIGNAL(disconnected()),this,SLOT(disconnected_()));
|
|
|
|
connect(source,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error_(QAbstractSocket::SocketError)));
|
|
|
|
connect(source,SIGNAL(hostFound()),this,SLOT(hostFound_()));
|
|
|
|
connect(source,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)),this,SLOT(proxyAuthenticationRequired_(const QNetworkProxy &, QAuthenticator *)));
|
|
|
|
connect(source,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged_(QAbstractSocket::SocketState)));
|
|
|
|
connect(source,SIGNAL(readyRead()),this,SLOT(readReady_()));
|
|
|
|
}
|
|
|
|
|
2018-01-12 11:16:06 +03:00
|
|
|
/**
|
|
|
|
* @todo remove from array is sloy
|
|
|
|
*/
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
bool ETcpSocket::readDriverFlags(const driver_flag driverFlag){
|
2018-01-12 11:16:06 +03:00
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_SENDER){
|
2018-01-12 11:16:06 +03:00
|
|
|
milliseconds ms;
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
source->read((char*)(&ms), sizeof(ms));
|
2018-01-12 11:16:06 +03:00
|
|
|
|
|
|
|
milliseconds range = ChronoTime::now() - ms;
|
|
|
|
|
|
|
|
QByteArray cArray;
|
|
|
|
QDataStream stream(&cArray,QIODevice::ReadWrite);
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
char answer = IS_DRIVER;
|
2018-01-12 11:16:06 +03:00
|
|
|
if(range < MIN_DIFFERENCE){
|
2018-01-13 18:38:26 +03:00
|
|
|
answer = CALIBRATION_RECEIVER_DONE | answer;
|
2018-01-12 11:16:06 +03:00
|
|
|
fSynced = true;
|
|
|
|
|
|
|
|
}else{
|
2018-01-13 18:38:26 +03:00
|
|
|
answer = CALIBRATION_RECEIVER | answer;
|
2018-01-12 11:16:06 +03:00
|
|
|
stream << range;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
source->write(cArray, answer);
|
2018-01-12 11:16:06 +03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_RECEIVER){
|
2018-01-12 11:16:06 +03:00
|
|
|
ping = ChronoTime::now() - lastTime;
|
|
|
|
milliseconds ms;
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(sizeof(ms) != source->read((char*)(&ms), sizeof(ms))){
|
2018-01-12 11:16:06 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
differenceTime += ms + ping / 2;
|
|
|
|
|
|
|
|
QByteArray cArray;
|
2018-01-13 18:38:26 +03:00
|
|
|
|
|
|
|
QDataStream stream(&cArray, QIODevice::ReadWrite);
|
2018-01-12 11:16:06 +03:00
|
|
|
stream << milliseconds(ChronoTime::now() + differenceTime);
|
|
|
|
|
|
|
|
lastTime = ChronoTime::now();
|
2018-01-13 18:38:26 +03:00
|
|
|
source->write(cArray, CALIBRATION_SENDER | IS_DRIVER);
|
2018-01-12 11:16:06 +03:00
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_RECEIVER_DONE){
|
2018-01-12 11:16:06 +03:00
|
|
|
QByteArray cArray;
|
2018-01-13 18:38:26 +03:00
|
|
|
QDataStream stream(&cArray, QIODevice::ReadWrite);
|
2018-01-12 11:16:06 +03:00
|
|
|
|
|
|
|
stream << milliseconds(-differenceTime);
|
|
|
|
fSynced = true;
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
source->write(cArray, CALIBRATION_SENDER_DONE | IS_DRIVER);
|
2018-01-12 11:16:06 +03:00
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_SENDER_DONE){
|
2018-01-12 11:16:06 +03:00
|
|
|
|
|
|
|
if(sizeof(differenceTime) !=
|
|
|
|
source->read((char*)differenceTime, sizeof(differenceTime))){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_PING_DONE){
|
2018-01-12 11:16:06 +03:00
|
|
|
ping = ChronoTime::now() - lastTime;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & CALIBRATION_PING){
|
2018-01-12 11:16:06 +03:00
|
|
|
calcPing(CALIBRATION_PING_DONE | IS_DRIVER);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(source->readAll().size()){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool ETcpSocket::driver(){
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
driver_flag driverFlag;
|
|
|
|
source->read((char*)&driverFlag, 1);
|
2018-01-12 11:16:06 +03:00
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(driverFlag & IS_DRIVER){
|
2018-01-12 11:16:06 +03:00
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
if(!readDriverFlags(driverFlag)){
|
|
|
|
throw NetworkError();
|
2018-01-12 11:16:06 +03:00
|
|
|
source->close();
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-01-08 14:37:59 +03:00
|
|
|
int ETcpSocket::getPing()const{
|
|
|
|
return ping;
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
void ETcpSocket::calcPing(driver_flag flag){
|
2018-01-08 17:29:58 +03:00
|
|
|
pingTimer->setInterval(rand() % checInterval);
|
2018-01-08 14:37:59 +03:00
|
|
|
lastTime = ChronoTime::now();
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
Write(QByteArray(), flag);
|
2018-01-08 14:37:59 +03:00
|
|
|
}
|
|
|
|
|
2018-01-08 17:29:58 +03:00
|
|
|
void ETcpSocket::setCheckInterval(int newInterval){
|
|
|
|
checInterval = newInterval;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ETcpSocket::getCheckInterval()const{
|
|
|
|
return checInterval;
|
|
|
|
}
|
|
|
|
|
2017-11-18 01:29:14 +03:00
|
|
|
void ETcpSocket::error_(QAbstractSocket::SocketError i){
|
|
|
|
emit Error(this,i);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::connected_(){
|
2018-01-08 17:29:58 +03:00
|
|
|
pingTimer->start(0);
|
2017-11-18 01:29:14 +03:00
|
|
|
emit Connected(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::disconnected_(){
|
|
|
|
emit Disconnected(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::hostFound_(){
|
|
|
|
emit HostFound(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::proxyAuthenticationRequired_(const QNetworkProxy &proxy, QAuthenticator *authenticator){
|
2018-01-10 19:24:09 +03:00
|
|
|
emit ProxyAuthenticationRequired(this, proxy, authenticator);
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::stateChanged_(QAbstractSocket::SocketState socketState){
|
|
|
|
emit StateChanged(this,socketState);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ETcpSocket::readReady_(){
|
2018-01-12 11:16:06 +03:00
|
|
|
|
|
|
|
if(!driver())
|
|
|
|
return ;
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
bool sizewrite = array->isEmpty();
|
2017-11-18 01:29:14 +03:00
|
|
|
array->append(source->readAll());
|
2018-01-12 11:16:06 +03:00
|
|
|
QDataStream stream(array, QIODevice::ReadOnly);
|
|
|
|
if(sizewrite)
|
2017-12-17 01:23:38 +03:00
|
|
|
stream >> size;
|
|
|
|
|
2017-11-18 01:29:14 +03:00
|
|
|
#ifdef QT_DEBUG
|
2018-01-13 18:38:26 +03:00
|
|
|
qDebug()<<"messae size:" << size;
|
|
|
|
qDebug()<<"message package size:" << array->size();
|
2017-11-18 01:29:14 +03:00
|
|
|
#endif
|
|
|
|
if(size==array->size())
|
|
|
|
{
|
2018-01-13 18:38:26 +03:00
|
|
|
array->remove(0, sizeof(qint32));
|
2017-11-18 01:29:14 +03:00
|
|
|
ReadyStack.push_back(array);
|
2017-11-20 00:37:12 +03:00
|
|
|
array=new QByteArray();
|
2017-11-18 01:29:14 +03:00
|
|
|
emit Message(this);
|
|
|
|
}else{
|
2018-01-13 18:38:26 +03:00
|
|
|
emit donwload(array->size(), size);
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-11 21:48:01 +03:00
|
|
|
QString ETcpSocket::peerName() const{
|
|
|
|
return QString("%0:%1").arg(source->peerAddress().toString()).arg(source->peerPort());
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ETcpSocket::localName() const{
|
|
|
|
return QString("%0:%1").arg(source->localAddress().toString()).arg(source->localPort());
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray* ETcpSocket::topStack(){
|
|
|
|
if(ReadyStack.size())
|
|
|
|
return ReadyStack.front();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
QTcpSocket* ETcpSocket::getSource()const{
|
|
|
|
return source;
|
|
|
|
}
|
|
|
|
|
2017-11-26 19:19:43 +03:00
|
|
|
void ETcpSocket::nextItem(bool free){
|
2017-11-20 00:37:12 +03:00
|
|
|
if( ReadyStack.size()){
|
2017-11-26 19:19:43 +03:00
|
|
|
if(free){
|
|
|
|
ReadyStack.front()->clear();
|
|
|
|
delete ReadyStack.front();
|
|
|
|
}
|
2017-11-18 01:29:14 +03:00
|
|
|
ReadyStack.pop_front();
|
2017-11-20 00:37:12 +03:00
|
|
|
}
|
2017-11-18 01:29:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
int ETcpSocket::sizeDescriptPackege(){
|
|
|
|
return sizeof(qint32);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ETcpSocket::toStringTcp(){
|
|
|
|
return source->peerAddress().toString();
|
|
|
|
}
|
|
|
|
|
2017-12-17 01:23:38 +03:00
|
|
|
milliseconds ETcpSocket::getDifferenceTime() const{
|
|
|
|
return differenceTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ETcpSocket::isSynced()const{
|
|
|
|
return fSynced;
|
|
|
|
}
|
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
bool ETcpSocket::Write(const QByteArray&data , signed char driverFlag){
|
2017-11-18 01:29:14 +03:00
|
|
|
if(source->state()==QTcpSocket::ConnectedState){
|
|
|
|
QByteArray array;
|
2018-01-13 18:38:26 +03:00
|
|
|
QDataStream stream(&array, QIODevice::ReadWrite);
|
2017-12-17 01:23:38 +03:00
|
|
|
|
2018-01-13 18:38:26 +03:00
|
|
|
stream << driverFlag;
|
2017-12-17 01:23:38 +03:00
|
|
|
stream << qint32(0);
|
|
|
|
|
2017-11-18 01:29:14 +03:00
|
|
|
array.append(data);
|
2018-01-13 18:38:26 +03:00
|
|
|
stream.device()->seek(1);
|
|
|
|
stream<<qint32(array.size() - 1);
|
2017-11-18 01:29:14 +03:00
|
|
|
#ifdef QT_DEBUG
|
2018-01-13 18:38:26 +03:00
|
|
|
qDebug() << "size :" << array.size();
|
|
|
|
qint64 temp = source->write(array);
|
|
|
|
qDebug() << "size write:" << temp << " size packege:" << array.size();
|
|
|
|
return temp == (array.size());
|
2017-11-18 01:29:14 +03:00
|
|
|
#else
|
2018-01-13 18:38:26 +03:00
|
|
|
return source->write(array) == (array.size());
|
2017-11-18 01:29:14 +03:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-12-17 01:23:38 +03:00
|
|
|
void ETcpSocket::calibration(){
|
|
|
|
if(!fSynced){
|
|
|
|
QByteArray cArray;
|
|
|
|
QDataStream stream(&cArray,QIODevice::ReadWrite);
|
2018-01-12 11:16:06 +03:00
|
|
|
stream << (CALIBRATION_SENDER | IS_DRIVER);
|
2017-12-17 01:23:38 +03:00
|
|
|
stream << milliseconds(ChronoTime::now());
|
|
|
|
lastTime = ChronoTime::now();
|
|
|
|
|
|
|
|
source->write(cArray);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-11-18 01:29:14 +03:00
|
|
|
ETcpSocket::~ETcpSocket()
|
|
|
|
{
|
|
|
|
for(QByteArray*i:ReadyStack){
|
|
|
|
i->clear();
|
|
|
|
delete i;
|
|
|
|
}
|
|
|
|
disconnect(source,SIGNAL(connected()),this,SLOT(connected_()));
|
|
|
|
disconnect(source,SIGNAL(disconnected()),this,SLOT(disconnected_()));
|
|
|
|
disconnect(source,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error_(QAbstractSocket::SocketError)));
|
|
|
|
disconnect(source,SIGNAL(hostFound()),this,SLOT(hostFound_()));
|
|
|
|
disconnect(source,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)),this,SLOT(proxyAuthenticationRequired_(const QNetworkProxy &, QAuthenticator *)));
|
|
|
|
disconnect(source,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged_(QAbstractSocket::SocketState)));
|
|
|
|
disconnect(source,SIGNAL(readyRead()),this,SLOT(readReady_()));
|
|
|
|
source->deleteLater();
|
|
|
|
}
|