File: problemcollector.h

package info (click to toggle)
gammaray 3.1.0%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 24,796 kB
  • sloc: cpp: 109,174; ansic: 2,156; sh: 336; python: 274; yacc: 90; lex: 82; xml: 61; makefile: 28; javascript: 9; ruby: 5
file content (122 lines) | stat: -rw-r--r-- 3,300 bytes parent folder | download | duplicates (3)
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
/*
  problemcollector.h

  This file is part of GammaRay, the Qt application inspection and manipulation tool.

  SPDX-FileCopyrightText: 2018 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
  Author: Anton Kreuzkamp <anton.kreuzkamp@kdab.com>

  SPDX-License-Identifier: GPL-2.0-or-later

  Contact KDAB at <info@kdab.com> for commercial licensing options.
*/

#ifndef GAMMARAY_PROBLEMCOLLECTOR_H
#define GAMMARAY_PROBLEMCOLLECTOR_H

// Own
#include "gammaray_core_export.h"

#include <common/problem.h>
#include <common/objectid.h>
#include <common/sourcelocation.h>

// Qt
#include <QAbstractItemModel>

// Std
#include <memory>
#include <vector>
#include <functional>

namespace GammaRay {

class ProblemModel;

class GAMMARAY_CORE_EXPORT ProblemCollector : public QObject
{
    Q_OBJECT

public:
    static void addProblem(const Problem &problem);

    /**
     * Removes the problem with the \p problemId. It's ok to call this method
     * with a problemId that is not registered, in this case nothing happens.
     *
     * It's not required to call this for problems with findingCategory Scan,
     * as those are removed automatically in advance to a new scan.
     */
    static void removeProblem(const QString &problemId);
    static ProblemCollector *instance();

    const QVector<Problem> &problems();

    /**
     * Use this method from a tool to register a scan, which the tool is able
     * to do.
     *
     * \p name and \p description are user-readable strings, \p id is some
     * internal string that will be used to identify the checkers. This can be
     * chosen at will, but must be unique.
     * \p callback will be called to start the scan
     */
    static void registerProblemChecker(const QString &id,
                                       const QString &name, const QString &description,
                                       const std::function<void()> &callback,
                                       bool enabled = true);

    /// Meant to be used in unit tests
    bool isCheckerRegistered(const QString &id) const;

private:
    struct Checker
    {
        QString id;
        QString name;
        QString description;
        std::function<void()> callback;
        bool enabled;
    };
    QVector<Checker> &availableCheckers();

signals:
    /**
     * These signals are directed at the problem model to inform about changes
     * in the result set.
     */
    void aboutToAddProblem(int row);
    void problemAdded();
    void aboutToRemoveProblems(int first, int count = 1);
    void problemsRemoved();

    /**
     * This signal is directed at the Problem Reporter tool to inform that
     * the problem providing tools have started scanning for problems.
     */
    void problemScansFinished();

    /**
     * These signals are directed at the available checkers model to inform newly
     * available checkers
     */
    void aboutToAddChecker();
    void checkerAdded();

public slots:
    void requestScan();

private:
    explicit ProblemCollector(QObject *parent);
    void clearScans();

    QVector<Checker> m_availableCheckers;
    QVector<Problem> m_problems;

    friend class Probe;
    friend class AvailableCheckersModel;
    friend class ProblemReporterTest;
};
}

#endif // GAMMARAY_PROBLEMCOLLECTOR_H