2017-11-06 01:33:16 +03:00
|
|
|
#include "node.h"
|
|
|
|
#include <QTcpSocket>
|
|
|
|
#include "song.h"
|
2017-11-06 13:20:52 +03:00
|
|
|
#include <QDataStream>
|
2017-11-09 23:09:59 +03:00
|
|
|
|
|
|
|
|
2017-11-06 01:33:16 +03:00
|
|
|
syncLib::package::package(){
|
|
|
|
type = syncLib::package::t_void;
|
|
|
|
source.clear();
|
2017-11-11 14:03:14 +03:00
|
|
|
playdata.run = 0;
|
|
|
|
playdata.seek = 0;
|
2017-11-06 13:20:52 +03:00
|
|
|
size = 0;
|
2017-11-06 01:33:16 +03:00
|
|
|
}
|
|
|
|
syncLib::package::package(const QByteArray &array):
|
|
|
|
syncLib::package::package(){
|
|
|
|
parseFrom(array);
|
|
|
|
}
|
|
|
|
const Song& syncLib::package::getSong(){
|
|
|
|
return source;
|
|
|
|
}
|
|
|
|
|
2017-11-11 14:03:14 +03:00
|
|
|
Syncer syncLib::package::getPlayData(){
|
|
|
|
return playdata;
|
2017-11-06 01:33:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
syncLib::package::TypePackage syncLib::package::getType(){
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool syncLib::package::isValid(){
|
|
|
|
switch (type) {
|
|
|
|
case package::t_void:
|
|
|
|
return false;
|
|
|
|
case package::t_close:
|
|
|
|
return true;
|
|
|
|
case package::t_sync:
|
2017-11-11 14:03:14 +03:00
|
|
|
return Syncer.run > 0 && Syncer.seek > 0;
|
2017-11-06 01:33:16 +03:00
|
|
|
case package::t_song:
|
|
|
|
return source.size > 0;
|
|
|
|
case package::t_stop:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray syncLib::package::parseTo(){
|
|
|
|
QByteArray temp;
|
|
|
|
QDataStream stream(&temp);
|
|
|
|
temp.clear();
|
|
|
|
if(isValid()){
|
|
|
|
switch (type) {
|
|
|
|
case package::t_void:
|
|
|
|
break;
|
|
|
|
case package::t_close:
|
2017-11-06 13:20:52 +03:00
|
|
|
stream << int();
|
2017-11-06 01:33:16 +03:00
|
|
|
stream << (unsigned char)(type);
|
2017-11-06 13:20:52 +03:00
|
|
|
stream.device()->seek(0);
|
|
|
|
stream << temp.size();
|
2017-11-06 01:33:16 +03:00
|
|
|
break;
|
|
|
|
case package::t_sync:
|
2017-11-06 13:20:52 +03:00
|
|
|
stream << int();
|
2017-11-06 01:33:16 +03:00
|
|
|
stream << (unsigned char)(type);
|
2017-11-11 14:03:14 +03:00
|
|
|
stream << playdata.run;
|
|
|
|
stream << playdata.seek;
|
2017-11-06 13:20:52 +03:00
|
|
|
stream.device()->seek(0);
|
|
|
|
stream << temp.size();
|
2017-11-06 01:33:16 +03:00
|
|
|
break;
|
|
|
|
case package::t_song:
|
2017-11-06 13:20:52 +03:00
|
|
|
stream << int();
|
2017-11-06 01:33:16 +03:00
|
|
|
stream << (unsigned char)(type);
|
|
|
|
stream << source;
|
2017-11-06 13:20:52 +03:00
|
|
|
stream.device()->seek(0);
|
|
|
|
stream << temp.size();
|
2017-11-06 01:33:16 +03:00
|
|
|
break;
|
|
|
|
case package::t_stop:
|
2017-11-06 13:20:52 +03:00
|
|
|
stream << int();
|
2017-11-06 01:33:16 +03:00
|
|
|
stream << (unsigned char)(type);
|
2017-11-06 13:20:52 +03:00
|
|
|
stream.device()->seek(0);
|
|
|
|
stream << temp.size();
|
2017-11-06 01:33:16 +03:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool syncLib::package::parseFrom(const QByteArray &array){
|
|
|
|
type = t_void;
|
|
|
|
QDataStream stream(&array);
|
|
|
|
switch (type) {
|
|
|
|
case package::t_void:
|
|
|
|
return false;
|
|
|
|
case package::t_close:
|
|
|
|
return true;
|
|
|
|
case package::t_sync:
|
2017-11-11 14:03:14 +03:00
|
|
|
stream >> playdata.run;
|
|
|
|
stream >> playdata.seek;
|
2017-11-06 01:33:16 +03:00
|
|
|
return isValid();
|
|
|
|
case package::t_song:
|
|
|
|
stream >> source;
|
|
|
|
return isValid();
|
|
|
|
case package::t_stop:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return isValid();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
syncLib::Node::Node():QTcpServer(){
|
|
|
|
connect(this,SIGNAL(acceptError(QAbstractSocket::SocketError)),SLOT(acceptError_(QAbstractSocket::SocketError)));
|
|
|
|
connect(this,SIGNAL(newConnection()),SLOT(newConnection_()));
|
|
|
|
}
|
|
|
|
void syncLib::Node::acceptError_(QTcpSocket*c){
|
|
|
|
c->close();
|
|
|
|
clients.removeOne(c);
|
|
|
|
emit ClientDisconnected(c);
|
|
|
|
delete c;
|
|
|
|
}
|
|
|
|
QList<QTcpSocket*>* syncLib::Node::getClients(){
|
|
|
|
return &clients;
|
|
|
|
}
|
|
|
|
void syncLib::Node::newConnection_(){
|
|
|
|
QTcpSocket *newClient=new QTcpSocket(nextPendingConnection());
|
|
|
|
clients.push_back(newClient);
|
|
|
|
connect(newClient,SIGNAL(Disconnected(ETcpSocket*)),this,SLOT(acceptError_(QTcpSocket*)));
|
|
|
|
connect(newClient,SIGNAL(Message(ETcpSocket*)),this,SLOT(readData(QTcpSocket*)));
|
|
|
|
emit ClientConnected(newClient);
|
|
|
|
}
|
|
|
|
void syncLib::Node::readData(QTcpSocket *c){
|
|
|
|
emit Message(c);
|
|
|
|
}
|
|
|
|
void syncLib::Node::WriteAll(const QByteArray &data){
|
|
|
|
for(QTcpSocket*i:clients){
|
2017-11-11 14:03:14 +03:00
|
|
|
i->write(data);
|
2017-11-06 01:33:16 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
void syncLib::Node::disconnectClient(QTcpSocket *c){
|
2017-11-11 14:03:14 +03:00
|
|
|
c->close();
|
2017-11-06 01:33:16 +03:00
|
|
|
clients.removeOne(c);
|
|
|
|
delete c;
|
|
|
|
}
|
|
|
|
|
2017-11-09 23:09:59 +03:00
|
|
|
bool syncLib::Node::addNode(const QString &node,int port){
|
|
|
|
|
|
|
|
QTcpSocket *temp = new QTcpSocket;
|
|
|
|
if(temp->bind(node,port) && temp->open(QIODevice::ReadWrite)){
|
|
|
|
clients.append(temp);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool syncLib::Node::addNode(QTcpSocket *node){
|
|
|
|
if(node->isOpen()){
|
|
|
|
clients.append(node);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-06 01:33:16 +03:00
|
|
|
syncLib::Node::~Node(){
|
|
|
|
for(QTcpSocket *i:clients){
|
2017-11-11 14:03:14 +03:00
|
|
|
i->abort();
|
2017-11-06 01:33:16 +03:00
|
|
|
delete i;
|
|
|
|
}
|
|
|
|
this->close();
|
|
|
|
}
|