mirror of https://github.com/cutefishos/calamares
Added Utils, Logger, Translations, QCommandLineParser, init boilerplate
parent
293446a7bd
commit
b21dc4fe4c
@ -0,0 +1,6 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource prefix="/lang">
|
||||
<file>calamares_de.qm</file>
|
||||
<file>calamares_en.qm</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -0,0 +1,48 @@
|
||||
macro(add_calamares_translations language)
|
||||
list( APPEND CALAMARES_LANGUAGES ${ARGV} )
|
||||
|
||||
set( calamares_i18n_qrc_content "<!DOCTYPE RCC><RCC version=\"1.0\">\n" )
|
||||
|
||||
# calamares and qt language files
|
||||
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}<qresource prefix=\"/lang\">\n" )
|
||||
foreach( lang ${CALAMARES_LANGUAGES} )
|
||||
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}<file>calamares_${lang}.qm</file>\n" )
|
||||
if( NOT lang STREQUAL "en" AND EXISTS ${QT_TRANSLATIONS_DIR}/qt_${lang}.qm )
|
||||
file( COPY ${QT_TRANSLATIONS_DIR}/qt_${lang}.qm DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )
|
||||
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}<file>qt_${lang}.qm</file>\n" )
|
||||
endif()
|
||||
|
||||
# build explicitly enabled languages
|
||||
list( APPEND TS_FILES "${CMAKE_SOURCE_DIR}/lang/calamares_${lang}.ts" )
|
||||
endforeach()
|
||||
|
||||
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}</qresource>\n" )
|
||||
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}</RCC>\n" )
|
||||
|
||||
file( WRITE ${CMAKE_BINARY_DIR}/lang/calamares_i18n.qrc "${calamares_i18n_qrc_content}" )
|
||||
|
||||
qt5_add_translation(QM_FILES ${TS_FILES})
|
||||
|
||||
## HACK HACK HACK - around rcc limitations to allow out of source-tree building
|
||||
set( trans_file calamares_i18n )
|
||||
set( trans_srcfile ${CMAKE_BINARY_DIR}/lang/${trans_file}.qrc )
|
||||
set( trans_infile ${CMAKE_CURRENT_BINARY_DIR}/${trans_file}.qrc )
|
||||
set( trans_outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${trans_file}.cxx )
|
||||
|
||||
# Copy the QRC file to the output directory
|
||||
add_custom_command(
|
||||
OUTPUT ${trans_infile}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${trans_srcfile} ${trans_infile}
|
||||
MAIN_DEPENDENCY ${trans_srcfile}
|
||||
)
|
||||
|
||||
# Run the resource compiler (rcc_options should already be set)
|
||||
add_custom_command(
|
||||
OUTPUT ${trans_outfile}
|
||||
COMMAND ${QT_RCC_EXECUTABLE}
|
||||
ARGS ${rcc_options} -name ${trans_file} -o ${trans_outfile} ${trans_infile}
|
||||
MAIN_DEPENDENCY ${trans_infile}
|
||||
DEPENDS ${QM_FILES}
|
||||
)
|
||||
endmacro()
|
||||
|
@ -0,0 +1,106 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "CalamaresApplication.h"
|
||||
|
||||
#include "CalamaresWindow.h"
|
||||
#include "CalamaresVersion.h"
|
||||
|
||||
#include "utils/CalamaresUtils.h"
|
||||
#include "utils/Logger.h"
|
||||
|
||||
|
||||
CalamaresApplication::CalamaresApplication( int& argc, char *argv[] )
|
||||
: QApplication( argc, argv )
|
||||
, m_mainwindow( 0 )
|
||||
{
|
||||
setOrganizationName( QLatin1String( CALAMARES_ORGANIZATION_NAME ) );
|
||||
setOrganizationDomain( QLatin1String( CALAMARES_ORGANIZATION_DOMAIN ) );
|
||||
setApplicationName( QLatin1String( CALAMARES_APPLICATION_NAME ) );
|
||||
setApplicationVersion( QLatin1String( CALAMARES_VERSION ) );
|
||||
|
||||
CalamaresUtils::installTranslator( this );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CalamaresApplication::init()
|
||||
{
|
||||
qDebug() << "CalamaresApplication thread:" << thread();
|
||||
|
||||
//TODO: Icon loader
|
||||
Logger::setupLogfile();
|
||||
|
||||
setQuitOnLastWindowClosed( false );
|
||||
|
||||
initBranding();
|
||||
|
||||
setWindowIcon( QIcon( "from branding" ) );
|
||||
|
||||
initPlugins();
|
||||
|
||||
initJobQueue();
|
||||
|
||||
m_mainwindow = new CalamaresWindow();
|
||||
m_mainwindow->show();
|
||||
}
|
||||
|
||||
|
||||
CalamaresApplication::~CalamaresApplication()
|
||||
{
|
||||
tDebug( LOGVERBOSE ) << "Shutting down Calamares...";
|
||||
|
||||
// if ( JobQueue::instance() )
|
||||
// JobQueue::instance()->stop();
|
||||
|
||||
// delete m_mainwindow;
|
||||
|
||||
// delete JobQueue::instance();
|
||||
|
||||
tDebug( LOGVERBOSE ) << "Finished shutdown.";
|
||||
}
|
||||
|
||||
|
||||
CalamaresApplication*
|
||||
CalamaresApplication::instance()
|
||||
{
|
||||
return qobject_cast< CalamaresApplication* >( QApplication::instance() );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CalamaresApplication::initBranding()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CalamaresApplication::initPlugins()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CalamaresApplication::initJobQueue()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CALAMARESAPPLICATION_H
|
||||
#define CALAMARESAPPLICATION_H
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#define APP CalamaresApplication::instance()
|
||||
|
||||
class CalamaresWindow;
|
||||
|
||||
class CalamaresApplication : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
CalamaresApplication( int& argc, char *argv[] );
|
||||
virtual ~CalamaresApplication();
|
||||
|
||||
void init();
|
||||
static CalamaresApplication* instance();
|
||||
|
||||
void initBranding();
|
||||
void initPlugins();
|
||||
void initJobQueue();
|
||||
|
||||
private:
|
||||
CalamaresWindow* m_mainwindow;
|
||||
|
||||
//QPointer< Calamares::JobQueue > m_jobQueue;
|
||||
};
|
||||
|
||||
#endif //CALAMARESAPPLICATION_H
|
@ -0,0 +1,29 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CALAMARESWINDOW_H
|
||||
#define CALAMARESWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
class CalamaresWindow : public QMainWindow
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
#endif //CALAMARESWINDOW_H
|
@ -0,0 +1,92 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2013-2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Originally from Tomahawk, portions:
|
||||
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
|
||||
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
|
||||
* Copyright 2010-2012, Jeff Mitchell <jeff@tomahawk-player.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "CalamaresUtils.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QLocale>
|
||||
#include <QTranslator>
|
||||
|
||||
namespace CalamaresUtils
|
||||
{
|
||||
|
||||
QDir
|
||||
appDataDir()
|
||||
{
|
||||
QString path;
|
||||
path = QDir::home().filePath( ".local/share" );
|
||||
|
||||
path += "/" + QCoreApplication::organizationName();
|
||||
QDir d( path );
|
||||
d.mkpath( path );
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
QDir
|
||||
appLogDir()
|
||||
{
|
||||
return appDataDir();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
installTranslator( QObject* parent )
|
||||
{
|
||||
QString locale = QLocale::system().uiLanguages().first().replace( "-", "_" );
|
||||
|
||||
if ( locale == "C" )
|
||||
locale = "en";
|
||||
|
||||
// Calamares translations
|
||||
QTranslator* translator = new QTranslator( parent );
|
||||
if ( translator->load( QString( ":/lang/calamares_" ) + locale ) )
|
||||
{
|
||||
qDebug() << "Translation: Calamares: Using system locale:" << locale;
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Translation: Calamares: Using default locale, system locale one not found:" << locale;
|
||||
translator->load( QString( ":/lang/calamares_en" ) );
|
||||
}
|
||||
|
||||
QCoreApplication::installTranslator( translator );
|
||||
|
||||
// Qt translations
|
||||
translator = new QTranslator( parent );
|
||||
if ( translator->load( QString( ":/lang/qt_" ) + locale ) )
|
||||
{
|
||||
qDebug() << "Translation: Qt: Using system locale:" << locale;
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Translation: Qt: Using default locale, system locale one not found:" << locale;
|
||||
}
|
||||
|
||||
QCoreApplication::installTranslator( translator );
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2013-2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Originally from Tomahawk, portions:
|
||||
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
|
||||
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
|
||||
* Copyright 2010-2012, Jeff Mitchell <jeff@tomahawk-player.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CALAMARESUTILS_H
|
||||
#define CALAMARESUTILS_H
|
||||
|
||||
#include "DllMacro.h"
|
||||
|
||||
class QDir;
|
||||
class QObject;
|
||||
|
||||
namespace CalamaresUtils
|
||||
{
|
||||
DLLEXPORT QDir appDataDir();
|
||||
DLLEXPORT QDir appLogDir();
|
||||
DLLEXPORT void installTranslator( QObject* parent );
|
||||
|
||||
}
|
||||
|
||||
#endif // CALAMARESUTILS_H
|
@ -0,0 +1,169 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
|
||||
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Logger.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QMutex>
|
||||
#include <QTime>
|
||||
#include <QVariant>
|
||||
|
||||
#include "utils/CalamaresUtils.h"
|
||||
|
||||
#define LOGFILE_SIZE 1024 * 256
|
||||
|
||||
#define RELEASE_LEVEL_THRESHOLD 0
|
||||
#define DEBUG_LEVEL_THRESHOLD LOGEXTRA
|
||||
|
||||
using namespace std;
|
||||
|
||||
ofstream logfile;
|
||||
static int s_threshold = -1;
|
||||
QMutex s_mutex;
|
||||
|
||||
namespace Logger
|
||||
{
|
||||
|
||||
static void
|
||||
log( const char *msg, unsigned int debugLevel, bool toDisk = true )
|
||||
{
|
||||
if ( s_threshold < 0 )
|
||||
{
|
||||
if ( qApp->arguments().contains( "--verbose" ) ||
|
||||
qApp->arguments().contains( "-v" ) )
|
||||
s_threshold = LOGVERBOSE;
|
||||
else
|
||||
#ifdef QT_NO_DEBUG
|
||||
s_threshold = RELEASE_LEVEL_THRESHOLD;
|
||||
#else
|
||||
s_threshold = DEBUG_LEVEL_THRESHOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
if ( toDisk || (int)debugLevel <= s_threshold )
|
||||
{
|
||||
QMutexLocker lock( &s_mutex );
|
||||
|
||||
logfile << QDate::currentDate().toString().toUtf8().data()
|
||||
<< " - "
|
||||
<< QTime::currentTime().toString().toUtf8().data()
|
||||
<< " [" << QString::number( debugLevel ).toUtf8().data() << "]: "
|
||||
<< msg << endl;
|
||||
|
||||
logfile.flush();
|
||||
}
|
||||
|
||||
if ( debugLevel <= LOGEXTRA || (int)debugLevel <= s_threshold )
|
||||
{
|
||||
QMutexLocker lock( &s_mutex );
|
||||
|
||||
cout << QTime::currentTime().toString().toUtf8().data()
|
||||
<< " [" << QString::number( debugLevel ).toUtf8().data() << "]: "
|
||||
<< msg << endl;
|
||||
|
||||
cout.flush();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CalamaresLogHandler( QtMsgType type, const QMessageLogContext& context, const QString& msg )
|
||||
{
|
||||
static QMutex s_mutex;
|
||||
|
||||
QByteArray ba = msg.toUtf8();
|
||||
const char* message = ba.constData();
|
||||
|
||||
QMutexLocker locker( &s_mutex );
|
||||
switch( type )
|
||||
{
|
||||
case QtDebugMsg:
|
||||
log( message, LOGVERBOSE );
|
||||
break;
|
||||
|
||||
case QtCriticalMsg:
|
||||
log( message, 0 );
|
||||
break;
|
||||
|
||||
case QtWarningMsg:
|
||||
log( message, 0 );
|
||||
break;
|
||||
|
||||
case QtFatalMsg:
|
||||
log( message, 0 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QString
|
||||
logFile()
|
||||
{
|
||||
return CalamaresUtils::appLogDir().filePath( "Calamares.log" );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
setupLogfile()
|
||||
{
|
||||
if ( QFileInfo( logFile().toLocal8Bit() ).size() > LOGFILE_SIZE )
|
||||
{
|
||||
QByteArray lc;
|
||||
{
|
||||
QFile f( logFile().toLocal8Bit() );
|
||||
f.open( QIODevice::ReadOnly | QIODevice::Text );
|
||||
lc = f.readAll();
|
||||
f.close();
|
||||
}
|
||||
|
||||
QFile::remove( logFile().toLocal8Bit() );
|
||||
|
||||
{
|
||||
QFile f( logFile().toLocal8Bit() );
|
||||
f.open( QIODevice::WriteOnly | QIODevice::Text );
|
||||
f.write( lc.right( LOGFILE_SIZE - ( LOGFILE_SIZE / 4 ) ) );
|
||||
f.close();
|
||||
}
|
||||
}
|
||||
|
||||
logfile.open( logFile().toLocal8Bit(), ios::app );
|
||||
qInstallMessageHandler( CalamaresLogHandler );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
using namespace Logger;
|
||||
|
||||
CLog::CLog( unsigned int debugLevel )
|
||||
: QDebug( &m_msg )
|
||||
, m_debugLevel( debugLevel )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CLog::~CLog()
|
||||
{
|
||||
log( m_msg.toUtf8().data(), m_debugLevel );
|
||||
}
|
||||
|
@ -0,0 +1,61 @@
|
||||
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||
*
|
||||
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
|
||||
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||
*
|
||||
* Calamares is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calamares is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CALAMARES_LOGGER_H
|
||||
#define CALAMARES_LOGGER_H
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "DllMacro.h"
|
||||
|
||||
#define LOGDEBUG 1
|
||||
#define LOGINFO 2
|
||||
#define LOGEXTRA 5
|
||||
#define LOGVERBOSE 8
|
||||
|
||||
namespace Logger
|
||||
{
|
||||
class DLLEXPORT CLog : public QDebug
|
||||
{
|
||||
public:
|
||||
CLog( unsigned int debugLevel = 0 );
|
||||
virtual ~CLog();
|
||||
|
||||
private:
|
||||
QString m_msg;
|
||||
unsigned int m_debugLevel;
|
||||
};
|
||||
|
||||
class DLLEXPORT CDebug : public CLog
|
||||
{
|
||||
public:
|
||||
CDebug( unsigned int debugLevel = LOGDEBUG ) : CLog( debugLevel )
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
DLLEXPORT void CalamaresLogHandler( QtMsgType type, const char* msg );
|
||||
DLLEXPORT void setupLogfile();
|
||||
DLLEXPORT QString logFile();
|
||||
}
|
||||
|
||||
#define tLog Logger::CLog
|
||||
#define tDebug Logger::CDebug
|
||||
|
||||
#endif // CALAMARES_LOGGER_H
|
Loading…
Reference in New Issue