-
Notifications
You must be signed in to change notification settings - Fork 0
/
tcphandle.cpp
80 lines (64 loc) · 1.92 KB
/
tcphandle.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
#include "tcphandle.h"
#include <QDebug>
TcpHandle::TcpHandle(QObject *parent) : QTcpSocket(parent) {}
TcpHandle::~TcpHandle() {
qDebug() << "Socket destroyed";
}
void TcpHandle::init() {
connect(this, &TcpHandle::readyRead, this, &TcpHandle::truncRead);
connect(this, &TcpHandle::send, this, &TcpHandle::transmit);
connect(this, &TcpHandle::shutdown, this, &TcpHandle::terminate);
}
constexpr int kReadBufferSize = 8192;
void TcpHandle::truncRead() {
// Avoid the case when one socket has large amount to read, which might
// block other sockets from reading/writing.
if (isOpen()) {
receive(read(kReadBufferSize));
}
}
void TcpHandle::transmit(QString msg) {
if (isOpen()) {
write("> ");
// TODO(wentao): figure out a better way to handle the case when
// msg is too large.
write(msg.toUtf8());
write("\r\n"); // for telnet line termination
}
}
void TcpHandle::terminate() {
close();
}
QThread TcpHandleCreator::socketThread_;
TcpHandleCreator::TcpHandleCreator(qintptr socketDescriptor)
: socketDescriptor_(socketDescriptor) {
setAutoDelete(true);
connect(this, &TcpHandleCreator::create, this, &TcpHandleCreator::doCreation);
}
TcpHandleCreator::~TcpHandleCreator() {
qDebug() << "Socket creator destroyed";
}
void TcpHandleCreator::execute() {
if (!socketThread_.isRunning()) {
socketThread_.start();
}
moveToThread(&socketThread_);
emit create();
}
void TcpHandleCreator::doCreation() {
run();
}
void TcpHandleCreator::run() {
TcpHandle *socket = new TcpHandle;
if (socket->setSocketDescriptor(socketDescriptor_)) {
qDebug() << "Initialize the connection to client" << socketDescriptor_;
socket->init();
emit socketReady(socket);
} else {
qDebug() << "Can't initialize the connection to client" << socketDescriptor_;
delete socket;
emit socketFailed();
}
// TODO(wentao): remove this if we are using this class in QThreadPool
deleteLater();
}