2017-10-29 14:47:36 +03:00
|
|
|
#include "sync.h"
|
2017-11-09 23:09:59 +03:00
|
|
|
#include <QtSql>
|
|
|
|
#include <QMultimedia>
|
|
|
|
#include <QMediaPlayer>
|
|
|
|
#include <QSqlQuery>
|
2017-11-11 14:03:14 +03:00
|
|
|
#include "exaptions.h"
|
2017-11-11 20:35:30 +03:00
|
|
|
#include "time.h"
|
|
|
|
#include "thread"
|
2017-11-09 23:09:59 +03:00
|
|
|
#include "config.h"
|
2017-11-06 01:33:16 +03:00
|
|
|
|
2017-11-09 23:09:59 +03:00
|
|
|
#ifdef QT_DEBUG
|
|
|
|
#include <QDebug>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
namespace syncLib{
|
|
|
|
|
2017-11-28 20:32:54 +03:00
|
|
|
Sync::Sync(const QString address, int port, const QString &datadir):
|
2017-11-27 02:01:47 +03:00
|
|
|
node(nullptr),
|
|
|
|
db(nullptr),
|
|
|
|
player(nullptr),
|
|
|
|
qyery(nullptr),
|
|
|
|
buffer(nullptr)
|
|
|
|
{
|
2017-11-28 20:32:54 +03:00
|
|
|
node = new Node(address , this->port = port);
|
2017-11-27 22:59:59 +03:00
|
|
|
|
2017-11-09 23:09:59 +03:00
|
|
|
player = new QMediaPlayer(nullptr,QMediaPlayer::LowLatency);
|
2017-11-27 02:01:47 +03:00
|
|
|
buffer = new QBuffer;
|
2017-11-11 14:03:14 +03:00
|
|
|
if(!player->isAvailable()){
|
|
|
|
throw MediaException();
|
|
|
|
}
|
2017-11-27 02:01:47 +03:00
|
|
|
|
2017-11-27 22:59:59 +03:00
|
|
|
fbroadcaster = false;
|
|
|
|
|
|
|
|
initDB(datadir);
|
2017-11-27 02:01:47 +03:00
|
|
|
|
2017-11-22 20:05:53 +03:00
|
|
|
connect(node,SIGNAL(Message(ETcpSocket*)),SLOT(packageRender(ETcpSocket*)));
|
2017-11-22 22:34:55 +03:00
|
|
|
connect(&deepScaner,SIGNAL(scaned(QList<ETcpSocket*>*)),SLOT(deepScaned(QList<ETcpSocket*>*)));
|
|
|
|
|
2017-11-09 23:09:59 +03:00
|
|
|
}
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
void Sync::sqlErrorLog(const QString &qyery){
|
|
|
|
#ifdef QT_DEBUG
|
|
|
|
qDebug()<< qyery << ": fail:\n " <<this->qyery->lastError();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-11-27 22:59:59 +03:00
|
|
|
void Sync::initDB(const QString &database){
|
2017-11-09 23:09:59 +03:00
|
|
|
if(db) return;
|
2017-11-27 22:59:59 +03:00
|
|
|
dataBaseName = database;
|
2017-11-27 02:01:47 +03:00
|
|
|
db = new QSqlDatabase();
|
2017-11-27 22:59:59 +03:00
|
|
|
*db = QSqlDatabase::addDatabase("QSQLITE", "connection_of_" + database);
|
|
|
|
QDir d(QString("./%0").arg(dataBaseName));
|
2017-11-11 20:35:30 +03:00
|
|
|
db->setDatabaseName(d.absolutePath());
|
2017-11-09 23:09:59 +03:00
|
|
|
if(db->open()){
|
2017-11-11 20:35:30 +03:00
|
|
|
qyery = new QSqlQuery(*db);
|
2017-11-27 02:01:47 +03:00
|
|
|
QString qyer = QString("CREATE TABLE IF NOT EXISTS %0"
|
|
|
|
"(id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
|
|
"name VARCHAR(100), "
|
|
|
|
"size INT NOT NULL, "
|
|
|
|
"data BLOB NOT NULL)").arg(DATATABLE_NAME);
|
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
sqlErrorLog(qyer);
|
|
|
|
throw InitDBError();
|
2017-11-27 22:59:59 +03:00
|
|
|
delete db;
|
|
|
|
return;
|
2017-11-27 02:01:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
qyer = QString("CREATE UNIQUE INDEX IF NOT EXISTS i%0 ON %0(name,size)").arg(DATATABLE_NAME);
|
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
sqlErrorLog(qyer);
|
|
|
|
throw InitDBError();
|
2017-11-27 22:59:59 +03:00
|
|
|
delete db;
|
|
|
|
return;
|
2017-11-27 02:01:47 +03:00
|
|
|
}
|
2017-11-09 23:09:59 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-11 20:35:30 +03:00
|
|
|
int Sync::save(const Song &song){
|
2017-11-27 02:01:47 +03:00
|
|
|
QString qyer = QString("SELECT id from %0 where name='%1' and size=%2").arg(DATATABLE_NAME,
|
2017-11-09 23:09:59 +03:00
|
|
|
song.name,
|
|
|
|
QString::number(song.size));
|
2017-11-27 02:01:47 +03:00
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
sqlErrorLog(qyer);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if(qyery->next()){
|
|
|
|
return qyery->value(0).toInt();
|
|
|
|
}
|
|
|
|
|
|
|
|
qyer = QString("INSERT INTO %0 (name,size,data) VALUES"
|
|
|
|
"('%1',%2,:val)").arg(DATATABLE_NAME,
|
2017-11-09 23:09:59 +03:00
|
|
|
song.name,
|
|
|
|
QString::number(song.size));
|
2017-11-27 02:01:47 +03:00
|
|
|
if(!qyery->prepare(qyer)){
|
|
|
|
sqlErrorLog(qyer + " prepare error");
|
2017-11-11 20:35:30 +03:00
|
|
|
return -1;
|
2017-11-27 02:01:47 +03:00
|
|
|
}
|
|
|
|
qyery->bindValue(":val",song.source);
|
|
|
|
if(!qyery->exec()){
|
|
|
|
sqlErrorLog(qyer);
|
2017-11-11 20:35:30 +03:00
|
|
|
return -1;
|
2017-11-27 02:01:47 +03:00
|
|
|
}
|
|
|
|
if(!qyery->exec(QString("SELECT MAX(id) from %0").arg(DATATABLE_NAME))){
|
|
|
|
sqlErrorLog(qyer);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if(!qyery->next())
|
2017-11-11 20:35:30 +03:00
|
|
|
return -1;
|
2017-11-27 02:01:47 +03:00
|
|
|
|
2017-11-11 20:35:30 +03:00
|
|
|
return qyery->value(0).toInt();
|
2017-11-09 23:09:59 +03:00
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
bool Sync::load(const SongHeader &song,Song &result){
|
|
|
|
result.clear();
|
|
|
|
if(song.id > -1){
|
|
|
|
QString qyer = QString("SELECT * from %0 where id=%1").arg(DATATABLE_NAME).arg(song.id);
|
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}else if(!song.name.isEmpty() && song.size > 0){
|
|
|
|
QString qyer = QString("SELECT * from %0 where name=%1 and size=%2").arg(DATATABLE_NAME).arg(song.name).arg(song.size);
|
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
if(!qyery->next()){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
result.id = qyery->value(0).toInt();
|
|
|
|
result.name = qyery->value(1).toString();
|
|
|
|
result.size = qyery->value(2).toInt();
|
|
|
|
result.source = qyery->value(3).toByteArray();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-11-12 13:26:37 +03:00
|
|
|
/*
|
|
|
|
* information about chrono
|
|
|
|
* https://stackoverflow.com/questions/31255486/c-how-do-i-convert-a-stdchronotime-point-to-long-and-back
|
|
|
|
*/
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
milliseconds Sync::now(){
|
2017-11-12 13:26:37 +03:00
|
|
|
auto tim = std::chrono::system_clock::now();
|
2017-11-20 00:37:12 +03:00
|
|
|
auto mc = std::chrono::time_point_cast<std::chrono::milliseconds>(tim);
|
2017-11-12 13:26:37 +03:00
|
|
|
auto epoh = mc.time_since_epoch();
|
|
|
|
#ifdef QT_DEBUG
|
|
|
|
qDebug() << epoh.count();
|
|
|
|
#endif
|
|
|
|
return epoh.count();
|
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
Clock Sync::from(const milliseconds& mc){
|
|
|
|
std::chrono::milliseconds dur(mc);
|
2017-11-12 13:26:37 +03:00
|
|
|
return Clock(dur);
|
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
bool Sync::play(const SongHeader &header, const Syncer *syncdata){
|
2017-12-02 14:35:39 +03:00
|
|
|
|
|
|
|
if(!header.isValid()){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
QString qyer = QString("SELECT * from %0 where name=%1 and size=%2").arg(DATATABLE_NAME).arg(header.name).arg(header.size);
|
|
|
|
if(!qyery->exec(qyer)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
Song song;
|
|
|
|
song.id = qyery->value(0).toInt();
|
|
|
|
song.name = qyery->value(1).toString();
|
|
|
|
song.size = qyery->value(2).toInt();
|
|
|
|
song.source = qyery->value(3).toByteArray();
|
2017-12-02 14:35:39 +03:00
|
|
|
return Sync::play(song, syncdata);
|
2017-11-20 00:37:12 +03:00
|
|
|
}
|
|
|
|
|
2017-12-02 14:35:39 +03:00
|
|
|
bool Sync::play(const Song &song, const Syncer *syncdata){
|
|
|
|
|
|
|
|
if(!song.isValid()){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
buffer->setData(song.source);
|
|
|
|
buffer->open(QIODevice::ReadOnly);
|
|
|
|
player->setMedia(QMediaContent(), buffer);
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
fbroadcaster = !bool(syncdata);
|
2017-12-02 14:35:39 +03:00
|
|
|
playList.push_front(static_cast<const SongHeader&>(song));
|
2017-11-24 21:17:41 +03:00
|
|
|
if(fbroadcaster){
|
|
|
|
package pac;
|
|
|
|
if(!createPackage(t_song_h | t_sync, pac)){
|
|
|
|
throw CreatePackageExaption();
|
|
|
|
}
|
|
|
|
node->WriteAll(pac.parseTo());
|
|
|
|
}
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
if(syncdata && !sync(*syncdata)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-11 14:03:14 +03:00
|
|
|
player->play();
|
2017-11-27 02:01:47 +03:00
|
|
|
|
2017-11-11 20:35:30 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
bool Sync::play(int id_song, Syncer *syncdata){
|
2017-11-11 20:35:30 +03:00
|
|
|
|
|
|
|
QString qyer = QString("SELECT * from %0 where id=%1").arg(DATATABLE_NAME).arg(id_song);
|
2017-11-27 02:01:47 +03:00
|
|
|
if(!qyery->exec(qyer) || !qyery->next()){
|
2017-11-11 20:35:30 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
Song song;
|
|
|
|
song.id = qyery->value(0).toInt();
|
|
|
|
song.name = qyery->value(1).toString();
|
|
|
|
song.size = qyery->value(2).toInt();
|
|
|
|
song.source = qyery->value(3).toByteArray();
|
2017-11-24 21:17:41 +03:00
|
|
|
return Sync::play(song,syncdata);
|
2017-11-11 20:35:30 +03:00
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
bool Sync::play(QString url){
|
2017-11-11 20:35:30 +03:00
|
|
|
QFile f(url);
|
|
|
|
if(!f.open(QIODevice::ReadOnly)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
QByteArray bytes = f.readAll();
|
|
|
|
f.close();
|
|
|
|
QString name = url.right(url.lastIndexOf(QRegularExpression("[\\/]"))); // meby [[\\\/]]
|
|
|
|
Song song;
|
|
|
|
song.name = name;
|
|
|
|
song.size = bytes.size();
|
|
|
|
song.source = bytes;
|
|
|
|
song.id = Sync::save(song);
|
|
|
|
if(song.id < 0)
|
|
|
|
return false;
|
2017-11-24 21:17:41 +03:00
|
|
|
return Sync::play(song);
|
2017-11-11 20:35:30 +03:00
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
void Sync::pause(){
|
2017-11-11 20:35:30 +03:00
|
|
|
player->pause();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Sync::stop(){
|
2017-11-29 20:34:47 +03:00
|
|
|
buffer->close();
|
2017-11-11 20:35:30 +03:00
|
|
|
player->stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Sync::jump(const int seek){
|
|
|
|
player->setPosition(seek);
|
2017-11-11 14:03:14 +03:00
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
bool Sync::sync(const Syncer &sync){
|
|
|
|
milliseconds sync_time = sync.run - now();
|
|
|
|
if(sync_time > MAX_SYNC_TIME && sync_time <= 0)
|
|
|
|
return false;
|
|
|
|
Clock run_time = from(sync.run);
|
|
|
|
do {
|
|
|
|
std::this_thread::yield();
|
|
|
|
} while (std::chrono::high_resolution_clock::now() < run_time);
|
|
|
|
player->setPosition(sync.seek);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-11-27 19:43:11 +03:00
|
|
|
bool Sync::addNode(const QString ip, int port){
|
|
|
|
if(!node->addNode(ip, port))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
rescan();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Sync::scan(){
|
|
|
|
|
|
|
|
rescan(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
const QList<ETcpSocket*>& Sync::getServersList() const{
|
|
|
|
return servers;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Sync::listen(ETcpSocket *server){
|
|
|
|
if(!server){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!server->getSource()->isOpen() && server->getSource()->open(QIODevice::ReadWrite)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
package pac;
|
|
|
|
|
|
|
|
if(!createPackage(t_sync,pac)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return server->Write(pac.parseTo());
|
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
bool Sync::createPackage(Type type, package &pac){
|
2017-11-20 00:37:12 +03:00
|
|
|
pac.clear();
|
|
|
|
|
2017-11-21 16:44:55 +03:00
|
|
|
pac.type = type;
|
2017-11-20 00:37:12 +03:00
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(type & TypePackage::t_sync && fbroadcaster){
|
2017-11-20 00:37:12 +03:00
|
|
|
|
|
|
|
pac.playdata.run = now() + SYNC_TIME;
|
|
|
|
pac.playdata.seek = player->position() + SYNC_TIME;
|
|
|
|
|
2017-11-21 16:44:55 +03:00
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(type & TypePackage::t_song_h && fbroadcaster){
|
2017-11-27 02:01:47 +03:00
|
|
|
if(playList.isEmpty())
|
2017-11-20 00:37:12 +03:00
|
|
|
return false;
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
pac.header = playList.front();
|
2017-11-20 00:37:12 +03:00
|
|
|
|
2017-11-21 16:44:55 +03:00
|
|
|
}
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(type & TypePackage::t_song && fbroadcaster){
|
2017-11-27 02:01:47 +03:00
|
|
|
if(playList.isEmpty())
|
2017-11-20 00:37:12 +03:00
|
|
|
return false;
|
|
|
|
|
2017-11-27 02:01:47 +03:00
|
|
|
if(!load(playList.front(), pac.source))
|
2017-11-20 00:37:12 +03:00
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
2017-11-24 21:17:41 +03:00
|
|
|
|
2017-11-22 20:05:53 +03:00
|
|
|
if(fbroadcaster)
|
|
|
|
pac.type = TypePackage(pac.type | t_brodcaster);
|
2017-11-21 16:44:55 +03:00
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
return pac.isValid();
|
|
|
|
}
|
|
|
|
|
2017-11-22 20:05:53 +03:00
|
|
|
void Sync::packageRender(ETcpSocket *socket){
|
|
|
|
|
|
|
|
QByteArray *array;
|
|
|
|
while((array = socket->topStack())){
|
2017-11-24 21:17:41 +03:00
|
|
|
package pkg;
|
|
|
|
if(!pkg.parseFrom((*array))){
|
|
|
|
throw BadAnswerExaption();
|
|
|
|
continue;
|
|
|
|
}
|
2017-11-22 20:05:53 +03:00
|
|
|
// package answer;
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
// scaning servers
|
2017-11-22 20:05:53 +03:00
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(pkg.getType() & t_brodcaster && servers.indexOf(socket) == -1){
|
|
|
|
servers.append(socket);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!(pkg.getType() & t_brodcaster) && servers.indexOf(socket) != -1){
|
|
|
|
servers.removeOne(socket);
|
|
|
|
}
|
2017-11-22 20:05:53 +03:00
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(fbroadcaster == (pkg.getType() & t_brodcaster)){
|
|
|
|
throw BrodcastConflict();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(pkg.getType() & t_brodcaster){
|
|
|
|
|
|
|
|
// if requst from server
|
|
|
|
|
|
|
|
if(pkg.getType() & t_play){
|
|
|
|
player->play();
|
|
|
|
}
|
|
|
|
|
2017-12-02 14:35:39 +03:00
|
|
|
if(pkg.getType() & t_sync && !play(pkg.getHeader(), &pkg.getPlayData()) && !play(pkg.getSong(), &pkg.getPlayData())){
|
|
|
|
|
|
|
|
Type requestType = t_song_h;
|
2017-11-24 21:17:41 +03:00
|
|
|
|
2017-12-02 14:35:39 +03:00
|
|
|
if(pkg.getType() & t_song_h)
|
|
|
|
requestType = t_song;
|
|
|
|
|
|
|
|
package answer;
|
|
|
|
if(!createPackage(requestType | t_sync, answer)){
|
|
|
|
throw CreatePackageExaption();
|
2017-11-24 21:17:41 +03:00
|
|
|
}
|
2017-12-02 14:35:39 +03:00
|
|
|
socket->Write(answer.parseTo());
|
2017-11-24 21:17:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if(pkg.getType() & t_close){
|
|
|
|
socket->getSource()->close();
|
|
|
|
node->getClients()->removeOne(socket);
|
|
|
|
delete socket;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(pkg.getType() & t_what){
|
|
|
|
package answer;
|
|
|
|
if(!createPackage(t_void, answer)){
|
|
|
|
throw CreatePackageExaption();
|
|
|
|
}
|
|
|
|
socket->Write(answer.parseTo());
|
|
|
|
}
|
|
|
|
|
2017-12-02 14:35:39 +03:00
|
|
|
|
|
|
|
}else{
|
|
|
|
|
2017-11-24 21:17:41 +03:00
|
|
|
if(pkg.getType() & t_sync){
|
2017-11-27 02:01:47 +03:00
|
|
|
if(playList.empty()){
|
2017-11-24 21:17:41 +03:00
|
|
|
throw SyncError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
package answer;
|
2017-12-02 13:22:20 +03:00
|
|
|
if(!createPackage(pkg.getType() & ~t_what & ~t_play & ~t_stop & ~t_brodcaster, answer)){
|
2017-11-24 21:17:41 +03:00
|
|
|
throw CreatePackageExaption();
|
|
|
|
}
|
|
|
|
socket->Write(answer.parseTo());
|
|
|
|
|
|
|
|
if(pkg.getType() & t_close){
|
|
|
|
socket->getSource()->close();
|
|
|
|
node->getClients()->removeOne(socket);
|
|
|
|
delete socket;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2017-11-22 20:05:53 +03:00
|
|
|
|
2017-11-26 19:19:43 +03:00
|
|
|
socket->nextItem();
|
2017-11-22 20:05:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-22 22:34:55 +03:00
|
|
|
void Sync::rescan(bool deep){
|
2017-11-22 20:05:53 +03:00
|
|
|
package pac;
|
|
|
|
if(!createPackage(t_what,pac)){
|
2017-11-24 21:17:41 +03:00
|
|
|
throw CreatePackageExaption();
|
2017-11-22 20:05:53 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
node->WriteAll(pac.parseTo());
|
2017-11-22 22:34:55 +03:00
|
|
|
|
|
|
|
if(deep){
|
|
|
|
deepScaner.setInterval(DEEP_SCANER_INTERVAL);
|
2017-11-27 19:43:11 +03:00
|
|
|
deepScaner.scane(port);
|
2017-11-22 22:34:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Sync::deepScaned(QList<ETcpSocket *> * list){
|
|
|
|
package pac;
|
|
|
|
if(!createPackage(t_what,pac)){
|
2017-11-24 21:17:41 +03:00
|
|
|
throw CreatePackageExaption();
|
2017-11-22 22:34:55 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
QByteArray array = pac.parseTo();
|
|
|
|
for(ETcpSocket * i: *list){
|
2017-12-02 13:22:20 +03:00
|
|
|
node->addNode(i);
|
2017-11-22 22:34:55 +03:00
|
|
|
i->Write(array);
|
|
|
|
}
|
2017-11-22 20:05:53 +03:00
|
|
|
}
|
|
|
|
|
2017-11-26 19:19:43 +03:00
|
|
|
QString Sync::getVersion(){
|
|
|
|
return QString(tr("Version") + "%0.%1.%2").arg(MAJOR_VERSION).arg(MINOR_VERSION).arg(REVISION_VERSION);
|
|
|
|
}
|
2017-11-09 23:09:59 +03:00
|
|
|
Sync::~Sync(){
|
|
|
|
delete node;
|
|
|
|
delete db;
|
|
|
|
delete player;
|
2017-11-22 20:05:53 +03:00
|
|
|
servers.clear();
|
2017-10-29 14:47:36 +03:00
|
|
|
}
|
2017-11-09 23:09:59 +03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-11-20 00:37:12 +03:00
|
|
|
|