File: logsegementexportthread.h

package info (click to toggle)
deepin-log-viewer 6.5.8%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,760 kB
  • sloc: cpp: 61,723; ansic: 1,732; xml: 81; sh: 59; makefile: 12
file content (125 lines) | stat: -rw-r--r-- 3,258 bytes parent folder | download | duplicates (2)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// SPDX-FileCopyrightText: 2019 - 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef LOGSEGEMENTEXPORTTHREAD_H
#define LOGSEGEMENTEXPORTTHREAD_H
#include "structdef.h"
#include "WordProcessingMerger.h"
#include <xlsxwriter/workbook.h>

#include <QRunnable>
#include <QObject>
#include <QMutex>
#include <QWaitCondition>

/**
 * @brief The LogSegementExportThread class 导出日志线程类
 */
class LogSegementExportThread : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit LogSegementExportThread(QObject *parent = nullptr);
    ~LogSegementExportThread() override;

    /**
     * @brief The RUN_MODE enum 导出类型,用于执行时判断要执行的逻辑
     */
    enum RUN_MODE {
        UnKnown = -1,
        Txt,
        Html,
        Doc,
        Xls
    };

    // 设置导出数据
    void setParameter(const QString &fileName, const QList<QString> &jList, const QStringList& lables, LOG_FLAG flag);
    // 设置是否追加写入QFile
    void enableAppendWrite(const bool &bEnable = true) { m_bAppendWrite = bEnable; }
    // 设置进度条总值
    void setTotalProcess(const int &total) { m_nTotalProcess = total; }

    // 判断是否正在运行
    bool isProcessing();

public slots:
    // 正常停止,保存数据到文件
    void stop();
    // 强制停止线程,发生在点击进度条取消按钮,或关闭进度条对话框
    void stopImmediately();

protected:
    void run() override;

signals:
    /**
     * @brief sigProgress 导出进度信号
     * @param nCur 当前运行到的进度
     * @param nTotal 要运行的总数
     */
    void sigProgress(int nCur, int nTotal);
    /**
     * @brief sigResult 导出完成信号
     * @param isSuccess 是否成功
     */
    void sigResult(bool isSuccess);
    void sigProcessFull();
    /**
     * @brief sigError 导出失败
     * @param iError 失败信息
     */
    void sigError(QString iError);
private:
    void initDoc();
    QString getDocTemplatePath();
    void initXls();

    bool exportTxt();
    bool exportHtml();
    bool exportToDoc();
    bool exportToXls();

    void htmlEscapeCovert(QString &htmlMsg);

    void saveDoc();
    void closeXls();

private:
    //导出文件路径
    QString m_fileName = "";

    // QFile追加写入标记
    bool m_bAppendWrite = false;

    //导出日志类型
    LOG_FLAG m_flag = NONE;
    //如果导出项文本标题
    QStringList m_labels;
    // 通用json格式日志数据
    QList<QString> m_logDataList;
    //当前线程执行的逻辑种类
    RUN_MODE m_runMode = UnKnown;

    DocxFactory::WordProcessingMerger *m_pDocMerger { nullptr };
    lxw_workbook  *m_pWorkbook { nullptr };
    lxw_worksheet *m_pWorksheet { nullptr };
    qint64 m_currentXlsRow { 0 };
    
    //打开文件错误描述
    QString m_openErroStr = "export open file error";
    //强制停止导出描述信息
    QString m_forceStopStr = "force stop segement export";

    QMutex mutex;
    QWaitCondition condition;
    bool m_bStop { false };
    // 用来强制停止线程
    bool m_bForceStop { false };

    int m_nCurProcess { 0 };
    int m_nTotalProcess { 0 };
};

#endif  // LOGSEGEMENTEXPORTTHREAD_H