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
|
#include "getfiletreeoperation.h"
#include "flipperzero/devicestate.h"
#include "flipperzero/protobufsession.h"
#include "flipperzero/rpc/storagelistoperation.h"
using namespace Flipper;
using namespace Zero;
GetFileTreeOperation::GetFileTreeOperation(ProtobufSession *rpc, DeviceState *deviceState, const QByteArray &rootPath, QObject *parent):
AbstractUtilityOperation(rpc, deviceState, parent),
m_rootPath(rootPath),
m_pendingCount(0)
{}
const QString GetFileTreeOperation::description() const
{
return QStringLiteral("Get File Tree @%1").arg(deviceState()->name());
}
const FileInfoList &GetFileTreeOperation::files() const
{
return m_result;
}
void GetFileTreeOperation::nextStateLogic()
{
if(operationState() == BasicOperationState::Ready) {
setOperationState(State::Running);
listDirectory(m_rootPath);
} else if(operationState() == State::Running) {
--m_pendingCount;
auto *op = qobject_cast<StorageListOperation*>(sender());
if(op->isError()) {
finishWithError(op->error(), op->errorString());
return;
}
for(const auto &fileInfo : qAsConst(op->files())) {
if(fileInfo.type == FileType::Directory) {
listDirectory(fileInfo.absolutePath);
}
m_result.push_back(fileInfo);
}
if(!m_pendingCount) {
finish();
}
}
}
void GetFileTreeOperation::listDirectory(const QByteArray &path)
{
++m_pendingCount;
auto *op = rpc()->storageList(path);
connect(op, &AbstractOperation::finished, this, &GetFileTreeOperation::nextStateLogic);
}
|