forked from Dust1404/Project_LemonPlus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
contestserver.cpp
100 lines (81 loc) · 2.63 KB
/
contestserver.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "contestserver.h"
#include "contestserverworker.h"
#include <QDebug>
ContestServer::ContestServer(QObject *parent) : QTcpServer(parent)
{
this->setMaxPendingConnections(300);
}
ContestServer::ContestServer(QObject *parent, Contest *contest) : QTcpServer(parent)
{
this->contest = contest;
this->setMaxPendingConnections(300);
connect(this, SIGNAL(collectCodeSignal()), this, SLOT(collectCode()));
}
Contest *ContestServer::getContest() const
{
return contest;
}
void ContestServer::setContest(Contest *value)
{
contest = value;
}
void ContestServer::incomingConnection(qintptr socketDescriptor)
{
ContestServerWorker *worker = new ContestServerWorker(nullptr, socketDescriptor);
worker->setServer(this);
worker->moveToThread(workerThread);
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(this, SIGNAL(sendCollectRequest()), worker, SLOT(doCollect()));
connect(this, SIGNAL(stopAllClients()), worker, SLOT(doDisconnect()));
connect(worker, SIGNAL(startCollecting(QString)), this, SLOT(startCollecting(QString)));
connect(worker, SIGNAL(finishCollecting(QString)), this, SLOT(finishCollecting(QString)));
connect(worker, SIGNAL(collectionFailed(QString)), this, SLOT(appendFailure(QString)));
qDebug() << "incoming connection! starting...";
worker->startWorker();
qDebug() << "incoming connection! started.";
}
void ContestServer::startCollecting(const QString &name)
{
emit showStartCollecting(name);
}
void ContestServer::finishCollecting(const QString &name)
{
emit showFinishCollecting(name);
}
void ContestServer::appendFailure(const QString &name)
{
failure.insert(name);
}
void ContestServer::appendOnline(const QString &name) {
onlineContestant.insert(name);
}
void ContestServer::removeOnline(const QString &name)
{
if(isContestantOnline(name))
onlineContestant.erase(onlineContestant.find(name));
}
bool ContestServer::isContestantOnline(const QString &name) {
return onlineContestant.find(name) != onlineContestant.end();
}
int ContestServer::onlineCount() const
{
return onlineContestant.count();
}
void ContestServer::collectCode() {
qDebug() << "collecting code...";
failure.clear();
emit sendCollectRequest();
}
void ContestServer::startServer()
{
workerThread = new QThread();
workerThread->start();
this->listen(QHostAddress::Any, 53667);
}
void ContestServer::stopServer()
{
if(this->onlineCount() != 0)
emit stopAllClients();
this->close();
this->thread()->quit();
}