File indexing completed on 2024-05-12 05:50:20

0001 /*
0002     SPDX-FileCopyrightText: 2022 Ilya Pominov <ipominov@astralinux.ru>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef CLIPLUGIN_H
0008 #define CLIPLUGIN_H
0009 
0010 #include "cliinterface.h"
0011 
0012 using namespace Kerfuffle;
0013 
0014 struct ArjFileEntry;
0015 
0016 class CliPlugin : public Kerfuffle::CliInterface
0017 {
0018     Q_OBJECT
0019 
0020 public:
0021     explicit CliPlugin(QObject *parent, const QVariantList &args);
0022     ~CliPlugin() override;
0023 
0024     bool addFiles(const QVector<Kerfuffle::Archive::Entry *> &files,
0025                   const Kerfuffle::Archive::Entry *destination,
0026                   const Kerfuffle::CompressionOptions &options,
0027                   uint numberOfEntriesToAdd = 0) override;
0028     bool
0029     moveFiles(const QVector<Kerfuffle::Archive::Entry *> &files, Kerfuffle::Archive::Entry *destination, const Kerfuffle::CompressionOptions &options) override;
0030 
0031     void resetParsing() override;
0032     bool readListLine(const QString &line) override;
0033     bool readExtractLine(const QString &line) override;
0034     bool isFileExistsMsg(const QString &line) override;
0035     bool isFileExistsFileName(const QString &line) override;
0036     bool isNewMovedFileNamesMsg(const QString &line) override;
0037 
0038 protected:
0039     bool handleLine(const QString &line) override;
0040 
0041 protected Q_SLOTS:
0042     void processFinished(int exitCode, QProcess::ExitStatus exitStatus) override;
0043 
0044 private:
0045     enum ParseState {
0046         ParseStateTitle,
0047         ParseStateProcessing,
0048         ParseStateArchiveDateTime,
0049         ParseStateArchiveComments,
0050         ParseStateEntryFileHeader,
0051         ParseStateEntryFileName,
0052         ParseStateEntryFileProperty,
0053         ParseStateEntryFileDTA,
0054         ParseStateEntryFileDTC,
0055         ParseStateEntryTotal,
0056     } m_parseState;
0057 
0058     void setupCliProperties();
0059     void ignoreLines(int lines, ParseState nextState);
0060     bool tryAddCurFileProperties(const QString &line);
0061     bool tryAddCurFileComment(const QString &line);
0062     void sendCurFileEntry();
0063     bool readLine(const QString &line);
0064 
0065     int m_remainingIgnoreLines = 0;
0066     QStringList m_headerComment;
0067     QScopedPointer<ArjFileEntry> m_currentParsedFile;
0068     bool m_testPassed = true;
0069     QVector<Archive::Entry *> m_renamedFiles;
0070 };
0071 
0072 #endif // CLIPLUGIN_H