trans: 1.basic trans logic. 2.ico res.

This commit is contained in:
2025-06-17 11:48:13 +08:00
parent 33b8a37719
commit 55b530d9f8
16 changed files with 236 additions and 17 deletions

View File

@@ -122,7 +122,12 @@ bool ClientCore::Send(const char* data, qint64 len)
qCritical() << QString("client %1 not connected...").arg(remoteID_);
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)) {
qCritical() << QString("Send data to server failed. %1").arg(socket_->errorString());
return false;

View File

@@ -56,6 +56,8 @@ public:
QMutex conMutex_;
QString ownID_;
QString remoteID_;
QMutex sockMut_;
QTcpSocket* socket_;
QByteArray recvBuffer_;

View File

@@ -2,18 +2,180 @@
FileTrans::FileTrans(ClientCore* clientCore) : clientCore_(clientCore)
{
RegisterFrameCall();
}
void FileTrans::SetTasks(const QVector<TransTask>& tasks)
{
tasks_ = tasks;
localTasks_ = tasks;
}
void FileTrans::RegisterFrameCall()
{
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)
{
// 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;
}

View File

@@ -3,6 +3,7 @@
#include <QFile>
#include <QMap>
#include <QMutex>
#include <QVector>
#include "ClientCore.h"
@@ -18,7 +19,7 @@ struct TransTask {
};
enum class TaskState {
STATE_READY = 0,
STATE_NONE = 0,
STATE_RUNNING,
STATE_FAILED,
STATE_FINISH,
@@ -26,10 +27,25 @@ enum class TaskState {
struct DoTransTask {
QFile file;
TaskState state;
TaskState state = TaskState::STATE_NONE;
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
{
Q_OBJECT
@@ -42,12 +58,30 @@ public:
private:
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:
DoTransTask downTask_;
QVector<TransTask> tasks_;
QMutex lMut_;
QMutex rMut_;
QVector<TransTask> localTasks_;
QVector<TransTask> remoteTasks_;
ClientCore* clientCore_;
QMap<QString, DoTransTask> upTasks_;
QMutex sthMut_;
QVector<QThread*> sendThreads_;
QMap<QString, QThread*> upTasks_;
};
#endif

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16)
cmake_minimum_required(VERSION 3.16)
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
GuiUtil/Public.h GuiUtil/Public.cpp
Control/Transform.h Control/Transform.cpp Control/Transform.ui
../Res/frelay.qrc ../Res/ico.rc
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)

View File

@@ -1,4 +1,4 @@
#include <QApplication>
#include <QApplication>
#include <QFile>
#include "frelayGUI.h"
@@ -12,6 +12,7 @@ int main(int argc, char* argv[])
#ifdef _WIN32
QFont font("Microsoft YaHei", 9);
a.setFont(font);
a.setWindowIcon(QIcon(":/ico/main.ico"));
a.setStyle("Windows");
#endif

View File

@@ -1,10 +1,12 @@
#ifndef PROTOCOL_H
#ifndef PROTOCOL_H
#define PROTOCOL_H
#include <QByteArray>
#include <QSharedPointer>
#include <QString>
constexpr quint32 CHUNK_BUF_SIZE = 1 * 1024 * 1024;
// It is specified here that the first 30 contents (inclusive) are
// used for communication with the server.
// Contents beyond 30 are only forwarded.
@@ -20,13 +22,14 @@ enum FrameBufferType : uint16_t {
FBT_CLI_ASK_HOME,
FBT_CLI_ANS_HOME,
FBT_CLI_REQ_SEND,
FBT_CLI_ANSREQ_SUCCESS,
FBT_CLI_ANSREQ_FAILED,
FBT_CLI_ANSSEND_SUCCESS,
FBT_CLI_ANSSEND_FAILED,
FBT_CLI_REQ_RECV,
FBT_CLI_ANSRECV_SUCCESS,
FBT_CLI_ANSRECV_FAILED,
FBT_CLI_FILETRANS,
FBT_CLI_TRANS_DONE
FBT_CLI_TRANS_DONE,
FBT_CLI_FILETRANS_FAILED
};
struct FrameBuffer {

6
Res/frelay.qrc Normal file
View 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
View File

@@ -0,0 +1 @@
IDI_ICON1 ICON DISCARDABLE "main.ico"

BIN
Res/main.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

1
Res/original/a.svg Normal file
View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
Res/server.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

1
Res/server.rc Normal file
View File

@@ -0,0 +1 @@
IDI_ICON1 ICON DISCARDABLE "server.ico"

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16)
cmake_minimum_required(VERSION 3.16)
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${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 Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Network)

View File

@@ -1,4 +1,4 @@
#ifndef INFO_MSG_H
#ifndef INFO_MSG_H
#define INFO_MSG_H
#include <QBuffer>
@@ -10,15 +10,16 @@
struct InfoMsg {
qint32 mark{};
QString msg;
QString path;
void serialize(QDataStream& data) const
{
data << mark << msg;
data << mark << msg << path;
}
void deserialize(QDataStream& data)
{
data >> mark >> msg;
data >> mark >> msg >> path;
}
};