1 /*
2     SPDX-FileCopyrightText: 2009 George Kiagiadakis <gkiagia@users.sourceforge.net>
3     SPDX-FileCopyrightText: 2021 Harald Sitter <sitter@kde.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 #ifndef DRKONQIBACKENDS_H
8 #define DRKONQIBACKENDS_H
9 
10 #include <QObject>
11 
12 class CrashedApplication;
13 class DebuggerManager;
14 
15 class AbstractDrKonqiBackend : public QObject
16 {
17     Q_OBJECT
18 public:
19     using QObject::QObject;
20     virtual ~AbstractDrKonqiBackend();
21     virtual bool init();
22     virtual void prepareForDebugger();
23     void cleanup(); // cleanup on-disk caches
24 
crashedApplication()25     inline CrashedApplication *crashedApplication() const
26     {
27         return m_crashedApplication;
28     }
29 
debuggerManager()30     inline DebuggerManager *debuggerManager() const
31     {
32         return m_debuggerManager;
33     }
34 
35     static QString metadataPath();
36 
37 Q_SIGNALS:
38     void preparedForDebugger();
39 
40 protected:
41     virtual CrashedApplication *constructCrashedApplication() = 0;
42     virtual DebuggerManager *constructDebuggerManager() = 0;
43 
44 private:
45     CrashedApplication *m_crashedApplication = nullptr;
46     DebuggerManager *m_debuggerManager = nullptr;
47 };
48 
49 class KCrashBackend : public AbstractDrKonqiBackend
50 {
51     Q_OBJECT
52 public:
53     using AbstractDrKonqiBackend::AbstractDrKonqiBackend;
54     ~KCrashBackend() override;
55 
56     bool init() override;
57 
58 protected:
59     CrashedApplication *constructCrashedApplication() override;
60     DebuggerManager *constructDebuggerManager() override;
61 
62 private Q_SLOTS:
63     void stopAttachedProcess();
64     void continueAttachedProcess();
65     void onDebuggerStarting();
66     void onDebuggerFinished();
67 
68 private:
69     static void emergencySaveFunction(int signal);
70     static qint64 s_pid; // for use by the emergencySaveFunction
71 
72     enum State { ProcessRunning, ProcessStopped, DebuggerRunning };
73     State m_state = ProcessRunning;
74 };
75 
76 #endif // DRKONQIBACKENDS_H
77