初步完成文件夹传输。
This commit is contained in:
@@ -12,6 +12,9 @@ void ClientCore::Instance()
|
||||
socket_ = new QTcpSocket(this);
|
||||
connect(socket_, &QTcpSocket::readyRead, this, &ClientCore::onReadyRead);
|
||||
connect(socket_, &QTcpSocket::disconnected, this, &ClientCore::onDisconnected);
|
||||
clearWaitTimer_ = new QTimer(this);
|
||||
clearWaitTimer_->setInterval(10000);
|
||||
connect(clearWaitTimer_, &QTimer::timeout, this, [this]() { clearWaitTask(); });
|
||||
}
|
||||
|
||||
ClientCore::~ClientCore()
|
||||
@@ -145,11 +148,79 @@ void ClientCore::handleAsk(QSharedPointer<FrameBuffer> frame)
|
||||
// 这个请求的处理可能是耗时的,需要开线程处理。
|
||||
if (msg.command == STRMSG_AC_ALL_DIRFILES) {
|
||||
msg.command = STRMSG_AC_ANSWER_ALL_DIRFILES;
|
||||
QMutexLocker locker(&waitTaskMut_);
|
||||
if (waitTask_.contains(frame->fid)) {
|
||||
msg.msg = STRMSG_ST_COMMAND_ALREADY_RUNNING;
|
||||
if (!Send<InfoMsg>(msg, FBT_MSGINFO_ANSWER, frame->fid)) {
|
||||
auto logMsg = tr("给") + frame->fid + tr("返回获取文件列表结果消息失败。");
|
||||
qCritical() << logMsg;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
waitTask_[frame->fid] = WaitTask();
|
||||
auto& wt = waitTask_[frame->fid];
|
||||
QString fid = frame->fid;
|
||||
wt.wo = new WaitOperOwn(this);
|
||||
wt.wo->SetClient(this);
|
||||
wt.wo->fid = fid;
|
||||
wt.wo->infoMsg_ = msg;
|
||||
wt.wo->func_ = [this, &wt, fid]() {
|
||||
auto& infoMsg = wt.wo->infoMsg_;
|
||||
infoMsg.command = STRMSG_AC_ANSWER_ALL_DIRFILES;
|
||||
bool success = false;
|
||||
//infoMsg.infos.clear();
|
||||
for (auto& item : infoMsg.infos.keys()) {
|
||||
auto fullDir = Util::Join(infoMsg.fst.root, item);
|
||||
if (!DirFileHelper::GetAllFiles(fullDir, infoMsg.list)) {
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
auto& vec = infoMsg.infos[item];
|
||||
for (const auto& dd : std::as_const(infoMsg.list)) {
|
||||
FileStruct fst;
|
||||
fst.root = infoMsg.fst.root;
|
||||
fst.mid = item;
|
||||
fst.relative = dd;
|
||||
vec.push_back(fst);
|
||||
}
|
||||
}
|
||||
return success;
|
||||
};
|
||||
wt.wo->start();
|
||||
}
|
||||
return;
|
||||
}
|
||||
// 未知信息
|
||||
qWarning() << QString(tr("未知询问信息类型:%1")).arg(msg.command);
|
||||
}
|
||||
|
||||
void ClientCore::clearWaitTask()
|
||||
{
|
||||
QMutexLocker locker(&waitTaskMut_);
|
||||
QList<QString> completedTasks;
|
||||
|
||||
for (auto it = waitTask_.begin(); it != waitTask_.end(); ++it) {
|
||||
WaitTask& task = it.value();
|
||||
if (task.wo && task.wo->isFinished()) {
|
||||
completedTasks.append(it.key());
|
||||
}
|
||||
}
|
||||
|
||||
for (const QString& taskId : completedTasks) {
|
||||
auto it = waitTask_.find(taskId);
|
||||
if (it != waitTask_.end()) {
|
||||
WaitTask& task = it.value();
|
||||
if (task.wo) {
|
||||
task.wo->wait();
|
||||
delete task.wo;
|
||||
task.wo = nullptr;
|
||||
}
|
||||
waitTask_.erase(it);
|
||||
qDebug() << "清理完成的任务:" << taskId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
||||
{
|
||||
switch (frame->type) {
|
||||
@@ -430,13 +501,12 @@ void WaitOper::run()
|
||||
isRun_ = true;
|
||||
recvMsg_ = false;
|
||||
|
||||
InfoMsg msg;
|
||||
msg.command = sendStrType_;
|
||||
msg.fromPath = stra_;
|
||||
msg.toPath = strb_;
|
||||
msg.type = type_;
|
||||
infoMsg_.command = sendStrType_;
|
||||
infoMsg_.fromPath = stra_;
|
||||
infoMsg_.toPath = strb_;
|
||||
infoMsg_.type = type_;
|
||||
|
||||
auto f = cli_->GetBuffer<InfoMsg>(msg, FBT_MSGINFO_ASK, cli_->GetRemoteID());
|
||||
auto f = cli_->GetBuffer<InfoMsg>(infoMsg_, FBT_MSGINFO_ASK, cli_->GetRemoteID());
|
||||
if (!ClientCore::syncInvoke(cli_, f)) {
|
||||
auto errMsg = QString(tr("向%1发送%2请求失败。")).arg(cli_->GetRemoteID()).arg(sendStrType_);
|
||||
emit sigCheckOver();
|
||||
@@ -473,7 +543,12 @@ void WaitOper::SetPath(const QString& stra, const QString& strb, const QString&
|
||||
type_ = type;
|
||||
}
|
||||
|
||||
InfoMsg WaitOper::GetMsg() const
|
||||
InfoMsg WaitOper::GetMsgConst() const
|
||||
{
|
||||
return infoMsg_;
|
||||
}
|
||||
|
||||
InfoMsg& WaitOper::GetMsgRef()
|
||||
{
|
||||
return infoMsg_;
|
||||
}
|
||||
@@ -502,12 +577,19 @@ WaitOperOwn::WaitOperOwn(QObject* parent) : WaitThread(parent)
|
||||
|
||||
void WaitOperOwn::run()
|
||||
{
|
||||
auto execRet = false;
|
||||
if (func_) {
|
||||
func_();
|
||||
execRet = func_();
|
||||
}
|
||||
if (!fid.isEmpty()) {
|
||||
if (!cli_->syncInvoke(cli_, cli_->GetBuffer<InfoMsg>(infoMsg_, FBT_MSGINFO_ANSWER, fid))) {
|
||||
qCritical() << QString(tr("向%1发送%2请求失败。")).arg(fid).arg(infoMsg_.command);
|
||||
}
|
||||
}
|
||||
emit sigOver();
|
||||
}
|
||||
|
||||
void WaitOperOwn::recvFrame(QSharedPointer<FrameBuffer> frame)
|
||||
{
|
||||
qDebug() << "不应该被调用的地方:" << __FUNCTION__;
|
||||
}
|
||||
|
||||
@@ -15,8 +15,14 @@
|
||||
#include <QReadWriteLock>
|
||||
#include <QTcpSocket>
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include <array>
|
||||
|
||||
class WaitOperOwn;
|
||||
struct WaitTask {
|
||||
QString id;
|
||||
WaitOperOwn* wo;
|
||||
};
|
||||
class ClientCore : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -93,6 +99,7 @@ private:
|
||||
void onReadyRead();
|
||||
void onDisconnected();
|
||||
void handleAsk(QSharedPointer<FrameBuffer> frame);
|
||||
void clearWaitTask();
|
||||
|
||||
private:
|
||||
void UseFrame(QSharedPointer<FrameBuffer> frame);
|
||||
@@ -121,6 +128,10 @@ public:
|
||||
|
||||
bool connected_{false};
|
||||
LocalFile localFile_;
|
||||
|
||||
QTimer* clearWaitTimer_{};
|
||||
QMutex waitTaskMut_;
|
||||
QMap<QString, WaitTask> waitTask_;
|
||||
};
|
||||
|
||||
// 工作线程。
|
||||
@@ -194,7 +205,8 @@ public:
|
||||
void run() override;
|
||||
void SetType(const QString& sendType, const QString& ansType);
|
||||
void SetPath(const QString& stra, const QString& strb, const QString& type);
|
||||
InfoMsg GetMsg() const;
|
||||
InfoMsg GetMsgConst() const;
|
||||
InfoMsg& GetMsgRef();
|
||||
void interrupCheck() override;
|
||||
void recvFrame(QSharedPointer<FrameBuffer> frame) override;
|
||||
|
||||
@@ -224,8 +236,9 @@ public:
|
||||
void recvFrame(QSharedPointer<FrameBuffer> frame) override;
|
||||
|
||||
public:
|
||||
QString fid;
|
||||
InfoMsg infoMsg_{};
|
||||
std::function<void()> func_;
|
||||
std::function<bool()> func_;
|
||||
};
|
||||
|
||||
#endif // CLIENTCORE_H
|
||||
Reference in New Issue
Block a user