SoundBand/sync/node.cpp

154 lines
3.8 KiB
C++
Raw Normal View History

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-06 01:33:16 +03:00
syncLib::package::package(){
type = syncLib::package::t_void;
source.clear();
playTime = 0;
playPoint = 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;
}
unsigned int syncLib::package::getPlayTime(){
return playTime;
}
unsigned int syncLib::package::getPlayPoint(){
return playPoint;
}
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:
return playTime > 0 && playPoint > 0;
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);
stream << playTime;
stream << playPoint;
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:
stream >> playTime;
stream >> playPoint;
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){
i->Write(data);
}
}
void syncLib::Node::disconnectClient(QTcpSocket *c){
c->getSource()->close();
clients.removeOne(c);
delete c;
}
syncLib::Node::~Node(){
for(QTcpSocket *i:clients){
i->getSource()->abort();
delete i;
}
this->close();
}