Skip to content
Snippets Groups Projects
Select Git revision
  • 3.2.x-stable
  • development default protected
  • prepare
  • 6b369dc5
  • 3.1.x-stable
  • 3.0.x-stable
  • 2.4.x-stable
  • v3.2.61
  • v3.2.60
  • v3.2.59
  • v3.2.54
  • v3.2.53
  • v3.2.52
  • v3.2.51
  • v3.2.48
  • v3.2.45
  • v3.2.44.3
  • v3.2.44
  • v3.2.40
  • v3.2.13
  • v3.2.9
  • v3.2.8
  • v3.2.7
  • v3.2.6
  • v3.2.5
  • v3.2.4
  • v3.2.3
27 results

ModuleFactory.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ModuleFactory.cpp 3.86 KiB
    /* === This file is part of Calamares - <https://calamares.io> ===
     *
     *   SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
     *   SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot <groot@kde.org>
     *   SPDX-License-Identifier: GPL-3.0-or-later
     *
     *   Calamares is Free Software: see the License-Identifier above.
     *
     */
    
    #include "ModuleFactory.h"
    
    #include "CalamaresConfig.h"
    #include "CppJobModule.h"
    #include "ProcessJobModule.h"
    #include "ViewModule.h"
    
    #include "utils/Dirs.h"
    #include "utils/Logger.h"
    #include "utils/NamedEnum.h"
    #include "utils/Yaml.h"
    
    #ifdef WITH_PYTHON
    #include "PythonJobModule.h"
    #endif
    
    #include <QDir>
    #include <QFile>
    #include <QFileInfo>
    #include <QString>
    
    
    namespace Calamares
    {
    
    Module*
    moduleFromDescriptor( const Calamares::ModuleSystem::Descriptor& moduleDescriptor,
                          const QString& instanceId,
                          const QString& configFileName,
                          const QString& moduleDirectory )
    {
        using Type = Calamares::ModuleSystem::Type;
        using Interface = Calamares::ModuleSystem::Interface;
    
        std::unique_ptr< Module > m;
    
        if ( !moduleDescriptor.isValid() )
        {
            cError() << "Bad module descriptor format" << instanceId;
            return nullptr;
        }
        if ( moduleDescriptor.type() == Type::View )
        {
            if ( moduleDescriptor.interface() == Interface::QtPlugin )
            {
                m.reset( new ViewModule() );
            }
            else
            {
                cError() << "Bad interface"
                         << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() )
                         << "for module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
            }
        }
        else if ( moduleDescriptor.type() == Type::Job )
        {
            if ( moduleDescriptor.interface() == Interface::QtPlugin )
            {
                m.reset( new CppJobModule() );
            }
            else if ( moduleDescriptor.interface() == Interface::Process )
            {
                m.reset( new ProcessJobModule() );
            }
            else if ( moduleDescriptor.interface() == Interface::Python )
            {
    #ifdef WITH_PYTHON
                m.reset( new PythonJobModule() );
    #else
                cError() << "Python modules are not supported in this version of Calamares.";
    #endif
            }
            else
            {
                cError() << "Bad interface"
                         << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() )
                         << "for module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
            }
        }
        else
        {
            cError() << "Bad module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
        }
    
        if ( !m )
        {
            cError() << "Bad module type (" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() )
                     << ") or interface string ("
                     << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() ) << ") for module "
                     << instanceId;
            return nullptr;
        }
    
        QDir moduleDir( moduleDirectory );
        if ( moduleDir.exists() && moduleDir.isReadable() )
        {
            m->m_directory = moduleDir.absolutePath();
        }
        else
        {
            cError() << "Bad module directory" << moduleDirectory << "for" << instanceId;
            return nullptr;
        }
    
        m->initFrom( moduleDescriptor, instanceId );
        if ( !m->m_key.isValid() )
        {
            cError() << "Module" << instanceId << "invalid ID";
            return nullptr;
        }
    
        m->initFrom( moduleDescriptor );
        if ( !configFileName.isEmpty() )
        {
            try
            {
                m->loadConfigurationFile( configFileName );
            }
            catch ( YAML::Exception& e )
            {
                cError() << "YAML parser error " << e.what();
                return nullptr;
            }
        }
        return m.release();
    }
    
    
    }  // namespace Calamares