-
Notifications
You must be signed in to change notification settings - Fork 0
/
ftpserver.cpp
90 lines (71 loc) · 3.16 KB
/
ftpserver.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
#include "ftpserver.h"
FTPServer::FTPServer(QObject *parent) : QTcpServer(parent){
socket = new QTcpSocket;
listen(QHostAddress::LocalHost, SERVER_PORT);
connections.clear();
connect(socket, SIGNAL(readyRead()), SLOT(serverSocketReading()));
}
void FTPServer::incomingConnection(qintptr handle){
static bool isServerConected = false;
if(!isServerConected){
socket->setSocketDescriptor(handle);
isServerConected = true;
close();
listen(QHostAddress::Any, CLIENTS_PORT);
}
else{
connections.insert(handle, new Connection(handle));
connect(connections.value(handle), SIGNAL(disconnected(qintptr)), SLOT(deleteConnection(qintptr)));
connect(connections.value(handle), SIGNAL(sendToServer(QByteArray)), SLOT(sendToServer(QByteArray)));
}
}
void FTPServer::deleteConnection(qintptr handle){
connections.erase(connections.find(handle));
}
void FTPServer::sendToServer(QByteArray message){
socket->write(message);
}
void FTPServer::serverSocketReading(){
QByteArray receivedObject = socket->readAll();
QJsonObject response;
QJsonObject request = QJsonDocument::fromJson(receivedObject).object();
if(request.value("Target").toString() == "Post"){
Connection *connection = connections.value(request.value("Socket handle").toInt());
response.insert("Target", "Post");
response.insert("Value", request.value("Value").toString());
if(request.value("Value").toString() == "Allow"){
response.insert("Location", request.value("Location").toString());
QString filePath = request.value("Location").toString() + '/';
QString extension = connection->getExtension();
if(extension == "jpg" || extension == "png" || extension == "bmp"
|| extension == "jpeg" || extension == "jpe" || extension == "image")
filePath += "Images/";
else if(extension == "mp3")
filePath += "Audio/";
else
filePath += "Documents/";
filePath += QString::number(request.value("ID").toInt()) + '_' +
QString::number(QDateTime::currentDateTime().toTime_t()) + '.' + connection->getExtension();
if(filePath.indexOf("/Avatars") != -1){
QStringList list = filePath.split("/");
filePath = list.at(0) + "/" + list.at(1) + "/Images/Avatars/" + list.back();
}
connection->setFilePath(filePath);
}
connection->send(QJsonDocument(response).toJson());
}
else if(request.value("Target").toString() == "Get"){
Connection *connection = connections.value(request.value("Socket handle").toInt());
if(request.value("Value").toString() == "Deny"){
response.insert("Target", "Get");
response.insert("Value", request.value("Value").toString());
connection->send(QJsonDocument(response).toJson());
}
else{
QFile file(request.value("Reference").toString());
file.open(QIODevice::ReadOnly);
connection->send(file.readAll());
file.close();
}
}
}