149 lines
4.4 KiB
C++
149 lines
4.4 KiB
C++
/* === This file is part of Calamares - <https://calamares.io> ===
|
|
*
|
|
* SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* Calamares is Free Software: see the License-Identifier above.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef MODULESYSTEM_DESCRIPTOR_H
|
|
#define MODULESYSTEM_DESCRIPTOR_H
|
|
|
|
#include "DllMacro.h"
|
|
#include "utils/NamedEnum.h"
|
|
|
|
#include <QVariantMap>
|
|
|
|
namespace Calamares
|
|
{
|
|
namespace ModuleSystem
|
|
{
|
|
/**
|
|
* @brief The Type enum represents the intended functionality of the module
|
|
* Every module is either a job module or a view module.
|
|
* A job module is a single Calamares job.
|
|
* A view module has a UI (one or more view pages) and zero-to-many jobs.
|
|
*/
|
|
enum class Type
|
|
{
|
|
Job,
|
|
View
|
|
};
|
|
DLLEXPORT const NamedEnumTable< Type >& typeNames();
|
|
|
|
/**
|
|
* @brief The Interface enum represents the interface through which the module
|
|
* talks to Calamares.
|
|
* Not all Type-Interface associations are valid.
|
|
*/
|
|
enum class Interface
|
|
{
|
|
QtPlugin, // Jobs or Views
|
|
Python, // Jobs only
|
|
Process, // Deprecated interface
|
|
};
|
|
DLLEXPORT const NamedEnumTable< Interface >& interfaceNames();
|
|
|
|
/**
|
|
* @brief Description of a module (obtained from module.desc)
|
|
*
|
|
* Provides access to the fields of a descriptor, use type() to
|
|
* determine which specialized fields make sense for a given
|
|
* descriptor (e.g. a Python module has no shared-library path).
|
|
*/
|
|
class DLLEXPORT Descriptor
|
|
{
|
|
public:
|
|
///@brief an invalid, and empty, descriptor
|
|
Descriptor();
|
|
|
|
/** @brief Fills a descriptor from the loaded (YAML) data.
|
|
*
|
|
* The @p descriptorPath is used only for debug messages, the
|
|
* data is only read from @p moduleDesc.
|
|
*
|
|
*/
|
|
static Descriptor fromDescriptorData( const QVariantMap& moduleDesc, const QString& descriptorPath );
|
|
|
|
bool isValid() const { return m_isValid; }
|
|
|
|
QString name() const { return m_name; }
|
|
Type type() const { return m_type; }
|
|
Interface interface() const { return m_interface; }
|
|
|
|
bool isEmergency() const { return m_isEmergeny; }
|
|
bool hasConfig() const { return m_hasConfig; } // TODO: 3.5 rename to noConfig() to match descriptor key
|
|
int weight() const { return m_weight < 1 ? 1 : m_weight; }
|
|
bool explicitWeight() const { return m_weight > 0; }
|
|
|
|
|
|
/// @brief The directory where the module.desc lives
|
|
QString directory() const { return m_directory; }
|
|
void setDirectory( const QString& d ) { m_directory = d; }
|
|
|
|
const QStringList& requiredModules() const { return m_requiredModules; }
|
|
|
|
/** @section C++ Modules
|
|
*
|
|
* The C++ modules are the most general, and are loaded as
|
|
* a shared library after which a suitable factory creates
|
|
* objects from them.
|
|
*/
|
|
|
|
/// @brief Short path to the shared-library; no extension.
|
|
QString load() const { return m_interface == Interface::QtPlugin ? m_script : QString(); }
|
|
|
|
/** @section Process Job modules
|
|
*
|
|
* Process Jobs are somewhat deprecated in favor of shellprocess
|
|
* and contextualprocess jobs, since those handle multiple configuration
|
|
* much more gracefully.
|
|
*
|
|
* Process Jobs execute one command.
|
|
*/
|
|
/// @brief The command to execute; passed to the shell
|
|
QString command() const { return m_interface == Interface::Process ? m_script : QString(); }
|
|
/// @brief Timeout in seconds
|
|
int timeout() const { return m_processTimeout; }
|
|
/// @brief Run command in chroot?
|
|
bool chroot() const { return m_processChroot; }
|
|
|
|
/** @section Python Job modules
|
|
*
|
|
* Python job modules have one specific script to load and run.
|
|
*/
|
|
QString script() const { return m_interface == Interface::Python ? m_script : QString(); }
|
|
|
|
private:
|
|
QString m_name;
|
|
QString m_directory;
|
|
QStringList m_requiredModules;
|
|
int m_weight = -1;
|
|
Type m_type;
|
|
Interface m_interface;
|
|
bool m_isValid = false;
|
|
bool m_isEmergeny = false;
|
|
bool m_hasConfig = true;
|
|
|
|
/** @brief The name of the thing to load
|
|
*
|
|
* - A C++ module loads a shared library (via key *load*),
|
|
* - A Python module loads a Python script (via key *script*),
|
|
* - A process runs a specific command (via key *command*)
|
|
*
|
|
* This name-of-the-thing is stored here, regardless of which
|
|
* interface is being used.
|
|
*/
|
|
QString m_script;
|
|
|
|
int m_processTimeout = 30;
|
|
bool m_processChroot = false;
|
|
};
|
|
|
|
} // namespace ModuleSystem
|
|
} // namespace Calamares
|
|
|
|
#endif
|