-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathRemoteClient.cpp
95 lines (74 loc) · 2.13 KB
/
RemoteClient.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
#include "RemoteClient.hpp"
#include <QTcpSocket>
#include <QDataStream>
RemoteClient::RemoteClient(QTcpSocket *socket, QObject *parent) :
QObject(parent),
m_socket(socket)
{
m_size = 0;
connect(m_socket, SIGNAL(readyRead()),
this, SLOT(onReadyRead()));
}
void RemoteClient::sendMessage(QString message)
{
sendPackage("m:" + message.toUtf8());
}
void RemoteClient::setNickname(QString nickname)
{
m_pendingNickname = nickname;
}
void RemoteClient::sendParticipants(const QList<int> &ids, const QStringList &names)
{
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream << ids.size();
for (int i = 0; i < ids.size(); ++i){
stream << ids[i] << names[i];
}
sendPackage("Participants:" + data);
}
void RemoteClient::sendTunneledMessage(int idFrom, const QByteArray &message)
{
sendPackage("Tunnel:" + QString::number(idFrom).toUtf8() + ":" + message);
}
void RemoteClient::onReadyRead()
{
if (m_size == 0) {
if (m_socket->bytesAvailable() < 4) {
return;
}
QByteArray sizeBytes = m_socket->read(4);
m_size = *(quint32 *)(sizeBytes.constData());
}
if (m_socket->bytesAvailable() < m_size){
return;
}
QByteArray message = m_socket->read(m_size);
m_size = 0;
if(message.startsWith("m:")){
emit messageReceived(message.mid(2));
} else if (message.startsWith("setNickname:")) {
QString nick = message.mid(12);
setNickname(nick);
sendMessage("nickNameStatus:1");
} else if (message.startsWith("getParticipants()")){
emit wantParticipants();
}
if(message.startsWith("Tunnel:")){
QList<QByteArray> splitMessage = message.split(':');
emit tunneledMessageReceived(splitMessage[1].toInt(),splitMessage[2]);
}
if (m_socket->bytesAvailable() > 4){
onReadyRead();
}
}
void RemoteClient::sendPackage(const QByteArray &package)
{
quint32 size = package.size();
m_socket->write((char*)&size, sizeof(size));
m_socket->write(package);
}
QString RemoteClient::nickName()
{
return m_pendingNickname;
}