trans: 1.basic trans logic. 2.ico res.
This commit is contained in:
@@ -122,7 +122,12 @@ bool ClientCore::Send(const char* data, qint64 len)
|
|||||||
qCritical() << QString("client %1 not connected...").arg(remoteID_);
|
qCritical() << QString("client %1 not connected...").arg(remoteID_);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
qint64 bytesWritten = socket_->write(data, len);
|
|
||||||
|
qint64 bytesWritten = -1;
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&sockMut_);
|
||||||
|
bytesWritten = socket_->write(data, len);
|
||||||
|
}
|
||||||
if (bytesWritten == -1 || !socket_->waitForBytesWritten(5000)) {
|
if (bytesWritten == -1 || !socket_->waitForBytesWritten(5000)) {
|
||||||
qCritical() << QString("Send data to server failed. %1").arg(socket_->errorString());
|
qCritical() << QString("Send data to server failed. %1").arg(socket_->errorString());
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ public:
|
|||||||
QMutex conMutex_;
|
QMutex conMutex_;
|
||||||
QString ownID_;
|
QString ownID_;
|
||||||
QString remoteID_;
|
QString remoteID_;
|
||||||
|
|
||||||
|
QMutex sockMut_;
|
||||||
QTcpSocket* socket_;
|
QTcpSocket* socket_;
|
||||||
QByteArray recvBuffer_;
|
QByteArray recvBuffer_;
|
||||||
|
|
||||||
|
|||||||
@@ -2,18 +2,180 @@
|
|||||||
|
|
||||||
FileTrans::FileTrans(ClientCore* clientCore) : clientCore_(clientCore)
|
FileTrans::FileTrans(ClientCore* clientCore) : clientCore_(clientCore)
|
||||||
{
|
{
|
||||||
|
RegisterFrameCall();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTrans::SetTasks(const QVector<TransTask>& tasks)
|
void FileTrans::SetTasks(const QVector<TransTask>& tasks)
|
||||||
{
|
{
|
||||||
tasks_ = tasks;
|
localTasks_ = tasks;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTrans::RegisterFrameCall()
|
void FileTrans::RegisterFrameCall()
|
||||||
{
|
{
|
||||||
clientCore_->SetFrameCall(FBT_CLI_REQ_SEND, [this](QSharedPointer<FrameBuffer> frame) { fbtReqSend(frame); });
|
clientCore_->SetFrameCall(FBT_CLI_REQ_SEND, [this](QSharedPointer<FrameBuffer> frame) { fbtReqSend(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_REQ_RECV, [this](QSharedPointer<FrameBuffer> frame) { fbtReqRecv(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_TRANS_DONE, [this](QSharedPointer<FrameBuffer> frame) { fbtTransDone(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_ANSSEND_SUCCESS, [this](QSharedPointer<FrameBuffer> frame) { fbtAnsSendSuccess(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_ANSSEND_FAILED, [this](QSharedPointer<FrameBuffer> frame) { fbtAnsSendFailed(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_ANSRECV_FAILED, [this](QSharedPointer<FrameBuffer> frame) { fbtAnsRecvFailed(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_ANSRECV_SUCCESS, [this](QSharedPointer<FrameBuffer> frame) { fbtAnsRecvSuccess(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_FILETRANS, [this](QSharedPointer<FrameBuffer> frame) { fbtFileTrans(frame); });
|
||||||
|
clientCore_->SetFrameCall(FBT_CLI_FILETRANS_FAILED, [this](QSharedPointer<FrameBuffer> frame) { fbtFileTransFailed(frame); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
||||||
{
|
{
|
||||||
|
// judget is same client's same file.
|
||||||
|
|
||||||
|
// send
|
||||||
|
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||||
|
auto doTask = QSharedPointer<DoTransTask>::create();
|
||||||
|
doTask->file.setFileName(info.path);
|
||||||
|
if (!doTask->file.open(QIODevice::ReadOnly)) {
|
||||||
|
qCritical() << QString(tr("open file failed: %1")).arg(info.path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
doTask->task.isUpload = true;
|
||||||
|
doTask->task.localPath = info.path;
|
||||||
|
doTask->task.remoteId = frame->fid;
|
||||||
|
SendFile(doTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtReqRecv(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
// recv is single thread recv.
|
||||||
|
|
||||||
|
// judge idle
|
||||||
|
|
||||||
|
// reply msg
|
||||||
|
|
||||||
|
// recv
|
||||||
|
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||||
|
downTask_.file.setFileName(info.path);
|
||||||
|
if (!downTask_.file.open(QIODevice::WriteOnly)) {
|
||||||
|
info.msg = QString(tr("open file failed: %1")).arg(info.path);
|
||||||
|
qCritical() << info.msg;
|
||||||
|
if (!clientCore_->Send<InfoMsg>(info, FBT_CLI_ANSRECV_FAILED, frame->fid)) {
|
||||||
|
qCritical() << QString(tr("open recv file:%2 failed, and reply %2 failed.")).arg(info.msg).arg(frame->fid);
|
||||||
|
downTask_.file.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
info.msg = QString(tr("open recv file success: %1")).arg(info.path);
|
||||||
|
if (!clientCore_->Send<InfoMsg>(info, FBT_CLI_ANSRECV_SUCCESS, frame->fid)) {
|
||||||
|
qCritical() << QString(tr("open recv file:%2 success, but reply %2 failed.")).arg(info.msg).arg(frame->fid);
|
||||||
|
downTask_.file.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
downTask_.state = TaskState::STATE_RUNNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtTransDone(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
auto info = infoUnpack<InfoMsg>(frame->data);
|
||||||
|
if (downTask_.file.isOpen()) {
|
||||||
|
downTask_.file.close();
|
||||||
|
downTask_.state = TaskState::STATE_FINISH;
|
||||||
|
qInfo() << QString(tr("recv file:%1 success.")).arg(downTask_.file.fileName());
|
||||||
|
clientCore_->Send<InfoMsg>(info, FBT_CLI_ANSRECV_SUCCESS, frame->fid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
qCritical() << QString(tr("recv file:%1 done sigal, but file not opened.")).arg(info.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtAnsRecvSuccess(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
// ready to send
|
||||||
|
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||||
|
auto doTask = QSharedPointer<DoTransTask>::create();
|
||||||
|
doTask->file.setFileName(info.path);
|
||||||
|
if (!doTask->file.open(QIODevice::ReadOnly)) {
|
||||||
|
qCritical() << QString(tr("open file failed: %1")).arg(info.path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
doTask->task.isUpload = true;
|
||||||
|
doTask->task.localPath = info.path;
|
||||||
|
doTask->task.remoteId = frame->fid;
|
||||||
|
SendFile(doTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtAnsRecvFailed(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||||
|
qCritical() << QString(tr("request send file:%1 failed. reason:%2")).arg(info.path).arg(info.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtFileTrans(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
if (downTask_.state != TaskState::STATE_RUNNING) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// For the sake of efficiency, not verify the legality of the file
|
||||||
|
auto ws = downTask_.file.write(frame->data.constData(), frame->data.size());
|
||||||
|
if (ws != frame->data.size()) {
|
||||||
|
downTask_.state = TaskState::STATE_FAILED;
|
||||||
|
InfoMsg info;
|
||||||
|
info.msg = downTask_.file.errorString();
|
||||||
|
clientCore_->Send<InfoMsg>(info, FBT_CLI_FILETRANS_FAILED, frame->fid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtAnsSendFailed(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtAnsSendSuccess(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtFileTransFailed(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTrans::SendFile(const QSharedPointer<DoTransTask>& task)
|
||||||
|
{
|
||||||
|
auto* sendThread = new SendThread(clientCore_);
|
||||||
|
sendThread->setTask(task);
|
||||||
|
QMutexLocker locker(&sthMut_);
|
||||||
|
sendThreads_.push_back(sendThread);
|
||||||
|
sendThread->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
SendThread::SendThread(ClientCore* clientCore) : cliCore_(clientCore)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendThread::run()
|
||||||
|
{
|
||||||
|
// task's file shoule be already opened.
|
||||||
|
auto frame = QSharedPointer<FrameBuffer>::create();
|
||||||
|
frame->tid = task_->task.remoteId;
|
||||||
|
frame->type = FBT_CLI_FILETRANS;
|
||||||
|
|
||||||
|
bool suc = true;
|
||||||
|
while (!task_->file.atEnd()) {
|
||||||
|
frame->data.resize(CHUNK_BUF_SIZE);
|
||||||
|
auto br = task_->file.read(frame->data.data(), CHUNK_BUF_SIZE);
|
||||||
|
if (br == -1) {
|
||||||
|
qCritical() << QString(tr("read file failed: %1")).arg(task_->file.errorString());
|
||||||
|
suc = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
frame->data.resize(br);
|
||||||
|
if (!cliCore_->Send(frame)) {
|
||||||
|
qCritical() << QString(tr("send to %1 file failed.")).arg(task_->task.remoteId);
|
||||||
|
suc = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!suc) {
|
||||||
|
task_->file.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendThread::setTask(const QSharedPointer<DoTransTask>& task)
|
||||||
|
{
|
||||||
|
task_ = task;
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
#include <QMutex>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
#include "ClientCore.h"
|
#include "ClientCore.h"
|
||||||
@@ -18,7 +19,7 @@ struct TransTask {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum class TaskState {
|
enum class TaskState {
|
||||||
STATE_READY = 0,
|
STATE_NONE = 0,
|
||||||
STATE_RUNNING,
|
STATE_RUNNING,
|
||||||
STATE_FAILED,
|
STATE_FAILED,
|
||||||
STATE_FINISH,
|
STATE_FINISH,
|
||||||
@@ -26,10 +27,25 @@ enum class TaskState {
|
|||||||
|
|
||||||
struct DoTransTask {
|
struct DoTransTask {
|
||||||
QFile file;
|
QFile file;
|
||||||
TaskState state;
|
TaskState state = TaskState::STATE_NONE;
|
||||||
TransTask task;
|
TransTask task;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SendThread : public QThread
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SendThread(ClientCore* clientCore);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void run() override;
|
||||||
|
void setTask(const QSharedPointer<DoTransTask>& task);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ClientCore* cliCore_;
|
||||||
|
QSharedPointer<DoTransTask> task_;
|
||||||
|
};
|
||||||
|
|
||||||
class FileTrans : public QObject
|
class FileTrans : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -42,12 +58,30 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void fbtReqSend(QSharedPointer<FrameBuffer> frame);
|
void fbtReqSend(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtReqRecv(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtTransDone(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtAnsRecvSuccess(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtAnsRecvFailed(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtFileTrans(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtAnsSendFailed(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtAnsSendSuccess(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void fbtFileTransFailed(QSharedPointer<FrameBuffer> frame);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SendFile(const QSharedPointer<DoTransTask>& task);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DoTransTask downTask_;
|
DoTransTask downTask_;
|
||||||
QVector<TransTask> tasks_;
|
|
||||||
|
QMutex lMut_;
|
||||||
|
QMutex rMut_;
|
||||||
|
QVector<TransTask> localTasks_;
|
||||||
|
QVector<TransTask> remoteTasks_;
|
||||||
|
|
||||||
ClientCore* clientCore_;
|
ClientCore* clientCore_;
|
||||||
QMap<QString, DoTransTask> upTasks_;
|
QMutex sthMut_;
|
||||||
|
QVector<QThread*> sendThreads_;
|
||||||
|
QMap<QString, QThread*> upTasks_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(frelayGUI VERSION ${PROJECT_VERSION} LANGUAGES CXX)
|
project(frelayGUI VERSION ${PROJECT_VERSION} LANGUAGES CXX)
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ Control/ConnectControl.h Control/ConnectControl.cpp Control/ConnectControl.ui
|
|||||||
Control/CompareControl.h Control/CompareControl.cpp Control/CompareControl.ui
|
Control/CompareControl.h Control/CompareControl.cpp Control/CompareControl.ui
|
||||||
GuiUtil/Public.h GuiUtil/Public.cpp
|
GuiUtil/Public.h GuiUtil/Public.cpp
|
||||||
Control/Transform.h Control/Transform.cpp Control/Transform.ui
|
Control/Transform.h Control/Transform.cpp Control/Transform.ui
|
||||||
|
../Res/frelay.qrc ../Res/ico.rc
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
#include "frelayGUI.h"
|
#include "frelayGUI.h"
|
||||||
@@ -12,6 +12,7 @@ int main(int argc, char* argv[])
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
QFont font("Microsoft YaHei", 9);
|
QFont font("Microsoft YaHei", 9);
|
||||||
a.setFont(font);
|
a.setFont(font);
|
||||||
|
a.setWindowIcon(QIcon(":/ico/main.ico"));
|
||||||
a.setStyle("Windows");
|
a.setStyle("Windows");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
#ifndef PROTOCOL_H
|
#ifndef PROTOCOL_H
|
||||||
#define PROTOCOL_H
|
#define PROTOCOL_H
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
constexpr quint32 CHUNK_BUF_SIZE = 1 * 1024 * 1024;
|
||||||
|
|
||||||
// It is specified here that the first 30 contents (inclusive) are
|
// It is specified here that the first 30 contents (inclusive) are
|
||||||
// used for communication with the server.
|
// used for communication with the server.
|
||||||
// Contents beyond 30 are only forwarded.
|
// Contents beyond 30 are only forwarded.
|
||||||
@@ -20,13 +22,14 @@ enum FrameBufferType : uint16_t {
|
|||||||
FBT_CLI_ASK_HOME,
|
FBT_CLI_ASK_HOME,
|
||||||
FBT_CLI_ANS_HOME,
|
FBT_CLI_ANS_HOME,
|
||||||
FBT_CLI_REQ_SEND,
|
FBT_CLI_REQ_SEND,
|
||||||
FBT_CLI_ANSREQ_SUCCESS,
|
FBT_CLI_ANSSEND_SUCCESS,
|
||||||
FBT_CLI_ANSREQ_FAILED,
|
FBT_CLI_ANSSEND_FAILED,
|
||||||
FBT_CLI_REQ_RECV,
|
FBT_CLI_REQ_RECV,
|
||||||
FBT_CLI_ANSRECV_SUCCESS,
|
FBT_CLI_ANSRECV_SUCCESS,
|
||||||
FBT_CLI_ANSRECV_FAILED,
|
FBT_CLI_ANSRECV_FAILED,
|
||||||
FBT_CLI_FILETRANS,
|
FBT_CLI_FILETRANS,
|
||||||
FBT_CLI_TRANS_DONE
|
FBT_CLI_TRANS_DONE,
|
||||||
|
FBT_CLI_FILETRANS_FAILED
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FrameBuffer {
|
struct FrameBuffer {
|
||||||
|
|||||||
6
Res/frelay.qrc
Normal file
6
Res/frelay.qrc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/ico">
|
||||||
|
<file>main.ico</file>
|
||||||
|
<file>server.ico</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
1
Res/ico.rc
Normal file
1
Res/ico.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
IDI_ICON1 ICON DISCARDABLE "main.ico"
|
||||||
BIN
Res/main.ico
Normal file
BIN
Res/main.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
1
Res/original/a.svg
Normal file
1
Res/original/a.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"><g id="_x30_9_Data_Arrow"><g><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="285.4657" y1="-213.8134" x2="226.0711" y2="890.926"><stop offset="0" style="stop-color:#EAE9FE"/><stop offset="0.4236" style="stop-color:#EEEEFE"/><stop offset="0.8967" style="stop-color:#FBFBFF"/><stop offset="1" style="stop-color:#FFFFFF"/></linearGradient><path style="fill:url(#SVGID_1_);" d="M472.505,264.418c-9.665-7.52-21.338-14-25.833-25.391 c-6.113-15.491,3.658-32.115,9.42-47.74c17.595-47.708-4.987-104.205-45.503-134.932c-77.292-58.617-228.168-38.07-249.252,42.947 c-8.919,34.273,7.061,73.374-9.288,104.789c-20.628,39.638-75.349,42.311-110.593,59.937 c-43.663,21.836-52.4,69.384-21.085,105.584c11.499,13.293,26.213,22.45,36.759,36.974c15.26,21.015,23.818,44.254,44.235,61.589 c28.751,24.41,76.818,30.462,102.271,2.631c14.332-15.672,18.996-38.763,34.641-53.126c20.594-18.906,53.143-16.363,79.349-6.627 c26.206,9.736,50.51,25.457,78.113,29.887c43.157,6.927,89.432-18.396,106.864-58.48 C520.036,342.376,507.002,291.261,472.505,264.418z"/><path style="fill:#2769FD;" d="M351.196,227.774V202.38l-315.133,0c-13.683,0-24.775-11.092-24.775-24.775v-73.828 c0-13.683,11.092-24.775,24.775-24.775l315.133,0V53.608c0-16.475,18.953-25.641,31.835-15.484l110.247,87.207 c9.91,7.804,9.91,22.916,0,30.72l-110.247,87.207C370.149,253.415,351.196,244.249,351.196,227.774z"/><path style="fill:#FF5859;" d="M160.804,458.392v-25.395l315.133,0c13.683,0,24.775-11.092,24.775-24.775v-73.828 c0-13.683-11.092-24.775-24.775-24.775l-315.133,0v-25.395c0-16.475-18.953-25.641-31.835-15.484L18.722,355.949 c-9.91,7.804-9.91,22.916,0,30.72l110.247,87.207C141.851,484.033,160.804,474.867,160.804,458.392z"/><path style="fill:#332E8E;" d="M36.065,207.28h310.23v20.493c0,9.513,5.307,17.998,13.852,22.141 c8.43,4.09,18.377,3.139,25.927-2.813l110.236-87.199c5.913-4.656,9.302-11.657,9.302-19.212s-3.389-14.556-9.292-19.204 L386.068,34.273c-7.451-5.87-17.388-6.952-25.921-2.805c-8.546,4.145-13.852,12.629-13.852,22.14v20.493H36.065 c-16.364,0-29.677,13.313-29.677,29.677v73.827C6.388,193.969,19.701,207.28,36.065,207.28z M16.191,103.778 c0-10.958,8.916-19.874,19.874-19.874h315.131c2.706,0,4.901-2.194,4.901-4.901V53.608c0-5.811,3.114-10.791,8.329-13.32 c5.214-2.529,11.032-1.894,15.566,1.679l110.255,87.215c3.536,2.784,5.562,6.979,5.562,11.509s-2.026,8.724-5.572,11.517 l-110.239,87.201c-4.538,3.58-10.358,4.215-15.572,1.686c-5.214-2.529-8.329-7.509-8.329-13.321v-25.395 c0-2.708-2.195-4.901-4.901-4.901H36.065c-10.958,0-19.874-8.914-19.874-19.872V103.778z"/><path style="fill:#332E8E;" d="M15.68,390.513l110.252,87.214c7.477,5.891,17.416,6.935,25.921,2.805 c8.546-4.145,13.852-12.629,13.852-22.14v-20.493h310.23c16.364,0,29.677-13.312,29.677-29.675v-73.829 c0-16.364-13.313-29.675-29.677-29.675h-310.23v-20.493c0-9.513-5.307-17.998-13.852-22.141 c-8.542-4.144-18.476-3.065-25.927,2.813L15.69,352.098c-5.913,4.656-9.302,11.657-9.302,19.212S9.777,385.865,15.68,390.513z M21.763,359.793l110.239-87.201c4.435-3.499,10.244-4.27,15.572-1.686c5.214,2.529,8.329,7.509,8.329,13.321v25.395 c0,2.708,2.195,4.901,4.901,4.901h315.131c10.958,0,19.874,8.914,19.874,19.872v73.829c0,10.958-8.916,19.872-19.874,19.872 H160.804c-2.706,0-4.901,2.194-4.901,4.901v25.395c0,5.811-3.114,10.791-8.329,13.32c-5.214,2.532-11.032,1.895-15.566-1.679 L21.753,382.818c-3.536-2.784-5.562-6.979-5.562-11.509S18.217,362.585,21.763,359.793z"/></g></g><g id="Layer_1"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
1
Res/original/b.svg
Normal file
1
Res/original/b.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 6.0 KiB |
BIN
Res/server.ico
Normal file
BIN
Res/server.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
1
Res/server.rc
Normal file
1
Res/server.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
IDI_ICON1 ICON DISCARDABLE "server.ico"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(frelayServer LANGUAGES CXX)
|
project(frelayServer LANGUAGES CXX)
|
||||||
|
|
||||||
@@ -12,6 +12,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|||||||
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network)
|
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network)
|
||||||
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network)
|
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network)
|
||||||
|
|
||||||
add_executable(frelayServer Server.h Server.cpp main.cpp)
|
add_executable(frelayServer Server.h Server.cpp main.cpp ../Res/server.rc)
|
||||||
target_link_libraries(frelayServer PRIVATE Protocol Util)
|
target_link_libraries(frelayServer PRIVATE Protocol Util)
|
||||||
target_link_libraries(frelayServer PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Network)
|
target_link_libraries(frelayServer PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Network)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#ifndef INFO_MSG_H
|
#ifndef INFO_MSG_H
|
||||||
#define INFO_MSG_H
|
#define INFO_MSG_H
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
@@ -10,15 +10,16 @@
|
|||||||
struct InfoMsg {
|
struct InfoMsg {
|
||||||
qint32 mark{};
|
qint32 mark{};
|
||||||
QString msg;
|
QString msg;
|
||||||
|
QString path;
|
||||||
|
|
||||||
void serialize(QDataStream& data) const
|
void serialize(QDataStream& data) const
|
||||||
{
|
{
|
||||||
data << mark << msg;
|
data << mark << msg << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deserialize(QDataStream& data)
|
void deserialize(QDataStream& data)
|
||||||
{
|
{
|
||||||
data >> mark >> msg;
|
data >> mark >> msg >> path;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user