summaryrefslogtreecommitdiffstats
path: root/src/plugin-interfaces/containerinterface.h
blob: 4bfb3a194d41b4b099282f2b3d29ec71f685332d (plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright (C) 2021 The Qt Company Ltd.
// Copyright (C) 2019 Luxoft Sweden AB
// Copyright (C) 2018 Pelagicore AG
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef CONTAINERINTERFACE_H
#define CONTAINERINTERFACE_H

#include <QtCore/QObject>
#include <QtCore/QtPlugin>
#include <QtCore/QStringList>
#include <QtCore/QVariantMap>
#include <QtCore/QVector>
#include <QtAppManPluginInterfaces/qtappman_plugininterfaces-config.h>


class ContainerInterface : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY_MOVE(ContainerInterface)

public:
    // keep these enums in sync with those in amnamespace.h
    enum ExitStatus {
        NormalExit,
        CrashExit,
        ForcedExit,
        WatchdogExit  // added in 6.10
    };
    Q_ENUM(ExitStatus)

    enum RunState {
        NotRunning,
        StartingUp,
        Running,
        ShuttingDown,
    };
    Q_ENUM(RunState)

    enum ProcessError {
        FailedToStart, //### file not found, resource error
        Crashed,
        Timedout,
        ReadError,
        WriteError,
        UnknownError
    };
    Q_ENUM(ProcessError)

    ContainerInterface();
    virtual ~ContainerInterface() override;

    virtual bool attachApplication(const QVariantMap &application) = 0;

    virtual QString controlGroup() const = 0;
    virtual bool setControlGroup(const QString &groupName) = 0;

    virtual bool setProgram(const QString &program) = 0;
    virtual void setBaseDirectory(const QString &baseDirectory) = 0;

    virtual bool isReady() const = 0;

    virtual QString mapContainerPathToHost(const QString &containerPath) const = 0;
    virtual QString mapHostPathToContainer(const QString &hostPath) const = 0;

    virtual bool start(const QStringList &arguments, const QMap<QString, QString> &runtimeEnvironment,
                       const QVariantMap &amConfig) = 0;

    virtual qint64 processId() const = 0;
    virtual RunState state() const = 0;

#ifdef Q_QDOC
    virtual void kill() = 0;
    virtual void terminate() = 0;
#endif
    virtual void stop(ContainerInterface::ExitStatus exitStatus) = 0; // added in 6.10
Q_SIGNALS:
    void ready();
    void started();
    void errorOccured(ContainerInterface::ProcessError processError);
    void finished(int exitCode, ContainerInterface::ExitStatus exitStatus);
    void stateChanged(ContainerInterface::RunState state);
};

// This interface is offered by the AM to the plugin - a pointer to a concrete implementation
// is supplied to the plugin by implementing ContainerManagerInterface::initialize()
class ContainerHelperFunctions
{
    Q_DISABLE_COPY_MOVE(ContainerHelperFunctions)

protected:
    ContainerHelperFunctions() = default;
    ~ContainerHelperFunctions() = default;

public:
    virtual void closeAndClearFileDescriptors(QVector<int> &fdList) = 0;
    virtual QStringList substituteCommand(const QStringList &debugWrapperCommand,
                                          const QString &program, const QStringList &arguments) = 0;
    virtual bool hasRootPrivileges() = 0;

    // this function needs root privileges and throws std::execptions on error:
    virtual void bindMountFileSystem(const QString &from, const QString &to, bool readOnly,
                                     quint64 namespacePid) = 0;

    // added in 6.10:
    virtual int watchdogSignal() = 0;

    // these two will throw std::exceptions on error:
    virtual QString checkDBusSocketPath(const QString &dbusAddress, const QByteArray &typeHint) = 0;
    virtual QString checkWaylandSocketPath(const QString &xdgRuntimeDir, const QString &waylandDisplay) = 0;
};

class ContainerManagerInterface
{
    Q_DISABLE_COPY_MOVE(ContainerManagerInterface)

public:
    ContainerManagerInterface();
    virtual ~ContainerManagerInterface();
    virtual bool initialize(ContainerHelperFunctions *helpers);

    virtual QString identifier() const = 0;
    virtual bool supportsQuickLaunch() const = 0;
    virtual void setConfiguration(const QVariantMap &configuration) = 0;

    virtual ContainerInterface *create(bool isQuickLaunch,
                                       const QVector<int> &stdioRedirections,
                                       const QMap<QString, QString> &debugWrapperEnvironment,
                                       const QStringList &debugWrapperCommand) = 0;
};

#define AM_ContainerManagerInterface_iid "io.qt.ApplicationManager.ContainerManagerInterface2"

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(ContainerManagerInterface, AM_ContainerManagerInterface_iid)
QT_END_NAMESPACE

#endif // CONTAINERINTERFACE_H