Files
frelay/Gui/Form/Transform.cpp

254 lines
6.7 KiB
C++
Raw Normal View History

2025-06-16 23:41:35 +08:00
#include "Transform.h"
2025-06-18 13:18:31 +08:00
#include <QFileInfo>
2025-06-16 20:06:49 +08:00
#include <QMessageBox>
#include "ui_Transform.h"
TransForm::TransForm(QWidget* parent) : QDialog(parent), ui(new Ui::TransForm)
{
ui->setupUi(this);
2025-06-18 14:53:56 +08:00
setWindowTitle(tr("传输详情"));
2025-06-20 09:45:39 +08:00
ui->edFrom->setReadOnly(true);
ui->edTo->setReadOnly(true);
ui->pedFrom->setReadOnly(true);
ui->pedTo->setReadOnly(true);
ui->edTask->setReadOnly(true);
2025-06-18 14:53:56 +08:00
connect(this, &TransForm::sigProgress, this, &TransForm::setProgress);
connect(this, &TransForm::sigDone, this, &TransForm::handleDone);
connect(this, &TransForm::sigFailed, this, &TransForm::handleFailed);
connect(this, &TransForm::sigSetUi, this, &TransForm::handleUI);
2025-06-20 09:45:39 +08:00
connect(this, &TransForm::sigTaskNum, this, &TransForm::showNum);
2025-06-16 20:06:49 +08:00
}
TransForm::~TransForm()
{
2025-06-19 17:01:25 +08:00
exis_ = true;
QThread::msleep(10);
2025-06-16 20:06:49 +08:00
delete ui;
}
void TransForm::SetClientCore(ClientCore* clientCore)
{
clientCore_ = clientCore;
2025-06-18 13:18:31 +08:00
fileTrans_ = new FileTrans(clientCore_);
connect(ui->btnCancel, &QPushButton::clicked, this, [this]() {
fileTrans_->Interrupt(true);
close();
});
2025-06-18 13:18:31 +08:00
}
void TransForm::SetTasks(const QVector<TransTask>& tasks)
{
tasks_ = tasks;
2025-06-19 22:07:12 +08:00
exis_ = false;
2025-06-18 13:18:31 +08:00
}
void TransForm::startTask()
{
2025-06-20 09:45:39 +08:00
qInfo() << "TransForm::startTask enter....";
curTaskNum_ = 0;
2025-06-18 13:18:31 +08:00
for (auto& task : tasks_) {
2025-06-20 09:45:39 +08:00
QString str = QString(tr("%1/%2")).arg(curTaskNum_).arg(tasks_.size());
emit sigTaskNum(str);
emit sigSetUi(task);
2025-06-18 14:53:56 +08:00
if (task.isUpload) {
fileTrans_->ReqSendFile(task);
while (true) {
2025-06-19 17:01:25 +08:00
if (exis_) {
return;
}
2025-06-18 14:53:56 +08:00
auto progress = fileTrans_->GetSendProgress();
if (progress < 0) {
emit sigFailed();
2025-06-18 14:53:56 +08:00
break;
}
if (progress >= 100.0) {
emit sigDone();
2025-06-18 14:53:56 +08:00
break;
}
emit sigProgress(progress);
QThread::msleep(1);
2025-06-18 14:53:56 +08:00
}
} else {
fileTrans_->ReqDownFile(task);
while (true) {
2025-06-19 17:01:25 +08:00
if (exis_) {
return;
}
2025-06-18 14:53:56 +08:00
auto progress = fileTrans_->GetDownProgress();
if (progress < 0) {
emit sigFailed();
2025-06-18 14:53:56 +08:00
break;
}
if (progress >= 100.0) {
emit sigDone();
2025-06-18 14:53:56 +08:00
break;
}
emit sigProgress(progress);
QThread::msleep(1);
2025-06-18 14:53:56 +08:00
}
}
2025-06-20 09:45:39 +08:00
++curTaskNum_;
str = QString(tr("%1/%2")).arg(curTaskNum_).arg(tasks_.size());
emit sigTaskNum(str);
2025-06-18 14:53:56 +08:00
}
2025-06-19 22:07:12 +08:00
tasks_.clear();
2025-06-20 09:45:39 +08:00
qInfo() << "TransForm::startTask exit....";
2025-06-18 14:53:56 +08:00
}
void TransForm::setProgress(double val)
{
ui->progressBar->setValue(val);
}
void TransForm::handleFailed()
{
ui->progressBar->setValue(0);
}
void TransForm::handleDone()
{
2025-06-19 22:31:34 +08:00
ui->progressBar->setValue(100);
2025-06-18 14:53:56 +08:00
}
void TransForm::handleUI(const TransTask& task)
{
if (task.isUpload) {
ui->edFrom->setText(task.localId);
ui->edTo->setText(task.remoteId);
ui->pedFrom->setPlainText(task.localPath);
ui->pedTo->setPlainText(task.remotePath);
2025-06-19 17:01:25 +08:00
} else {
2025-06-29 17:31:17 +08:00
ui->edFrom->setText(task.remoteId);
ui->edTo->setText(task.localId);
2025-06-18 14:53:56 +08:00
ui->pedFrom->setPlainText(task.remotePath);
ui->pedTo->setPlainText(task.localPath);
2025-06-18 13:18:31 +08:00
}
}
2025-06-20 09:45:39 +08:00
void TransForm::showNum(const QString& data)
{
ui->edTask->setText(data);
}
2025-06-18 13:18:31 +08:00
void TransForm::showEvent(QShowEvent* event)
{
QDialog::showEvent(event);
2025-06-18 17:22:15 +08:00
workTh_ = new TranFromTh(this, this);
2025-06-20 09:45:39 +08:00
// fileTrans_->moveToThread(workTh_);
2025-06-19 22:07:12 +08:00
connect(workTh_, &QThread::finished, workTh_, &QObject::deleteLater);
2025-06-18 14:53:56 +08:00
workTh_->start();
2025-06-16 20:06:49 +08:00
}
2025-06-19 22:07:12 +08:00
void TransForm::closeEvent(QCloseEvent* event)
{
exis_ = true;
2025-06-20 09:45:39 +08:00
QDialog::closeEvent(event);
2025-06-19 22:07:12 +08:00
}
CheckCondition::CheckCondition(QObject* parent) : QThread(parent)
{
}
void CheckCondition::SetClientCore(ClientCore* clientCore)
{
clientCore_ = clientCore;
}
void CheckCondition::SetTasks(const QVector<TransTask>& tasks)
{
tasks_ = tasks;
}
QVector<TransTask> CheckCondition::GetTasks() const
2025-11-06 23:36:55 +08:00
{
return tasks_;
2025-11-06 23:36:55 +08:00
}
void CheckCondition::recvFrame(QSharedPointer<FrameBuffer> frame)
{
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
2025-11-05 23:09:37 +08:00
if (info.command == STRMSG_AC_ANSWER_FILE_EXIST) {
for (auto& item : info.mapData) {
auto it =
std::find_if(tasks_.begin(), tasks_.end(), [&item](const TransTask& task) { return task.taskUUID == item.uuid; });
if (it == tasks_.end()) {
continue;
}
it->remoteCheckState = static_cast<FileCheckState>(item.state);
}
2025-11-06 23:12:13 +08:00
qInfo() << tr("检查结束......");
msg_ = info.command;
return;
}
msg_ = tr("收到未知信息,认为判断失败:") + info.command;
qInfo() << msg_;
}
void CheckCondition::interrupCheck()
{
if (!isAlreadyInter_) {
isAlreadyInter_ = true;
qWarning() << tr("中断文件校验......");
emit sigCheckOver();
}
}
void CheckCondition::run()
{
qInfo() << tr("开始文件校验......");
isRun_ = true;
msg_.clear();
isAlreadyInter_ = false;
// 先检查本地文件是否存在
2025-11-06 23:12:13 +08:00
for (auto& task : tasks_) {
if (task.isUpload && !Util::FileExist(task.localPath)) {
2025-11-06 23:12:13 +08:00
task.localCheckState = FCS_FILE_NOT_EXIST;
}
if (!task.isUpload) {
if (!Util::DirExist(task.localPath, false)) {
task.localCheckState = FCS_DIR_NOT_EXIST;
} else if (Util::FileExist(Util::Get2FilePath(task.remotePath, task.localPath))) {
task.localCheckState = FCS_FILE_EXIST;
}
}
}
// 再检查远程文件是否存在
InfoMsg msg;
2025-11-05 23:09:37 +08:00
msg.command = STRMSG_AC_CHECK_FILE_EXIST;
for (auto& task : tasks_) {
msg.mapData[task.taskUUID].uuid = task.taskUUID;
msg.mapData[task.taskUUID].command = task.isUpload ? STRMSG_AC_UP : STRMSG_AC_DOWN;
msg.mapData[task.taskUUID].localPath = task.localPath;
msg.mapData[task.taskUUID].remotePath = task.remotePath;
}
auto f = clientCore_->GetBuffer(msg, FBT_MSGINFO_ASK, clientCore_->GetRemoteID());
if (!ClientCore::syncInvoke(clientCore_, f)) {
auto errMsg = tr("检查远程文件存在性数据发送失败。");
emit sigCheckOver();
qCritical() << errMsg;
return;
}
while (isRun_) {
QThread::msleep(10);
if (msg_.isEmpty()) {
continue;
}
break;
}
isAlreadyInter_ = true;
emit sigCheckOver();
qInfo() << tr("文件校验结束......");
}