[libcalamares] Apply current coding style to libcalamares/utils/
- String.cpp needs special handling since part of it should remain unchanged, the formatting is "special" there.
This commit is contained in:
parent
29b9a21f59
commit
b8a74657f4
@ -19,10 +19,10 @@
|
|||||||
|
|
||||||
#include "CalamaresUtilsSystem.h"
|
#include "CalamaresUtilsSystem.h"
|
||||||
|
|
||||||
#include "utils/Logger.h"
|
|
||||||
#include "GlobalStorage.h"
|
#include "GlobalStorage.h"
|
||||||
#include "JobQueue.h"
|
#include "JobQueue.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
#include "utils/Logger.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
@ -34,8 +34,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_FREEBSD
|
#ifdef Q_OS_FREEBSD
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** @brief When logging commands, don't log everything.
|
/** @brief When logging commands, don't log everything.
|
||||||
@ -48,12 +48,12 @@
|
|||||||
struct RedactedList
|
struct RedactedList
|
||||||
{
|
{
|
||||||
RedactedList( const QStringList& l )
|
RedactedList( const QStringList& l )
|
||||||
: list(l)
|
: list( l )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const QStringList& list;
|
const QStringList& list;
|
||||||
} ;
|
};
|
||||||
|
|
||||||
QDebug&
|
QDebug&
|
||||||
operator<<( QDebug& s, const RedactedList& l )
|
operator<<( QDebug& s, const RedactedList& l )
|
||||||
@ -63,12 +63,18 @@ operator<<( QDebug& s, const RedactedList& l )
|
|||||||
{
|
{
|
||||||
for ( const auto& item : l.list )
|
for ( const auto& item : l.list )
|
||||||
if ( item.startsWith( "$6$" ) )
|
if ( item.startsWith( "$6$" ) )
|
||||||
|
{
|
||||||
s << "<password>";
|
s << "<password>";
|
||||||
else
|
|
||||||
s << item;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
s << item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
s << l.list;
|
s << l.list;
|
||||||
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -92,8 +98,7 @@ System::System( bool doChroot, QObject* parent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
System::~System()
|
System::~System() {}
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
System*
|
System*
|
||||||
@ -118,11 +123,15 @@ System::mount( const QString& devicePath,
|
|||||||
if ( devicePath.isEmpty() || mountPoint.isEmpty() )
|
if ( devicePath.isEmpty() || mountPoint.isEmpty() )
|
||||||
{
|
{
|
||||||
if ( devicePath.isEmpty() )
|
if ( devicePath.isEmpty() )
|
||||||
|
{
|
||||||
cWarning() << "Can't mount an empty device.";
|
cWarning() << "Can't mount an empty device.";
|
||||||
|
}
|
||||||
if ( mountPoint.isEmpty() )
|
if ( mountPoint.isEmpty() )
|
||||||
|
{
|
||||||
cWarning() << "Can't mount on an empty mountpoint.";
|
cWarning() << "Can't mount on an empty mountpoint.";
|
||||||
|
}
|
||||||
|
|
||||||
return static_cast<int>(ProcessResult::Code::NoWorkingDirectory);
|
return static_cast< int >( ProcessResult::Code::NoWorkingDirectory );
|
||||||
}
|
}
|
||||||
|
|
||||||
QDir mountPointDir( mountPoint );
|
QDir mountPointDir( mountPoint );
|
||||||
@ -132,7 +141,7 @@ System::mount( const QString& devicePath,
|
|||||||
if ( !ok )
|
if ( !ok )
|
||||||
{
|
{
|
||||||
cWarning() << "Could not create mountpoint" << mountPoint;
|
cWarning() << "Could not create mountpoint" << mountPoint;
|
||||||
return static_cast<int>(ProcessResult::Code::NoWorkingDirectory);
|
return static_cast< int >( ProcessResult::Code::NoWorkingDirectory );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,17 +149,20 @@ System::mount( const QString& devicePath,
|
|||||||
QStringList args = { devicePath, mountPoint };
|
QStringList args = { devicePath, mountPoint };
|
||||||
|
|
||||||
if ( !filesystemName.isEmpty() )
|
if ( !filesystemName.isEmpty() )
|
||||||
|
{
|
||||||
args << "-t" << filesystemName;
|
args << "-t" << filesystemName;
|
||||||
|
}
|
||||||
|
|
||||||
if ( !options.isEmpty() )
|
if ( !options.isEmpty() )
|
||||||
|
{
|
||||||
args << "-o" << options;
|
args << "-o" << options;
|
||||||
|
}
|
||||||
|
|
||||||
return QProcess::execute( program, args );
|
return QProcess::execute( program, args );
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessResult
|
ProcessResult
|
||||||
System::runCommand(
|
System::runCommand( System::RunLocation location,
|
||||||
System::RunLocation location,
|
|
||||||
const QStringList& args,
|
const QStringList& args,
|
||||||
const QString& workingPath,
|
const QString& workingPath,
|
||||||
const QString& stdInput,
|
const QString& stdInput,
|
||||||
@ -158,10 +170,10 @@ System::runCommand(
|
|||||||
{
|
{
|
||||||
QString output;
|
QString output;
|
||||||
|
|
||||||
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
|
Calamares::GlobalStorage* gs
|
||||||
|
= Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
|
||||||
|
|
||||||
if ( ( location == System::RunLocation::RunInTarget ) &&
|
if ( ( location == System::RunLocation::RunInTarget ) && ( !gs || !gs->contains( "rootMountPoint" ) ) )
|
||||||
( !gs || !gs->contains( "rootMountPoint" ) ) )
|
|
||||||
{
|
{
|
||||||
cWarning() << "No rootMountPoint in global storage";
|
cWarning() << "No rootMountPoint in global storage";
|
||||||
return ProcessResult::Code::NoWorkingDirectory;
|
return ProcessResult::Code::NoWorkingDirectory;
|
||||||
@ -197,7 +209,9 @@ System::runCommand(
|
|||||||
if ( !workingPath.isEmpty() )
|
if ( !workingPath.isEmpty() )
|
||||||
{
|
{
|
||||||
if ( QDir( workingPath ).exists() )
|
if ( QDir( workingPath ).exists() )
|
||||||
|
{
|
||||||
process.setWorkingDirectory( QDir( workingPath ).absolutePath() );
|
process.setWorkingDirectory( QDir( workingPath ).absolutePath() );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cWarning() << "Invalid working directory:" << workingPath;
|
cWarning() << "Invalid working directory:" << workingPath;
|
||||||
@ -219,10 +233,10 @@ System::runCommand(
|
|||||||
}
|
}
|
||||||
process.closeWriteChannel();
|
process.closeWriteChannel();
|
||||||
|
|
||||||
if ( !process.waitForFinished( timeoutSec > std::chrono::seconds::zero() ? ( std::chrono::milliseconds( timeoutSec ).count() ) : -1 ) )
|
if ( !process.waitForFinished(
|
||||||
|
timeoutSec > std::chrono::seconds::zero() ? ( std::chrono::milliseconds( timeoutSec ).count() ) : -1 ) )
|
||||||
{
|
{
|
||||||
cWarning().noquote().nospace() << "Timed out. Output so far:\n" <<
|
cWarning().noquote().nospace() << "Timed out. Output so far:\n" << process.readAllStandardOutput();
|
||||||
process.readAllStandardOutput();
|
|
||||||
return ProcessResult::Code::TimedOut;
|
return ProcessResult::Code::TimedOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +256,7 @@ System::runCommand(
|
|||||||
cDebug() << "Target cmd:" << RedactedList( args );
|
cDebug() << "Target cmd:" << RedactedList( args );
|
||||||
cDebug().noquote().nospace() << "Target output:\n" << output;
|
cDebug().noquote().nospace() << "Target output:\n" << output;
|
||||||
}
|
}
|
||||||
return ProcessResult(r, output);
|
return ProcessResult( r, output );
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
@ -252,7 +266,8 @@ System::targetPath( const QString& path ) const
|
|||||||
|
|
||||||
if ( doChroot() )
|
if ( doChroot() )
|
||||||
{
|
{
|
||||||
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
|
Calamares::GlobalStorage* gs
|
||||||
|
= Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
|
||||||
|
|
||||||
if ( !gs || !gs->contains( "rootMountPoint" ) )
|
if ( !gs || !gs->contains( "rootMountPoint" ) )
|
||||||
{
|
{
|
||||||
@ -309,28 +324,32 @@ System::createTargetFile( const QString& path, const QByteArray& contents ) cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QPair<quint64, float>
|
QPair< quint64, float >
|
||||||
System::getTotalMemoryB() const
|
System::getTotalMemoryB() const
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
struct sysinfo i;
|
struct sysinfo i;
|
||||||
int r = sysinfo( &i );
|
int r = sysinfo( &i );
|
||||||
|
|
||||||
if (r)
|
if ( r )
|
||||||
return qMakePair(0, 0.0);
|
{
|
||||||
|
return qMakePair( 0, 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
return qMakePair(quint64( i.mem_unit ) * quint64( i.totalram ), 1.1);
|
return qMakePair( quint64( i.mem_unit ) * quint64( i.totalram ), 1.1 );
|
||||||
#elif defined( Q_OS_FREEBSD )
|
#elif defined( Q_OS_FREEBSD )
|
||||||
unsigned long memsize;
|
unsigned long memsize;
|
||||||
size_t s = sizeof(memsize);
|
size_t s = sizeof( memsize );
|
||||||
|
|
||||||
int r = sysctlbyname("vm.kmem_size", &memsize, &s, NULL, 0);
|
int r = sysctlbyname( "vm.kmem_size", &memsize, &s, NULL, 0 );
|
||||||
if (r)
|
if ( r )
|
||||||
return qMakePair(0, 0.0);
|
{
|
||||||
|
return qMakePair( 0, 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
return qMakePair(memsize, 1.01);
|
return qMakePair( memsize, 1.01 );
|
||||||
#else
|
#else
|
||||||
return qMakePair(0, 0.0); // Unsupported
|
return qMakePair( 0, 0.0 ); // Unsupported
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,14 +360,14 @@ System::getCpuDescription() const
|
|||||||
QString model;
|
QString model;
|
||||||
|
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
QFile file("/proc/cpuinfo");
|
QFile file( "/proc/cpuinfo" );
|
||||||
if ( file.open(QIODevice::ReadOnly | QIODevice::Text) )
|
if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
|
||||||
while ( !file.atEnd() )
|
while ( !file.atEnd() )
|
||||||
{
|
{
|
||||||
QByteArray line = file.readLine();
|
QByteArray line = file.readLine();
|
||||||
if ( line.startsWith( "model name" ) && (line.indexOf( ':' ) > 0) )
|
if ( line.startsWith( "model name" ) && ( line.indexOf( ':' ) > 0 ) )
|
||||||
{
|
{
|
||||||
model = QString::fromLatin1( line.right(line.length() - line.indexOf( ':' ) ) );
|
model = QString::fromLatin1( line.right( line.length() - line.indexOf( ':' ) ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -376,40 +395,45 @@ ProcessResult::explainProcess( int ec, const QString& command, const QString& ou
|
|||||||
using Calamares::JobResult;
|
using Calamares::JobResult;
|
||||||
|
|
||||||
if ( ec == 0 )
|
if ( ec == 0 )
|
||||||
|
{
|
||||||
return JobResult::ok();
|
return JobResult::ok();
|
||||||
|
}
|
||||||
|
|
||||||
QString outputMessage = output.isEmpty()
|
QString outputMessage = output.isEmpty()
|
||||||
? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command.")
|
? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command." )
|
||||||
: (QCoreApplication::translate( "ProcessResult", "\nOutput:\n") + output);
|
: ( QCoreApplication::translate( "ProcessResult", "\nOutput:\n" ) + output );
|
||||||
|
|
||||||
if ( ec == static_cast<int>(ProcessResult::Code::Crashed) ) //Crash!
|
if ( ec == static_cast< int >( ProcessResult::Code::Crashed ) ) //Crash!
|
||||||
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command crashed." ),
|
return JobResult::error(
|
||||||
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> crashed." )
|
QCoreApplication::translate( "ProcessResult", "External command crashed." ),
|
||||||
.arg( command )
|
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> crashed." ).arg( command )
|
||||||
+ outputMessage );
|
+ outputMessage );
|
||||||
|
|
||||||
if ( ec == static_cast<int>(ProcessResult::Code::FailedToStart) )
|
if ( ec == static_cast< int >( ProcessResult::Code::FailedToStart ) )
|
||||||
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to start." ),
|
return JobResult::error(
|
||||||
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to start." )
|
QCoreApplication::translate( "ProcessResult", "External command failed to start." ),
|
||||||
.arg( command ) );
|
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to start." ).arg( command ) );
|
||||||
|
|
||||||
if ( ec == static_cast<int>(ProcessResult::Code::NoWorkingDirectory) )
|
if ( ec == static_cast< int >( ProcessResult::Code::NoWorkingDirectory ) )
|
||||||
return JobResult::error( QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ),
|
return JobResult::error(
|
||||||
|
QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ),
|
||||||
QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) );
|
QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) );
|
||||||
|
|
||||||
if ( ec == static_cast<int>(ProcessResult::Code::TimedOut) )
|
if ( ec == static_cast< int >( ProcessResult::Code::TimedOut ) )
|
||||||
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to finish." ),
|
return JobResult::error(
|
||||||
|
QCoreApplication::translate( "ProcessResult", "External command failed to finish." ),
|
||||||
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to finish in %2 seconds." )
|
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to finish in %2 seconds." )
|
||||||
.arg( command )
|
.arg( command )
|
||||||
.arg( timeout.count() )
|
.arg( timeout.count() )
|
||||||
+ outputMessage );
|
+ outputMessage );
|
||||||
|
|
||||||
//Any other exit code
|
//Any other exit code
|
||||||
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command finished with errors." ),
|
return JobResult::error(
|
||||||
|
QCoreApplication::translate( "ProcessResult", "External command finished with errors." ),
|
||||||
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> finished with exit code %2." )
|
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> finished with exit code %2." )
|
||||||
.arg( command )
|
.arg( command )
|
||||||
.arg( ec )
|
.arg( ec )
|
||||||
+ outputMessage );
|
+ outputMessage );
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
@ -40,11 +40,17 @@ public:
|
|||||||
FailedToStart = -2, // Must match special return values from QProcess
|
FailedToStart = -2, // Must match special return values from QProcess
|
||||||
NoWorkingDirectory = -3,
|
NoWorkingDirectory = -3,
|
||||||
TimedOut = -4
|
TimedOut = -4
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/** @brief Implicit one-argument constructor has no output, only a return code */
|
/** @brief Implicit one-argument constructor has no output, only a return code */
|
||||||
ProcessResult( Code r ) : QPair< int, QString >( static_cast<int>(r), QString() ) {}
|
ProcessResult( Code r )
|
||||||
ProcessResult( int r, QString s ) : QPair< int, QString >( r, s ) {}
|
: QPair< int, QString >( static_cast< int >( r ), QString() )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
ProcessResult( int r, QString s )
|
||||||
|
: QPair< int, QString >( r, s )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int getExitCode() const { return first; }
|
int getExitCode() const { return first; }
|
||||||
QString getOutput() const { return second; }
|
QString getOutput() const { return second; }
|
||||||
@ -62,7 +68,8 @@ public:
|
|||||||
* @param timeout Timeout passed to the process runner, for explaining
|
* @param timeout Timeout passed to the process runner, for explaining
|
||||||
* error code -4 (timeout).
|
* error code -4 (timeout).
|
||||||
*/
|
*/
|
||||||
static Calamares::JobResult explainProcess( int errorCode, const QString& command, const QString& output, std::chrono::seconds timeout );
|
static Calamares::JobResult
|
||||||
|
explainProcess( int errorCode, const QString& command, const QString& output, std::chrono::seconds timeout );
|
||||||
|
|
||||||
/// @brief Convenience wrapper for explainProcess()
|
/// @brief Convenience wrapper for explainProcess()
|
||||||
inline Calamares::JobResult explainProcess( const QString& command, std::chrono::seconds timeout ) const
|
inline Calamares::JobResult explainProcess( const QString& command, std::chrono::seconds timeout ) const
|
||||||
@ -75,7 +82,7 @@ public:
|
|||||||
{
|
{
|
||||||
return explainProcess( getExitCode(), command.join( ' ' ), getOutput(), timeout );
|
return explainProcess( getExitCode(), command.join( ' ' ), getOutput(), timeout );
|
||||||
}
|
}
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The System class is a singleton with utility functions that perform
|
* @brief The System class is a singleton with utility functions that perform
|
||||||
@ -116,7 +123,11 @@ public:
|
|||||||
/** (Typed) Boolean describing where a particular command should be run,
|
/** (Typed) Boolean describing where a particular command should be run,
|
||||||
* whether in the host (live) system or in the (chroot) target system.
|
* whether in the host (live) system or in the (chroot) target system.
|
||||||
*/
|
*/
|
||||||
enum class RunLocation { RunInHost, RunInTarget };
|
enum class RunLocation
|
||||||
|
{
|
||||||
|
RunInHost,
|
||||||
|
RunInTarget
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the specified command in the chroot of the target system.
|
* Runs the specified command in the chroot of the target system.
|
||||||
@ -135,37 +146,31 @@ public:
|
|||||||
* NoWorkingDirectory = bad arguments
|
* NoWorkingDirectory = bad arguments
|
||||||
* TimedOut = QProcess timeout
|
* TimedOut = QProcess timeout
|
||||||
*/
|
*/
|
||||||
static DLLEXPORT ProcessResult runCommand(
|
static DLLEXPORT ProcessResult runCommand( RunLocation location,
|
||||||
RunLocation location,
|
const QStringList& args,
|
||||||
const QStringList &args,
|
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) );
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) );
|
||||||
|
|
||||||
/** @brief Convenience wrapper for runCommand().
|
/** @brief Convenience wrapper for runCommand().
|
||||||
* Runs the command in the location specified through the boolean
|
* Runs the command in the location specified through the boolean
|
||||||
* doChroot(), which is what you usually want for running commands
|
* doChroot(), which is what you usually want for running commands
|
||||||
* during installation.
|
* during installation.
|
||||||
*/
|
*/
|
||||||
inline ProcessResult targetEnvCommand(
|
inline ProcessResult targetEnvCommand( const QStringList& args,
|
||||||
const QStringList &args,
|
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) )
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) )
|
||||||
{
|
{
|
||||||
return runCommand(
|
return runCommand(
|
||||||
m_doChroot ? RunLocation::RunInTarget : RunLocation::RunInHost,
|
m_doChroot ? RunLocation::RunInTarget : RunLocation::RunInHost, args, workingPath, stdInput, timeoutSec );
|
||||||
args,
|
|
||||||
workingPath,
|
|
||||||
stdInput,
|
|
||||||
timeoutSec );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code */
|
/** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code */
|
||||||
inline int targetEnvCall( const QStringList& args,
|
inline int targetEnvCall( const QStringList& args,
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) )
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) )
|
||||||
{
|
{
|
||||||
return targetEnvCommand( args, workingPath, stdInput, timeoutSec ).first;
|
return targetEnvCommand( args, workingPath, stdInput, timeoutSec ).first;
|
||||||
}
|
}
|
||||||
@ -174,9 +179,9 @@ public:
|
|||||||
inline int targetEnvCall( const QString& command,
|
inline int targetEnvCall( const QString& command,
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) )
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) )
|
||||||
{
|
{
|
||||||
return targetEnvCall( QStringList{ command }, workingPath, stdInput, timeoutSec );
|
return targetEnvCall( QStringList { command }, workingPath, stdInput, timeoutSec );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code
|
/** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code
|
||||||
@ -187,7 +192,7 @@ public:
|
|||||||
QString& output,
|
QString& output,
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) )
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) )
|
||||||
{
|
{
|
||||||
auto r = targetEnvCommand( args, workingPath, stdInput, timeoutSec );
|
auto r = targetEnvCommand( args, workingPath, stdInput, timeoutSec );
|
||||||
output = r.second;
|
output = r.second;
|
||||||
@ -202,9 +207,9 @@ public:
|
|||||||
QString& output,
|
QString& output,
|
||||||
const QString& workingPath = QString(),
|
const QString& workingPath = QString(),
|
||||||
const QString& stdInput = QString(),
|
const QString& stdInput = QString(),
|
||||||
std::chrono::seconds timeoutSec = std::chrono::seconds(0) )
|
std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) )
|
||||||
{
|
{
|
||||||
return targetEnvOutput( QStringList{ command }, output, workingPath, stdInput, timeoutSec );
|
return targetEnvOutput( QStringList { command }, output, workingPath, stdInput, timeoutSec );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -255,7 +260,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return size, guesstimate-factor
|
* @return size, guesstimate-factor
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QPair<quint64, float> getTotalMemoryB() const;
|
DLLEXPORT QPair< quint64, float > getTotalMemoryB() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief getCpuDescription returns a string describing the CPU.
|
* @brief getCpuDescription returns a string describing the CPU.
|
||||||
@ -279,6 +284,6 @@ private:
|
|||||||
bool m_doChroot;
|
bool m_doChroot;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,34 +32,44 @@
|
|||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
|
|
||||||
static CommandLine get_variant_object( const QVariantMap& m )
|
static CommandLine
|
||||||
|
get_variant_object( const QVariantMap& m )
|
||||||
{
|
{
|
||||||
QString command = CalamaresUtils::getString( m, "command" );
|
QString command = CalamaresUtils::getString( m, "command" );
|
||||||
int timeout = CalamaresUtils::getInteger( m, "timeout", -1 );
|
int timeout = CalamaresUtils::getInteger( m, "timeout", -1 );
|
||||||
|
|
||||||
if ( !command.isEmpty() )
|
if ( !command.isEmpty() )
|
||||||
|
{
|
||||||
return CommandLine( command, timeout >= 0 ? std::chrono::seconds( timeout ) : CommandLine::TimeoutNotSet() );
|
return CommandLine( command, timeout >= 0 ? std::chrono::seconds( timeout ) : CommandLine::TimeoutNotSet() );
|
||||||
|
}
|
||||||
cWarning() << "Bad CommandLine element" << m;
|
cWarning() << "Bad CommandLine element" << m;
|
||||||
return CommandLine();
|
return CommandLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
static CommandList_t get_variant_stringlist( const QVariantList& l )
|
static CommandList_t
|
||||||
|
get_variant_stringlist( const QVariantList& l )
|
||||||
{
|
{
|
||||||
CommandList_t retl;
|
CommandList_t retl;
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
for ( const auto& v : l )
|
for ( const auto& v : l )
|
||||||
{
|
{
|
||||||
if ( v.type() == QVariant::String )
|
if ( v.type() == QVariant::String )
|
||||||
|
{
|
||||||
retl.append( CommandLine( v.toString(), CommandLine::TimeoutNotSet() ) );
|
retl.append( CommandLine( v.toString(), CommandLine::TimeoutNotSet() ) );
|
||||||
|
}
|
||||||
else if ( v.type() == QVariant::Map )
|
else if ( v.type() == QVariant::Map )
|
||||||
{
|
{
|
||||||
auto command( get_variant_object( v.toMap() ) );
|
auto command( get_variant_object( v.toMap() ) );
|
||||||
if ( command.isValid() )
|
if ( command.isValid() )
|
||||||
|
{
|
||||||
retl.append( command );
|
retl.append( command );
|
||||||
|
}
|
||||||
// Otherwise warning is already given
|
// Otherwise warning is already given
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
cWarning() << "Bad CommandList element" << count << v.type() << v;
|
cWarning() << "Bad CommandList element" << count << v.type() << v;
|
||||||
|
}
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
return retl;
|
return retl;
|
||||||
@ -78,37 +88,48 @@ CommandList::CommandList::CommandList( const QVariant& v, bool doChroot, std::ch
|
|||||||
{
|
{
|
||||||
const auto v_list = v.toList();
|
const auto v_list = v.toList();
|
||||||
if ( v_list.count() )
|
if ( v_list.count() )
|
||||||
|
{
|
||||||
append( get_variant_stringlist( v_list ) );
|
append( get_variant_stringlist( v_list ) );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
cWarning() << "Empty CommandList";
|
cWarning() << "Empty CommandList";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if ( v.type() == QVariant::String )
|
else if ( v.type() == QVariant::String )
|
||||||
|
{
|
||||||
append( v.toString() );
|
append( v.toString() );
|
||||||
|
}
|
||||||
else if ( v.type() == QVariant::Map )
|
else if ( v.type() == QVariant::Map )
|
||||||
{
|
{
|
||||||
auto c( get_variant_object( v.toMap() ) );
|
auto c( get_variant_object( v.toMap() ) );
|
||||||
if ( c.isValid() )
|
if ( c.isValid() )
|
||||||
|
{
|
||||||
append( c );
|
append( c );
|
||||||
|
}
|
||||||
// Otherwise warning is already given
|
// Otherwise warning is already given
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
cWarning() << "CommandList does not understand variant" << v.type();
|
cWarning() << "CommandList does not understand variant" << v.type();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandList::~CommandList()
|
CommandList::~CommandList() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
findInCommands( const CommandList& l, const QString& needle )
|
findInCommands( const CommandList& l, const QString& needle )
|
||||||
{
|
{
|
||||||
for ( CommandList::const_iterator i = l.cbegin(); i != l.cend(); ++i )
|
for ( CommandList::const_iterator i = l.cbegin(); i != l.cend(); ++i )
|
||||||
if ( i->command().contains( needle ) )
|
if ( i->command().contains( needle ) )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Calamares::JobResult CommandList::run()
|
Calamares::JobResult
|
||||||
|
CommandList::run()
|
||||||
{
|
{
|
||||||
QLatin1Literal rootMagic( "@@ROOT@@" );
|
QLatin1Literal rootMagic( "@@ROOT@@" );
|
||||||
QLatin1Literal userMagic( "@@USER@@" );
|
QLatin1Literal userMagic( "@@USER@@" );
|
||||||
@ -125,8 +146,11 @@ Calamares::JobResult CommandList::run()
|
|||||||
if ( !gs || !gs->contains( "rootMountPoint" ) )
|
if ( !gs || !gs->contains( "rootMountPoint" ) )
|
||||||
{
|
{
|
||||||
cError() << "No rootMountPoint defined.";
|
cError() << "No rootMountPoint defined.";
|
||||||
return Calamares::JobResult::error( QCoreApplication::translate( "CommandList", "Could not run command." ),
|
return Calamares::JobResult::error(
|
||||||
QCoreApplication::translate( "CommandList", "The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined." ) );
|
QCoreApplication::translate( "CommandList", "Could not run command." ),
|
||||||
|
QCoreApplication::translate( "CommandList",
|
||||||
|
"The command runs in the host environment and needs to know the root "
|
||||||
|
"path, but no rootMountPoint is defined." ) );
|
||||||
}
|
}
|
||||||
root = gs->value( "rootMountPoint" ).toString();
|
root = gs->value( "rootMountPoint" ).toString();
|
||||||
}
|
}
|
||||||
@ -137,7 +161,8 @@ Calamares::JobResult CommandList::run()
|
|||||||
cError() << "No username defined.";
|
cError() << "No username defined.";
|
||||||
return Calamares::JobResult::error(
|
return Calamares::JobResult::error(
|
||||||
QCoreApplication::translate( "CommandList", "Could not run command." ),
|
QCoreApplication::translate( "CommandList", "Could not run command." ),
|
||||||
QCoreApplication::translate( "CommandList", "The command needs to know the user's name, but no username is defined." ) );
|
QCoreApplication::translate( "CommandList",
|
||||||
|
"The command needs to know the user's name, but no username is defined." ) );
|
||||||
}
|
}
|
||||||
QString user = gs->value( "username" ).toString(); // may be blank if unset
|
QString user = gs->value( "username" ).toString(); // may be blank if unset
|
||||||
|
|
||||||
@ -156,17 +181,20 @@ Calamares::JobResult CommandList::run()
|
|||||||
shell_cmd << processed_cmd;
|
shell_cmd << processed_cmd;
|
||||||
|
|
||||||
std::chrono::seconds timeout = i->timeout() >= std::chrono::seconds::zero() ? i->timeout() : m_timeout;
|
std::chrono::seconds timeout = i->timeout() >= std::chrono::seconds::zero() ? i->timeout() : m_timeout;
|
||||||
ProcessResult r = System::runCommand(
|
ProcessResult r = System::runCommand( location, shell_cmd, QString(), QString(), timeout );
|
||||||
location, shell_cmd, QString(), QString(), timeout );
|
|
||||||
|
|
||||||
if ( r.getExitCode() != 0 )
|
if ( r.getExitCode() != 0 )
|
||||||
{
|
{
|
||||||
if ( suppress_result )
|
if ( suppress_result )
|
||||||
|
{
|
||||||
cDebug() << "Error code" << r.getExitCode() << "ignored by CommandList configuration.";
|
cDebug() << "Error code" << r.getExitCode() << "ignored by CommandList configuration.";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return r.explainProcess( processed_cmd, timeout );
|
return r.explainProcess( processed_cmd, timeout );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Calamares::JobResult::ok();
|
return Calamares::JobResult::ok();
|
||||||
}
|
}
|
||||||
@ -177,4 +205,4 @@ CommandList::append( const QString& s )
|
|||||||
append( CommandLine( s, m_timeout ) );
|
append( CommandLine( s, m_timeout ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
@ -35,7 +35,7 @@ namespace CalamaresUtils
|
|||||||
*/
|
*/
|
||||||
struct CommandLine : public QPair< QString, std::chrono::seconds >
|
struct CommandLine : public QPair< QString, std::chrono::seconds >
|
||||||
{
|
{
|
||||||
static inline constexpr std::chrono::seconds TimeoutNotSet() { return std::chrono::seconds(-1); }
|
static inline constexpr std::chrono::seconds TimeoutNotSet() { return std::chrono::seconds( -1 ); }
|
||||||
|
|
||||||
/// An invalid command line
|
/// An invalid command line
|
||||||
CommandLine()
|
CommandLine()
|
||||||
@ -49,25 +49,16 @@ struct CommandLine : public QPair< QString, std::chrono::seconds >
|
|||||||
}
|
}
|
||||||
|
|
||||||
CommandLine( const QString& s, std::chrono::seconds t )
|
CommandLine( const QString& s, std::chrono::seconds t )
|
||||||
: QPair( s, t)
|
: QPair( s, t )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QString command() const
|
QString command() const { return first; }
|
||||||
{
|
|
||||||
return first;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::chrono::seconds timeout() const
|
std::chrono::seconds timeout() const { return second; }
|
||||||
{
|
|
||||||
return second;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isValid() const
|
bool isValid() const { return !first.isEmpty(); }
|
||||||
{
|
};
|
||||||
return !first.isEmpty();
|
|
||||||
}
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** @brief Abbreviation, used internally. */
|
/** @brief Abbreviation, used internally. */
|
||||||
using CommandList_t = QList< CommandLine >;
|
using CommandList_t = QList< CommandLine >;
|
||||||
@ -88,19 +79,16 @@ public:
|
|||||||
CommandList( const QVariant& v, bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) );
|
CommandList( const QVariant& v, bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) );
|
||||||
~CommandList();
|
~CommandList();
|
||||||
|
|
||||||
bool doChroot() const
|
bool doChroot() const { return m_doChroot; }
|
||||||
{
|
|
||||||
return m_doChroot;
|
|
||||||
}
|
|
||||||
|
|
||||||
Calamares::JobResult run();
|
Calamares::JobResult run();
|
||||||
|
|
||||||
using CommandList_t::isEmpty;
|
using CommandList_t::at;
|
||||||
using CommandList_t::count;
|
|
||||||
using CommandList_t::cbegin;
|
using CommandList_t::cbegin;
|
||||||
using CommandList_t::cend;
|
using CommandList_t::cend;
|
||||||
using CommandList_t::const_iterator;
|
using CommandList_t::const_iterator;
|
||||||
using CommandList_t::at;
|
using CommandList_t::count;
|
||||||
|
using CommandList_t::isEmpty;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
using CommandList_t::append;
|
using CommandList_t::append;
|
||||||
@ -109,7 +97,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool m_doChroot;
|
bool m_doChroot;
|
||||||
std::chrono::seconds m_timeout;
|
std::chrono::seconds m_timeout;
|
||||||
} ;
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
#endif
|
#endif
|
||||||
|
@ -101,17 +101,25 @@ mungeEnvironment( QStringList& l, const char* name, const char* defaultDirs )
|
|||||||
|
|
||||||
QStringList dirs = QString( qgetenv( name ) ).split( ':' );
|
QStringList dirs = QString( qgetenv( name ) ).split( ':' );
|
||||||
if ( dirs.isEmpty() )
|
if ( dirs.isEmpty() )
|
||||||
|
{
|
||||||
dirs = QString( defaultDirs ).split( ':' );
|
dirs = QString( defaultDirs ).split( ':' );
|
||||||
|
}
|
||||||
|
|
||||||
for ( auto s : dirs )
|
for ( auto s : dirs )
|
||||||
{
|
{
|
||||||
if ( s.isEmpty() )
|
if ( s.isEmpty() )
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if ( s.endsWith( '/' ) )
|
if ( s.endsWith( '/' ) )
|
||||||
|
{
|
||||||
l << ( s + calamaresSubdir ) << s;
|
l << ( s + calamaresSubdir ) << s;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
l << ( s + '/' + calamaresSubdir ) << ( s + '/' );
|
l << ( s + '/' + calamaresSubdir ) << ( s + '/' );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -127,7 +135,9 @@ QStringList
|
|||||||
extraConfigDirs()
|
extraConfigDirs()
|
||||||
{
|
{
|
||||||
if ( s_haveExtraDirs )
|
if ( s_haveExtraDirs )
|
||||||
|
{
|
||||||
return s_extraConfigDirs;
|
return s_extraConfigDirs;
|
||||||
|
}
|
||||||
return QStringList();
|
return QStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +145,9 @@ QStringList
|
|||||||
extraDataDirs()
|
extraDataDirs()
|
||||||
{
|
{
|
||||||
if ( s_haveExtraDirs )
|
if ( s_haveExtraDirs )
|
||||||
|
{
|
||||||
return s_extraDataDirs;
|
return s_extraDataDirs;
|
||||||
|
}
|
||||||
return QStringList();
|
return QStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,12 +185,16 @@ appLogDir()
|
|||||||
QString path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation );
|
QString path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation );
|
||||||
QDir dir( path );
|
QDir dir( path );
|
||||||
if ( isWritableDir( dir ) )
|
if ( isWritableDir( dir ) )
|
||||||
|
{
|
||||||
return dir;
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
cerr << "warning: Could not find a standard writable location for log dir, falling back to $HOME\n";
|
cerr << "warning: Could not find a standard writable location for log dir, falling back to $HOME\n";
|
||||||
dir = QDir::home();
|
dir = QDir::home();
|
||||||
if ( isWritableDir( dir ) )
|
if ( isWritableDir( dir ) )
|
||||||
|
{
|
||||||
return dir;
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
cerr << "warning: Found no writable location for log dir, falling back to the temp dir\n";
|
cerr << "warning: Found no writable location for log dir, falling back to the temp dir\n";
|
||||||
return QDir::temp();
|
return QDir::temp();
|
||||||
@ -191,4 +207,4 @@ setQmlModulesDir( const QDir& dir )
|
|||||||
s_qmlModulesDir = dir;
|
s_qmlModulesDir = dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
@ -31,43 +31,43 @@
|
|||||||
|
|
||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
DLLEXPORT QDir qmlModulesDir();
|
DLLEXPORT QDir qmlModulesDir();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief appDataDir returns the directory with common application data.
|
* @brief appDataDir returns the directory with common application data.
|
||||||
* Defaults to CMAKE_INSTALL_FULL_DATADIR (usually /usr/share/calamares).
|
* Defaults to CMAKE_INSTALL_FULL_DATADIR (usually /usr/share/calamares).
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QDir appDataDir();
|
DLLEXPORT QDir appDataDir();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief appLogDir returns the directory for Calamares logs.
|
* @brief appLogDir returns the directory for Calamares logs.
|
||||||
* Defaults to QStandardPaths::CacheLocation (usually ~/.cache/Calamares).
|
* Defaults to QStandardPaths::CacheLocation (usually ~/.cache/Calamares).
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QDir appLogDir();
|
DLLEXPORT QDir appLogDir();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief systemLibDir returns the system's lib directory.
|
* @brief systemLibDir returns the system's lib directory.
|
||||||
* Defaults to CMAKE_INSTALL_FULL_LIBDIR (usually /usr/lib64 or /usr/lib).
|
* Defaults to CMAKE_INSTALL_FULL_LIBDIR (usually /usr/lib64 or /usr/lib).
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QDir systemLibDir();
|
DLLEXPORT QDir systemLibDir();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override app data dir. Only for testing purposes.
|
* Override app data dir. Only for testing purposes.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void setAppDataDir( const QDir& dir );
|
DLLEXPORT void setAppDataDir( const QDir& dir );
|
||||||
DLLEXPORT bool isAppDataDirOverridden();
|
DLLEXPORT bool isAppDataDirOverridden();
|
||||||
|
|
||||||
DLLEXPORT void setQmlModulesDir( const QDir& dir );
|
DLLEXPORT void setQmlModulesDir( const QDir& dir );
|
||||||
|
|
||||||
/** @brief Setup extra config and data dirs from the XDG variables.
|
/** @brief Setup extra config and data dirs from the XDG variables.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void setXdgDirs();
|
DLLEXPORT void setXdgDirs();
|
||||||
/** @brief Are any extra directories configured? */
|
/** @brief Are any extra directories configured? */
|
||||||
DLLEXPORT bool haveExtraDirs();
|
DLLEXPORT bool haveExtraDirs();
|
||||||
/** @brief XDG_CONFIG_DIRS, each guaranteed to end with / */
|
/** @brief XDG_CONFIG_DIRS, each guaranteed to end with / */
|
||||||
DLLEXPORT QStringList extraConfigDirs();
|
DLLEXPORT QStringList extraConfigDirs();
|
||||||
/** @brief XDG_DATA_DIRS, each guaranteed to end with / */
|
/** @brief XDG_DATA_DIRS, each guaranteed to end with / */
|
||||||
DLLEXPORT QStringList extraDataDirs();
|
DLLEXPORT QStringList extraDataDirs();
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
@ -30,8 +30,8 @@
|
|||||||
#include <QTime>
|
#include <QTime>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
|
||||||
#include "utils/Dirs.h"
|
|
||||||
#include "CalamaresVersion.h"
|
#include "CalamaresVersion.h"
|
||||||
|
#include "utils/Dirs.h"
|
||||||
|
|
||||||
#define LOGFILE_SIZE 1024 * 256
|
#define LOGFILE_SIZE 1024 * 256
|
||||||
|
|
||||||
@ -48,15 +48,17 @@ namespace Logger
|
|||||||
{
|
{
|
||||||
|
|
||||||
void
|
void
|
||||||
setupLogLevel(unsigned int level)
|
setupLogLevel( unsigned int level )
|
||||||
{
|
{
|
||||||
if ( level > LOGVERBOSE )
|
if ( level > LOGVERBOSE )
|
||||||
|
{
|
||||||
level = LOGVERBOSE;
|
level = LOGVERBOSE;
|
||||||
|
}
|
||||||
s_threshold = level + 1; // Comparison is < in log() function
|
s_threshold = level + 1; // Comparison is < in log() function
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
logLevelEnabled(unsigned int level)
|
logLevelEnabled( unsigned int level )
|
||||||
{
|
{
|
||||||
return level < s_threshold;
|
return level < s_threshold;
|
||||||
}
|
}
|
||||||
@ -77,11 +79,9 @@ log( const char* msg, unsigned int debugLevel )
|
|||||||
// If we don't format the date as a Qt::ISODate then we get a crash when
|
// If we don't format the date as a Qt::ISODate then we get a crash when
|
||||||
// logging at exit as Qt tries to use QLocale to format, but QLocale is
|
// logging at exit as Qt tries to use QLocale to format, but QLocale is
|
||||||
// on its way out.
|
// on its way out.
|
||||||
logfile << QDate::currentDate().toString( Qt::ISODate ).toUtf8().data()
|
logfile << QDate::currentDate().toString( Qt::ISODate ).toUtf8().data() << " - "
|
||||||
<< " - "
|
<< QTime::currentTime().toString().toUtf8().data() << " ["
|
||||||
<< QTime::currentTime().toString().toUtf8().data()
|
<< QString::number( debugLevel ).toUtf8().data() << "]: " << msg << std::endl;
|
||||||
<< " [" << QString::number( debugLevel ).toUtf8().data() << "]: "
|
|
||||||
<< msg << std::endl;
|
|
||||||
|
|
||||||
logfile.flush();
|
logfile.flush();
|
||||||
}
|
}
|
||||||
@ -90,9 +90,8 @@ log( const char* msg, unsigned int debugLevel )
|
|||||||
{
|
{
|
||||||
QMutexLocker lock( &s_mutex );
|
QMutexLocker lock( &s_mutex );
|
||||||
|
|
||||||
std::cout << QTime::currentTime().toString().toUtf8().data()
|
std::cout << QTime::currentTime().toString().toUtf8().data() << " ["
|
||||||
<< " [" << QString::number( debugLevel ).toUtf8().data() << "]: "
|
<< QString::number( debugLevel ).toUtf8().data() << "]: " << msg << std::endl;
|
||||||
<< msg << std::endl;
|
|
||||||
std::cout.flush();
|
std::cout.flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,7 +106,7 @@ CalamaresLogHandler( QtMsgType type, const QMessageLogContext&, const QString& m
|
|||||||
const char* message = ba.constData();
|
const char* message = ba.constData();
|
||||||
|
|
||||||
QMutexLocker locker( &s_mutex );
|
QMutexLocker locker( &s_mutex );
|
||||||
switch( type )
|
switch ( type )
|
||||||
{
|
{
|
||||||
case QtDebugMsg:
|
case QtDebugMsg:
|
||||||
log( message, LOGVERBOSE );
|
log( message, LOGVERBOSE );
|
||||||
@ -164,7 +163,9 @@ setupLogfile()
|
|||||||
QMutexLocker lock( &s_mutex );
|
QMutexLocker lock( &s_mutex );
|
||||||
logfile.open( logFile().toLocal8Bit(), std::ios::app );
|
logfile.open( logFile().toLocal8Bit(), std::ios::app );
|
||||||
if ( logfile.tellp() )
|
if ( logfile.tellp() )
|
||||||
|
{
|
||||||
logfile << "\n\n" << std::endl;
|
logfile << "\n\n" << std::endl;
|
||||||
|
}
|
||||||
logfile << "=== START CALAMARES " << CALAMARES_VERSION << std::endl;
|
logfile << "=== START CALAMARES " << CALAMARES_VERSION << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,14 +184,13 @@ CLog::~CLog()
|
|||||||
log( m_msg.toUtf8().data(), m_debugLevel );
|
log( m_msg.toUtf8().data(), m_debugLevel );
|
||||||
}
|
}
|
||||||
|
|
||||||
CDebug::~CDebug()
|
CDebug::~CDebug() {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const char Continuation[] = "\n ";
|
const char Continuation[] = "\n ";
|
||||||
const char SubEntry[] = " .. ";
|
const char SubEntry[] = " .. ";
|
||||||
|
|
||||||
QString toString( const QVariant& v )
|
QString
|
||||||
|
toString( const QVariant& v )
|
||||||
{
|
{
|
||||||
auto t = v.type();
|
auto t = v.type();
|
||||||
|
|
||||||
@ -199,11 +199,15 @@ QString toString( const QVariant& v )
|
|||||||
QStringList s;
|
QStringList s;
|
||||||
auto l = v.toList();
|
auto l = v.toList();
|
||||||
for ( auto lit = l.constBegin(); lit != l.constEnd(); ++lit )
|
for ( auto lit = l.constBegin(); lit != l.constEnd(); ++lit )
|
||||||
|
{
|
||||||
s << lit->toString();
|
s << lit->toString();
|
||||||
return s.join(", ");
|
}
|
||||||
|
return s.join( ", " );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return v.toString();
|
return v.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace Logger
|
||||||
|
@ -27,11 +27,11 @@
|
|||||||
|
|
||||||
namespace Logger
|
namespace Logger
|
||||||
{
|
{
|
||||||
DLLEXPORT extern const char Continuation[];
|
DLLEXPORT extern const char Continuation[];
|
||||||
DLLEXPORT extern const char SubEntry[];
|
DLLEXPORT extern const char SubEntry[];
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
LOG_DISABLE = 0,
|
LOG_DISABLE = 0,
|
||||||
LOGERROR = 1,
|
LOGERROR = 1,
|
||||||
LOGWARNING = 2,
|
LOGWARNING = 2,
|
||||||
@ -39,47 +39,52 @@ namespace Logger
|
|||||||
LOGEXTRA = 5,
|
LOGEXTRA = 5,
|
||||||
LOGDEBUG = 6,
|
LOGDEBUG = 6,
|
||||||
LOGVERBOSE = 8
|
LOGVERBOSE = 8
|
||||||
} ;
|
};
|
||||||
|
|
||||||
class DLLEXPORT CLog : public QDebug
|
class DLLEXPORT CLog : public QDebug
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit CLog( unsigned int debugLevel );
|
explicit CLog( unsigned int debugLevel );
|
||||||
virtual ~CLog();
|
virtual ~CLog();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_msg;
|
QString m_msg;
|
||||||
unsigned int m_debugLevel;
|
unsigned int m_debugLevel;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLLEXPORT CDebug : public CLog
|
class DLLEXPORT CDebug : public CLog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CDebug( unsigned int debugLevel = LOGDEBUG ) : CLog( debugLevel )
|
CDebug( unsigned int debugLevel = LOGDEBUG )
|
||||||
|
: CLog( debugLevel )
|
||||||
{
|
{
|
||||||
if ( debugLevel <= LOGERROR )
|
if ( debugLevel <= LOGERROR )
|
||||||
|
{
|
||||||
*this << "ERROR:";
|
*this << "ERROR:";
|
||||||
|
}
|
||||||
else if ( debugLevel <= LOGWARNING )
|
else if ( debugLevel <= LOGWARNING )
|
||||||
|
{
|
||||||
*this << "WARNING:";
|
*this << "WARNING:";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
virtual ~CDebug();
|
virtual ~CDebug();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The full path of the log file.
|
* @brief The full path of the log file.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QString logFile();
|
DLLEXPORT QString logFile();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Start logging to the log file.
|
* @brief Start logging to the log file.
|
||||||
*
|
*
|
||||||
* Call this (once) to start logging to the log file (usually
|
* Call this (once) to start logging to the log file (usually
|
||||||
* ~/.cache/calamares/session.log ). An existing log file is
|
* ~/.cache/calamares/session.log ). An existing log file is
|
||||||
* rolled over if it is too large.
|
* rolled over if it is too large.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void setupLogfile();
|
DLLEXPORT void setupLogfile();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set a log level for future logging.
|
* @brief Set a log level for future logging.
|
||||||
*
|
*
|
||||||
* Pass in a value from the LOG* enum, above. Use 0 to
|
* Pass in a value from the LOG* enum, above. Use 0 to
|
||||||
@ -88,15 +93,15 @@ namespace Logger
|
|||||||
*
|
*
|
||||||
* Practical values are 0, 1, 2, and 6.
|
* Practical values are 0, 1, 2, and 6.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void setupLogLevel( unsigned int level );
|
DLLEXPORT void setupLogLevel( unsigned int level );
|
||||||
|
|
||||||
/** @brief Return the configured log-level. */
|
/** @brief Return the configured log-level. */
|
||||||
DLLEXPORT unsigned int logLevel();
|
DLLEXPORT unsigned int logLevel();
|
||||||
|
|
||||||
/** @brief Would the given @p level really be logged? */
|
/** @brief Would the given @p level really be logged? */
|
||||||
DLLEXPORT bool logLevelEnabled( unsigned int level );
|
DLLEXPORT bool logLevelEnabled( unsigned int level );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Row-oriented formatted logging.
|
* @brief Row-oriented formatted logging.
|
||||||
*
|
*
|
||||||
* Use DebugRow to produce multiple rows of 2-column output
|
* Use DebugRow to produce multiple rows of 2-column output
|
||||||
@ -106,20 +111,21 @@ namespace Logger
|
|||||||
* will produce a single timestamped debug line with continuations.
|
* will produce a single timestamped debug line with continuations.
|
||||||
* Each DebugRow produces one line of output, with the two values.
|
* Each DebugRow produces one line of output, with the two values.
|
||||||
*/
|
*/
|
||||||
template<typename T, typename U>
|
template < typename T, typename U >
|
||||||
struct DebugRow
|
struct DebugRow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit DebugRow( const T& t, const U& u )
|
||||||
|
: first( t )
|
||||||
|
, second( u )
|
||||||
{
|
{
|
||||||
public:
|
}
|
||||||
explicit DebugRow(const T& t, const U& u)
|
|
||||||
: first(t)
|
|
||||||
, second(u)
|
|
||||||
{}
|
|
||||||
|
|
||||||
const T& first;
|
const T& first;
|
||||||
const U& second;
|
const U& second;
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief List-oriented formatted logging.
|
* @brief List-oriented formatted logging.
|
||||||
*
|
*
|
||||||
* Use DebugList to produce multiple rows of output in a debugging
|
* Use DebugList to produce multiple rows of output in a debugging
|
||||||
@ -128,16 +134,17 @@ namespace Logger
|
|||||||
* will produce a single timestamped debug line with continuations.
|
* will produce a single timestamped debug line with continuations.
|
||||||
* Each element of the list of strings will be logged on a separate line.
|
* Each element of the list of strings will be logged on a separate line.
|
||||||
*/
|
*/
|
||||||
struct DebugList
|
struct DebugList
|
||||||
{
|
{
|
||||||
explicit DebugList( const QStringList& l )
|
explicit DebugList( const QStringList& l )
|
||||||
: list(l)
|
: list( l )
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
const QStringList& list;
|
const QStringList& list;
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Map-oriented formatted logging.
|
* @brief Map-oriented formatted logging.
|
||||||
*
|
*
|
||||||
* Use DebugMap to produce multiple rows of output in a debugging
|
* Use DebugMap to produce multiple rows of output in a debugging
|
||||||
@ -147,49 +154,54 @@ namespace Logger
|
|||||||
* The continued lines will have a key (from the map) and a value
|
* The continued lines will have a key (from the map) and a value
|
||||||
* on each line.
|
* on each line.
|
||||||
*/
|
*/
|
||||||
struct DebugMap
|
struct DebugMap
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit DebugMap(const QVariantMap& m)
|
explicit DebugMap( const QVariantMap& m )
|
||||||
: map( m )
|
: map( m )
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
const QVariantMap& map;
|
const QVariantMap& map;
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/** @brief output operator for DebugRow */
|
/** @brief output operator for DebugRow */
|
||||||
template<typename T, typename U>
|
template < typename T, typename U >
|
||||||
inline QDebug&
|
inline QDebug&
|
||||||
operator <<( QDebug& s, const DebugRow<T, U>& t )
|
operator<<( QDebug& s, const DebugRow< T, U >& t )
|
||||||
{
|
{
|
||||||
s << Continuation << t.first << ':' << ' ' << t.second;
|
s << Continuation << t.first << ':' << ' ' << t.second;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief output operator for DebugList */
|
/** @brief output operator for DebugList */
|
||||||
inline QDebug&
|
inline QDebug&
|
||||||
operator <<( QDebug& s, const DebugList& c )
|
operator<<( QDebug& s, const DebugList& c )
|
||||||
|
{
|
||||||
|
for ( const auto& i : c.list )
|
||||||
{
|
{
|
||||||
for( const auto& i : c.list )
|
|
||||||
s << Continuation << i;
|
s << Continuation << i;
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/** @brief supporting method for outputting a DebugMap */
|
/** @brief supporting method for outputting a DebugMap */
|
||||||
QString toString( const QVariant& v );
|
QString toString( const QVariant& v );
|
||||||
|
|
||||||
/** @brief output operator for DebugMap */
|
/** @brief output operator for DebugMap */
|
||||||
inline QDebug&
|
inline QDebug&
|
||||||
operator <<( QDebug& s, const DebugMap& t )
|
operator<<( QDebug& s, const DebugMap& t )
|
||||||
{
|
{
|
||||||
for ( auto it = t.map.constBegin(); it != t.map.constEnd(); ++it )
|
for ( auto it = t.map.constBegin(); it != t.map.constEnd(); ++it )
|
||||||
|
{
|
||||||
s << Continuation << it.key().toUtf8().constData() << ':' << ' ' << toString( it.value() ).toUtf8().constData();
|
s << Continuation << it.key().toUtf8().constData() << ':' << ' ' << toString( it.value() ).toUtf8().constData();
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
} // namespace
|
return s;
|
||||||
|
}
|
||||||
|
} // namespace Logger
|
||||||
|
|
||||||
#define cDebug Logger::CDebug
|
#define cDebug Logger::CDebug
|
||||||
#define cWarning() Logger::CDebug(Logger::LOGWARNING)
|
#define cWarning() Logger::CDebug( Logger::LOGWARNING )
|
||||||
#define cError() Logger::CDebug(Logger::LOGERROR)
|
#define cError() Logger::CDebug( Logger::LOGERROR )
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,12 +31,12 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
/** @brief Type for collecting parts of a named enum. */
|
/** @brief Type for collecting parts of a named enum. */
|
||||||
template<typename T>
|
template < typename T >
|
||||||
struct NamedEnumTable
|
struct NamedEnumTable
|
||||||
{
|
{
|
||||||
using string_t = QString;
|
using string_t = QString;
|
||||||
@ -53,7 +53,11 @@ struct NamedEnumTable
|
|||||||
*
|
*
|
||||||
* static const NamedEnumTable<Colors> c{ {"red", Colors::Red } };
|
* static const NamedEnumTable<Colors> c{ {"red", Colors::Red } };
|
||||||
*/
|
*/
|
||||||
NamedEnumTable( const std::initializer_list< pair_t >& v ) : table( v ) { /* static_assert( v.size() > 0 ); */ }
|
NamedEnumTable( const std::initializer_list< pair_t >& v )
|
||||||
|
: table( v )
|
||||||
|
{
|
||||||
|
/* static_assert( v.size() > 0 ); */
|
||||||
|
}
|
||||||
|
|
||||||
/** @brief Find a name @p s in the table.
|
/** @brief Find a name @p s in the table.
|
||||||
*
|
*
|
||||||
@ -89,8 +93,8 @@ struct NamedEnumTable
|
|||||||
{
|
{
|
||||||
ok = false;
|
ok = false;
|
||||||
|
|
||||||
for ( const auto &p : table )
|
for ( const auto& p : table )
|
||||||
if ( s == p.second)
|
if ( s == p.second )
|
||||||
{
|
{
|
||||||
ok = true;
|
ok = true;
|
||||||
return p.first;
|
return p.first;
|
||||||
@ -99,13 +103,14 @@ struct NamedEnumTable
|
|||||||
// ok is still false
|
// ok is still false
|
||||||
return string_t();
|
return string_t();
|
||||||
}
|
}
|
||||||
} ;
|
};
|
||||||
|
|
||||||
/** @brief Smashes an enum value to its underlying type. */
|
/** @brief Smashes an enum value to its underlying type. */
|
||||||
template<typename E>
|
template < typename E >
|
||||||
constexpr typename std::underlying_type<E>::type smash( const E e )
|
constexpr typename std::underlying_type< E >::type
|
||||||
|
smash( const E e )
|
||||||
{
|
{
|
||||||
return static_cast<typename std::underlying_type<E>::type>( e );
|
return static_cast< typename std::underlying_type< E >::type >( e );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
#include "NamedEnum.h"
|
#include "NamedEnum.h"
|
||||||
|
|
||||||
/** @brief Template that takes the enum type to work with and a special none-enum. */
|
/** @brief Template that takes the enum type to work with and a special none-enum. */
|
||||||
template<typename T, T _none>
|
template < typename T, T _none >
|
||||||
class NamedSuffix
|
class NamedSuffix
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -52,7 +52,7 @@ public:
|
|||||||
|
|
||||||
/** @brief Empty value. */
|
/** @brief Empty value. */
|
||||||
NamedSuffix()
|
NamedSuffix()
|
||||||
: m_value(0)
|
: m_value( 0 )
|
||||||
, m_unit( none )
|
, m_unit( none )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -69,10 +69,10 @@ public:
|
|||||||
* This parses the given string @p s by comparing with the suffixes
|
* This parses the given string @p s by comparing with the suffixes
|
||||||
* in @p table and uses the first matching suffix as the unit.
|
* in @p table and uses the first matching suffix as the unit.
|
||||||
*/
|
*/
|
||||||
NamedSuffix( const NamedEnumTable<T>& table, const QString& s )
|
NamedSuffix( const NamedEnumTable< T >& table, const QString& s )
|
||||||
: NamedSuffix()
|
: NamedSuffix()
|
||||||
{
|
{
|
||||||
for( const auto& suffix : table.table )
|
for ( const auto& suffix : table.table )
|
||||||
if ( s.endsWith( suffix.first ) )
|
if ( s.endsWith( suffix.first ) )
|
||||||
{
|
{
|
||||||
m_value = s.left( s.length() - suffix.first.length() ).toInt();
|
m_value = s.left( s.length() - suffix.first.length() ).toInt();
|
||||||
|
@ -32,23 +32,24 @@ namespace Calamares
|
|||||||
|
|
||||||
class PluginFactoryPrivate
|
class PluginFactoryPrivate
|
||||||
{
|
{
|
||||||
Q_DECLARE_PUBLIC(PluginFactory)
|
Q_DECLARE_PUBLIC( PluginFactory )
|
||||||
protected:
|
protected:
|
||||||
typedef QPair<const QMetaObject *, PluginFactory::CreateInstanceFunction> Plugin;
|
typedef QPair< const QMetaObject*, PluginFactory::CreateInstanceFunction > Plugin;
|
||||||
|
|
||||||
PluginFactoryPrivate()
|
PluginFactoryPrivate()
|
||||||
: catalogInitialized( false )
|
: catalogInitialized( false )
|
||||||
, q_ptr( nullptr )
|
, q_ptr( nullptr )
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
~PluginFactoryPrivate() {}
|
~PluginFactoryPrivate() {}
|
||||||
|
|
||||||
QHash<QString, Plugin> createInstanceHash;
|
QHash< QString, Plugin > createInstanceHash;
|
||||||
QString catalogName;
|
QString catalogName;
|
||||||
bool catalogInitialized;
|
bool catalogInitialized;
|
||||||
|
|
||||||
PluginFactory *q_ptr;
|
PluginFactory* q_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace Calamares
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,27 +26,30 @@
|
|||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
|
|
||||||
|
|
||||||
namespace CalamaresUtils {
|
namespace CalamaresUtils
|
||||||
|
{
|
||||||
static QTranslator* s_brandingTranslator = nullptr;
|
static QTranslator* s_brandingTranslator = nullptr;
|
||||||
static QTranslator* s_translator = nullptr;
|
static QTranslator* s_translator = nullptr;
|
||||||
static QString s_translatorLocaleName;
|
static QString s_translatorLocaleName;
|
||||||
|
|
||||||
void
|
void
|
||||||
installTranslator( const QLocale& locale,
|
installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent )
|
||||||
const QString& brandingTranslationsPrefix,
|
|
||||||
QObject* parent )
|
|
||||||
{
|
{
|
||||||
QString localeName = locale.name();
|
QString localeName = locale.name();
|
||||||
localeName.replace( "-", "_" );
|
localeName.replace( "-", "_" );
|
||||||
|
|
||||||
if ( localeName == "C" )
|
if ( localeName == "C" )
|
||||||
|
{
|
||||||
localeName = "en";
|
localeName = "en";
|
||||||
|
}
|
||||||
|
|
||||||
// Special case of sr@latin
|
// Special case of sr@latin
|
||||||
//
|
//
|
||||||
// See top-level CMakeLists.txt about special cases for translation loading.
|
// See top-level CMakeLists.txt about special cases for translation loading.
|
||||||
if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript )
|
if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript )
|
||||||
|
{
|
||||||
localeName = QStringLiteral( "sr@latin" );
|
localeName = QStringLiteral( "sr@latin" );
|
||||||
|
}
|
||||||
|
|
||||||
cDebug() << "Looking for translations for" << localeName;
|
cDebug() << "Looking for translations for" << localeName;
|
||||||
|
|
||||||
@ -56,19 +59,14 @@ installTranslator( const QLocale& locale,
|
|||||||
if ( !brandingTranslationsPrefix.isEmpty() )
|
if ( !brandingTranslationsPrefix.isEmpty() )
|
||||||
{
|
{
|
||||||
QString brandingTranslationsDirPath( brandingTranslationsPrefix );
|
QString brandingTranslationsDirPath( brandingTranslationsPrefix );
|
||||||
brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf(
|
brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) );
|
||||||
QDir::separator() ) );
|
|
||||||
QDir brandingTranslationsDir( brandingTranslationsDirPath );
|
QDir brandingTranslationsDir( brandingTranslationsDirPath );
|
||||||
if ( brandingTranslationsDir.exists() )
|
if ( brandingTranslationsDir.exists() )
|
||||||
{
|
{
|
||||||
QString filenameBase( brandingTranslationsPrefix );
|
QString filenameBase( brandingTranslationsPrefix );
|
||||||
filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf(
|
filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) + 1 );
|
||||||
QDir::separator() ) + 1 );
|
|
||||||
translator = new QTranslator( parent );
|
translator = new QTranslator( parent );
|
||||||
if ( translator->load( locale,
|
if ( translator->load( locale, filenameBase, "_", brandingTranslationsDir.absolutePath() ) )
|
||||||
filenameBase,
|
|
||||||
"_",
|
|
||||||
brandingTranslationsDir.absolutePath() ) )
|
|
||||||
{
|
{
|
||||||
cDebug() << Logger::SubEntry << "Branding using locale:" << localeName;
|
cDebug() << Logger::SubEntry << "Branding using locale:" << localeName;
|
||||||
}
|
}
|
||||||
@ -121,19 +119,22 @@ translatorLocaleName()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Retranslator::attachRetranslator( QObject* parent,
|
Retranslator::attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc )
|
||||||
std::function< void ( void ) > retranslateFunc )
|
|
||||||
{
|
{
|
||||||
Retranslator* r = nullptr;
|
Retranslator* r = nullptr;
|
||||||
for ( QObject* child : parent->children() )
|
for ( QObject* child : parent->children() )
|
||||||
{
|
{
|
||||||
r = qobject_cast< Retranslator* >( child );
|
r = qobject_cast< Retranslator* >( child );
|
||||||
if ( r )
|
if ( r )
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( !r )
|
if ( !r )
|
||||||
|
{
|
||||||
r = new Retranslator( parent );
|
r = new Retranslator( parent );
|
||||||
|
}
|
||||||
|
|
||||||
r->m_retranslateFuncList.append( retranslateFunc );
|
r->m_retranslateFuncList.append( retranslateFunc );
|
||||||
retranslateFunc();
|
retranslateFunc();
|
||||||
@ -155,9 +156,11 @@ Retranslator::eventFilter( QObject* obj, QEvent* e )
|
|||||||
if ( e->type() == QEvent::LanguageChange )
|
if ( e->type() == QEvent::LanguageChange )
|
||||||
{
|
{
|
||||||
foreach ( std::function< void() > func, m_retranslateFuncList )
|
foreach ( std::function< void() > func, m_retranslateFuncList )
|
||||||
|
{
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// pass the event on to the base
|
// pass the event on to the base
|
||||||
return QObject::eventFilter( obj, e );
|
return QObject::eventFilter( obj, e );
|
||||||
}
|
}
|
||||||
|
@ -32,24 +32,21 @@ class QLocale;
|
|||||||
|
|
||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @brief installTranslator changes the application language.
|
* @brief installTranslator changes the application language.
|
||||||
* @param locale the new locale.
|
* @param locale the new locale.
|
||||||
* @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding.
|
* @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding.
|
||||||
* @param parent the parent QObject.
|
* @param parent the parent QObject.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void installTranslator( const QLocale& locale,
|
DLLEXPORT void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent );
|
||||||
const QString& brandingTranslationsPrefix,
|
|
||||||
QObject* parent );
|
|
||||||
|
|
||||||
DLLEXPORT QString translatorLocaleName();
|
DLLEXPORT QString translatorLocaleName();
|
||||||
|
|
||||||
class Retranslator : public QObject
|
class Retranslator : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static void attachRetranslator( QObject* parent,
|
static void attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc );
|
||||||
std::function< void( void ) > retranslateFunc );
|
|
||||||
|
|
||||||
void addRetranslateFunc( std::function< void( void ) > retranslateFunc );
|
void addRetranslateFunc( std::function< void( void ) > retranslateFunc );
|
||||||
|
|
||||||
@ -63,11 +60,10 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#define CALAMARES_RETRANSLATE(body) \
|
#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } );
|
||||||
CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } );
|
#define CALAMARES_RETRANSLATE_WIDGET( widget, body ) \
|
||||||
#define CALAMARES_RETRANSLATE_WIDGET(widget,body) \
|
|
||||||
CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } );
|
CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -74,7 +74,7 @@ removeDiacritics( const QString& string )
|
|||||||
// *INDENT-ON*
|
// *INDENT-ON*
|
||||||
|
|
||||||
QString output;
|
QString output;
|
||||||
for ( const QChar &c : string )
|
for ( const QChar& c : string )
|
||||||
{
|
{
|
||||||
int i = diacriticLetters.indexOf( c );
|
int i = diacriticLetters.indexOf( c );
|
||||||
if ( i < 0 )
|
if ( i < 0 )
|
||||||
@ -119,14 +119,14 @@ QString
|
|||||||
obscure( const QString& string )
|
obscure( const QString& string )
|
||||||
{
|
{
|
||||||
QString result;
|
QString result;
|
||||||
const QChar *unicode = string.unicode();
|
const QChar* unicode = string.unicode();
|
||||||
for ( int i = 0; i < string.length(); ++i )
|
for ( int i = 0; i < string.length(); ++i )
|
||||||
// yes, no typo. can't encode ' ' or '!' because
|
// yes, no typo. can't encode ' ' or '!' because
|
||||||
// they're the unicode BOM. stupid scrambling. stupid.
|
// they're the unicode BOM. stupid scrambling. stupid.
|
||||||
result += ( unicode[ i ].unicode() <= 0x21 ) ?
|
{
|
||||||
unicode[ i ] :
|
result += ( unicode[ i ].unicode() <= 0x21 ) ? unicode[ i ] : QChar( 0x1001F - unicode[ i ].unicode() );
|
||||||
QChar( 0x1001F - unicode[ i ].unicode() );
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace CalamaresUtils
|
||||||
|
@ -34,20 +34,20 @@
|
|||||||
*/
|
*/
|
||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @brief removeDiacritics replaces letters with diacritics and ligatures with
|
* @brief removeDiacritics replaces letters with diacritics and ligatures with
|
||||||
* alternative forms and digraphs.
|
* alternative forms and digraphs.
|
||||||
* @param string the string to transform.
|
* @param string the string to transform.
|
||||||
* @return the output string with plain characters.
|
* @return the output string with plain characters.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QString removeDiacritics( const QString& string );
|
DLLEXPORT QString removeDiacritics( const QString& string );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief obscure is a bidirectional obfuscation function, from KStringHandler.
|
* @brief obscure is a bidirectional obfuscation function, from KStringHandler.
|
||||||
* @param string the input string.
|
* @param string the input string.
|
||||||
* @return the obfuscated string.
|
* @return the obfuscated string.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QString obscure( const QString& string );
|
DLLEXPORT QString obscure( const QString& string );
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,76 +26,88 @@ namespace CalamaresUtils
|
|||||||
{
|
{
|
||||||
|
|
||||||
/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */
|
/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */
|
||||||
constexpr qint64 operator ""_KiB( unsigned long long m )
|
constexpr qint64 operator""_KiB( unsigned long long m )
|
||||||
{
|
{
|
||||||
return qint64(m) * 1024;
|
return qint64( m ) * 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */
|
/** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */
|
||||||
constexpr qint64 operator ""_MiB( unsigned long long m )
|
constexpr qint64 operator""_MiB( unsigned long long m )
|
||||||
{
|
{
|
||||||
return operator ""_KiB(m) * 1024;
|
return operator""_KiB(m)*1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */
|
/** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */
|
||||||
constexpr qint64 operator ""_GiB( unsigned long long m )
|
constexpr qint64 operator""_GiB( unsigned long long m )
|
||||||
{
|
{
|
||||||
return operator ""_MiB(m) * 1024;
|
return operator""_MiB(m)*1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 KiBtoBytes( unsigned long long m )
|
constexpr qint64
|
||||||
|
KiBtoBytes( unsigned long long m )
|
||||||
{
|
{
|
||||||
return operator ""_KiB( m );
|
return operator""_KiB( m );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 MiBtoBytes( unsigned long long m )
|
constexpr qint64
|
||||||
|
MiBtoBytes( unsigned long long m )
|
||||||
{
|
{
|
||||||
return operator ""_MiB( m );
|
return operator""_MiB( m );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 GiBtoBytes( unsigned long long m )
|
constexpr qint64
|
||||||
|
GiBtoBytes( unsigned long long m )
|
||||||
{
|
{
|
||||||
return operator ""_GiB( m );
|
return operator""_GiB( m );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 KiBtoBytes( double m )
|
constexpr qint64
|
||||||
|
KiBtoBytes( double m )
|
||||||
{
|
{
|
||||||
return qint64(m * 1024);
|
return qint64( m * 1024 );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 MiBtoBytes( double m )
|
constexpr qint64
|
||||||
|
MiBtoBytes( double m )
|
||||||
{
|
{
|
||||||
return qint64(m * 1024 * 1024);
|
return qint64( m * 1024 * 1024 );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 GiBtoBytes( double m )
|
constexpr qint64
|
||||||
|
GiBtoBytes( double m )
|
||||||
{
|
{
|
||||||
return qint64(m * 1024 * 1024 * 1024);
|
return qint64( m * 1024 * 1024 * 1024 );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr int BytesToMiB( qint64 b )
|
constexpr int
|
||||||
|
BytesToMiB( qint64 b )
|
||||||
{
|
{
|
||||||
return int( b / 1024 / 1024 );
|
return int( b / 1024 / 1024 );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr int BytesToGiB( qint64 b )
|
constexpr int
|
||||||
|
BytesToGiB( qint64 b )
|
||||||
{
|
{
|
||||||
return int( b / 1024 / 1024 / 1024 );
|
return int( b / 1024 / 1024 / 1024 );
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 alignBytesToBlockSize( qint64 bytes, qint64 blocksize )
|
constexpr qint64
|
||||||
|
alignBytesToBlockSize( qint64 bytes, qint64 blocksize )
|
||||||
{
|
{
|
||||||
qint64 blocks = bytes / blocksize;
|
qint64 blocks = bytes / blocksize;
|
||||||
|
|
||||||
if ( blocks * blocksize != bytes )
|
if ( blocks * blocksize != bytes )
|
||||||
|
{
|
||||||
++blocks;
|
++blocks;
|
||||||
|
}
|
||||||
return blocks * blocksize;
|
return blocks * blocksize;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr qint64 bytesToSectors( qint64 bytes, qint64 blocksize )
|
constexpr qint64
|
||||||
|
bytesToSectors( qint64 bytes, qint64 blocksize )
|
||||||
{
|
{
|
||||||
return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize), MiBtoBytes(1ULL) ) / blocksize;
|
return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize ), MiBtoBytes( 1ULL ) ) / blocksize;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
#endif
|
#endif
|
||||||
|
@ -39,21 +39,25 @@ getBool( const QVariantMap& map, const QString& key, bool d )
|
|||||||
{
|
{
|
||||||
auto v = map.value( key );
|
auto v = map.value( key );
|
||||||
if ( v.type() == QVariant::Bool )
|
if ( v.type() == QVariant::Bool )
|
||||||
|
{
|
||||||
result = v.toBool();
|
result = v.toBool();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
getString(const QVariantMap& map, const QString& key)
|
getString( const QVariantMap& map, const QString& key )
|
||||||
{
|
{
|
||||||
if ( map.contains( key ) )
|
if ( map.contains( key ) )
|
||||||
{
|
{
|
||||||
auto v = map.value( key );
|
auto v = map.value( key );
|
||||||
if ( v.type() == QVariant::String )
|
if ( v.type() == QVariant::String )
|
||||||
|
{
|
||||||
return v.toString();
|
return v.toString();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,8 +69,10 @@ getInteger( const QVariantMap& map, const QString& key, int d )
|
|||||||
{
|
{
|
||||||
auto v = map.value( key );
|
auto v = map.value( key );
|
||||||
if ( v.type() == QVariant::Int )
|
if ( v.type() == QVariant::Int )
|
||||||
|
{
|
||||||
result = v.toInt();
|
result = v.toInt();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -79,10 +85,14 @@ getDouble( const QVariantMap& map, const QString& key, double d )
|
|||||||
{
|
{
|
||||||
auto v = map.value( key );
|
auto v = map.value( key );
|
||||||
if ( v.type() == QVariant::Int )
|
if ( v.type() == QVariant::Int )
|
||||||
|
{
|
||||||
result = v.toInt();
|
result = v.toInt();
|
||||||
|
}
|
||||||
else if ( v.type() == QVariant::Double )
|
else if ( v.type() == QVariant::Double )
|
||||||
|
{
|
||||||
result = v.toDouble();
|
result = v.toDouble();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -104,4 +114,4 @@ getSubMap( const QVariantMap& map, const QString& key, bool& success )
|
|||||||
return QVariantMap();
|
return QVariantMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace CalamaresUtils
|
||||||
|
@ -27,28 +27,28 @@
|
|||||||
|
|
||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get a bool value from a mapping with a given key; returns the default
|
* Get a bool value from a mapping with a given key; returns the default
|
||||||
* if no value is stored in the map.
|
* if no value is stored in the map.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d );
|
DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a string value from a mapping; returns empty QString if no value.
|
* Get a string value from a mapping; returns empty QString if no value.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QString getString( const QVariantMap& map, const QString& key );
|
DLLEXPORT QString getString( const QVariantMap& map, const QString& key );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an integer value from a mapping; returns @p d if no value.
|
* Get an integer value from a mapping; returns @p d if no value.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT int getInteger( const QVariantMap& map, const QString& key, int d );
|
DLLEXPORT int getInteger( const QVariantMap& map, const QString& key, int d );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a double value from a mapping (integers are converted); returns @p d if no value.
|
* Get a double value from a mapping (integers are converted); returns @p d if no value.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT double getDouble( const QVariantMap& map, const QString& key, double d );
|
DLLEXPORT double getDouble( const QVariantMap& map, const QString& key, double d );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a sub-map (i.e. a nested map) from the given mapping with the
|
* Returns a sub-map (i.e. a nested map) from the given mapping with the
|
||||||
* given key. @p success is set to true if the @p key exists
|
* given key. @p success is set to true if the @p key exists
|
||||||
* in @p map and converts to a map, false otherwise.
|
* in @p map and converts to a map, false otherwise.
|
||||||
@ -56,7 +56,7 @@ namespace CalamaresUtils
|
|||||||
* Returns an empty map if there is no such key or it is not a map-value.
|
* Returns an empty map if there is no such key or it is not a map-value.
|
||||||
* (e.g. if @p success is false).
|
* (e.g. if @p success is false).
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QVariantMap getSubMap( const QVariantMap& map, const QString& key, bool& success );
|
DLLEXPORT QVariantMap getSubMap( const QVariantMap& map, const QString& key, bool& success );
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -70,13 +70,21 @@ yamlScalarToVariant( const YAML::Node& scalarNode )
|
|||||||
std::string stdScalar = scalarNode.as< std::string >();
|
std::string stdScalar = scalarNode.as< std::string >();
|
||||||
QString scalarString = QString::fromStdString( stdScalar );
|
QString scalarString = QString::fromStdString( stdScalar );
|
||||||
if ( _yamlScalarTrueValues.exactMatch( scalarString ) )
|
if ( _yamlScalarTrueValues.exactMatch( scalarString ) )
|
||||||
|
{
|
||||||
return QVariant( true );
|
return QVariant( true );
|
||||||
|
}
|
||||||
if ( _yamlScalarFalseValues.exactMatch( scalarString ) )
|
if ( _yamlScalarFalseValues.exactMatch( scalarString ) )
|
||||||
|
{
|
||||||
return QVariant( false );
|
return QVariant( false );
|
||||||
|
}
|
||||||
if ( QRegExp( "[-+]?\\d+" ).exactMatch( scalarString ) )
|
if ( QRegExp( "[-+]?\\d+" ).exactMatch( scalarString ) )
|
||||||
|
{
|
||||||
return QVariant( scalarString.toInt() );
|
return QVariant( scalarString.toInt() );
|
||||||
|
}
|
||||||
if ( QRegExp( "[-+]?\\d*\\.?\\d+" ).exactMatch( scalarString ) )
|
if ( QRegExp( "[-+]?\\d*\\.?\\d+" ).exactMatch( scalarString ) )
|
||||||
|
{
|
||||||
return QVariant( scalarString.toDouble() );
|
return QVariant( scalarString.toDouble() );
|
||||||
|
}
|
||||||
return QVariant( scalarString );
|
return QVariant( scalarString );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,8 +93,7 @@ QVariant
|
|||||||
yamlSequenceToVariant( const YAML::Node& sequenceNode )
|
yamlSequenceToVariant( const YAML::Node& sequenceNode )
|
||||||
{
|
{
|
||||||
QVariantList vl;
|
QVariantList vl;
|
||||||
for ( YAML::const_iterator it = sequenceNode.begin();
|
for ( YAML::const_iterator it = sequenceNode.begin(); it != sequenceNode.end(); ++it )
|
||||||
it != sequenceNode.end(); ++it )
|
|
||||||
{
|
{
|
||||||
vl << yamlToVariant( *it );
|
vl << yamlToVariant( *it );
|
||||||
}
|
}
|
||||||
@ -98,17 +105,15 @@ QVariant
|
|||||||
yamlMapToVariant( const YAML::Node& mapNode )
|
yamlMapToVariant( const YAML::Node& mapNode )
|
||||||
{
|
{
|
||||||
QVariantMap vm;
|
QVariantMap vm;
|
||||||
for ( YAML::const_iterator it = mapNode.begin();
|
for ( YAML::const_iterator it = mapNode.begin(); it != mapNode.end(); ++it )
|
||||||
it != mapNode.end(); ++it )
|
|
||||||
{
|
{
|
||||||
vm.insert( QString::fromStdString( it->first.as< std::string >() ),
|
vm.insert( QString::fromStdString( it->first.as< std::string >() ), yamlToVariant( it->second ) );
|
||||||
yamlToVariant( it->second ) );
|
|
||||||
}
|
}
|
||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList
|
QStringList
|
||||||
yamlToStringList(const YAML::Node& listNode)
|
yamlToStringList( const YAML::Node& listNode )
|
||||||
{
|
{
|
||||||
QStringList l;
|
QStringList l;
|
||||||
listNode >> l;
|
listNode >> l;
|
||||||
@ -117,7 +122,7 @@ yamlToStringList(const YAML::Node& listNode)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
explainYamlException( const YAML::Exception& e, const QByteArray& yamlData, const char *label )
|
explainYamlException( const YAML::Exception& e, const QByteArray& yamlData, const char* label )
|
||||||
{
|
{
|
||||||
cWarning() << "YAML error " << e.what() << "in" << label << '.';
|
cWarning() << "YAML error " << e.what() << "in" << label << '.';
|
||||||
explainYamlException( e, yamlData );
|
explainYamlException( e, yamlData );
|
||||||
@ -142,7 +147,9 @@ explainYamlException( const YAML::Exception& e, const QByteArray& yamlData )
|
|||||||
linestart = yamlData.indexOf( '\n', linestart );
|
linestart = yamlData.indexOf( '\n', linestart );
|
||||||
// No more \ns found, weird
|
// No more \ns found, weird
|
||||||
if ( linestart < 0 )
|
if ( linestart < 0 )
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
linestart += 1; // Skip that \n
|
linestart += 1; // Skip that \n
|
||||||
}
|
}
|
||||||
int lineend = linestart;
|
int lineend = linestart;
|
||||||
@ -150,34 +157,43 @@ explainYamlException( const YAML::Exception& e, const QByteArray& yamlData )
|
|||||||
{
|
{
|
||||||
lineend = yamlData.indexOf( '\n', linestart );
|
lineend = yamlData.indexOf( '\n', linestart );
|
||||||
if ( lineend < 0 )
|
if ( lineend < 0 )
|
||||||
|
{
|
||||||
lineend = yamlData.length();
|
lineend = yamlData.length();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int rangestart = linestart;
|
int rangestart = linestart;
|
||||||
int rangeend = lineend;
|
int rangeend = lineend;
|
||||||
// Adjust range (linestart..lineend) so it's not too long
|
// Adjust range (linestart..lineend) so it's not too long
|
||||||
if ( ( linestart >= 0 ) && ( e.mark.column > 30 ) )
|
if ( ( linestart >= 0 ) && ( e.mark.column > 30 ) )
|
||||||
|
{
|
||||||
rangestart += ( e.mark.column - 30 );
|
rangestart += ( e.mark.column - 30 );
|
||||||
|
}
|
||||||
if ( ( linestart >= 0 ) && ( rangeend - rangestart > 40 ) )
|
if ( ( linestart >= 0 ) && ( rangeend - rangestart > 40 ) )
|
||||||
|
{
|
||||||
rangeend = rangestart + 40;
|
rangeend = rangestart + 40;
|
||||||
|
}
|
||||||
|
|
||||||
if ( linestart >= 0 )
|
if ( linestart >= 0 )
|
||||||
cWarning() << "offending YAML data:" << yamlData.mid( rangestart, rangeend-rangestart ).constData();
|
{
|
||||||
|
cWarning() << "offending YAML data:" << yamlData.mid( rangestart, rangeend - rangestart ).constData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap
|
QVariantMap
|
||||||
loadYaml(const QFileInfo& fi, bool* ok)
|
loadYaml( const QFileInfo& fi, bool* ok )
|
||||||
{
|
{
|
||||||
return loadYaml( fi.absoluteFilePath(), ok );
|
return loadYaml( fi.absoluteFilePath(), ok );
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap
|
QVariantMap
|
||||||
loadYaml(const QString& filename, bool* ok)
|
loadYaml( const QString& filename, bool* ok )
|
||||||
{
|
{
|
||||||
if ( ok )
|
if ( ok )
|
||||||
|
{
|
||||||
*ok = false;
|
*ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
QFile yamlFile( filename );
|
QFile yamlFile( filename );
|
||||||
QVariant yamlContents;
|
QVariant yamlContents;
|
||||||
@ -197,12 +213,12 @@ loadYaml(const QString& filename, bool* ok)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ( yamlContents.isValid() &&
|
if ( yamlContents.isValid() && !yamlContents.isNull() && yamlContents.type() == QVariant::Map )
|
||||||
!yamlContents.isNull() &&
|
|
||||||
yamlContents.type() == QVariant::Map )
|
|
||||||
{
|
{
|
||||||
if ( ok )
|
if ( ok )
|
||||||
|
{
|
||||||
*ok = true;
|
*ok = true;
|
||||||
|
}
|
||||||
return yamlContents.toMap();
|
return yamlContents.toMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +230,9 @@ static void
|
|||||||
writeIndent( QFile& f, int indent )
|
writeIndent( QFile& f, int indent )
|
||||||
{
|
{
|
||||||
while ( indent-- > 0 )
|
while ( indent-- > 0 )
|
||||||
|
{
|
||||||
f.write( " " );
|
f.write( " " );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// forward declaration
|
// forward declaration
|
||||||
@ -229,7 +247,9 @@ static void
|
|||||||
dumpYamlElement( QFile& f, const QVariant& value, int indent )
|
dumpYamlElement( QFile& f, const QVariant& value, int indent )
|
||||||
{
|
{
|
||||||
if ( value.type() == QVariant::Type::Bool )
|
if ( value.type() == QVariant::Type::Bool )
|
||||||
|
{
|
||||||
f.write( value.toBool() ? "true" : "false" );
|
f.write( value.toBool() ? "true" : "false" );
|
||||||
|
}
|
||||||
else if ( value.type() == QVariant::Type::String )
|
else if ( value.type() == QVariant::Type::String )
|
||||||
{
|
{
|
||||||
f.write( quote );
|
f.write( quote );
|
||||||
@ -251,17 +271,19 @@ dumpYamlElement( QFile& f, const QVariant& value, int indent )
|
|||||||
{
|
{
|
||||||
++c;
|
++c;
|
||||||
f.write( newline );
|
f.write( newline );
|
||||||
writeIndent( f, indent+1 );
|
writeIndent( f, indent + 1 );
|
||||||
f.write( "- " );
|
f.write( "- " );
|
||||||
dumpYamlElement( f, it, indent+1 );
|
dumpYamlElement( f, it, indent + 1 );
|
||||||
}
|
}
|
||||||
if ( !c ) // i.e. list was empty
|
if ( !c ) // i.e. list was empty
|
||||||
|
{
|
||||||
f.write( "[]" );
|
f.write( "[]" );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if ( value.type() == QVariant::Type::Map )
|
else if ( value.type() == QVariant::Type::Map )
|
||||||
{
|
{
|
||||||
f.write( newline );
|
f.write( newline );
|
||||||
dumpYaml( f, value.toMap(), indent+1 );
|
dumpYaml( f, value.toMap(), indent + 1 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -293,12 +315,13 @@ saveYaml( const QString& filename, const QVariantMap& map )
|
|||||||
{
|
{
|
||||||
QFile f( filename );
|
QFile f( filename );
|
||||||
if ( !f.open( QFile::WriteOnly ) )
|
if ( !f.open( QFile::WriteOnly ) )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
f.write( "# YAML dump\n---\n" );
|
f.write( "# YAML dump\n---\n" );
|
||||||
return dumpYaml( f, map, 0 );
|
return dumpYaml( f, map, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace CalamaresUtils
|
||||||
} // namespace
|
|
||||||
|
@ -73,10 +73,10 @@ bool saveYaml( const QString& filename, const QVariantMap& map );
|
|||||||
* what is going on in terms of the data passed to the parser.
|
* what is going on in terms of the data passed to the parser.
|
||||||
* Uses @p label when labeling the data source (e.g. "netinstall data")
|
* Uses @p label when labeling the data source (e.g. "netinstall data")
|
||||||
*/
|
*/
|
||||||
void explainYamlException( const YAML::Exception& e, const QByteArray& data, const char *label );
|
void explainYamlException( const YAML::Exception& e, const QByteArray& data, const char* label );
|
||||||
void explainYamlException( const YAML::Exception& e, const QByteArray& data, const QString& label );
|
void explainYamlException( const YAML::Exception& e, const QByteArray& data, const QString& label );
|
||||||
void explainYamlException( const YAML::Exception& e, const QByteArray& data );
|
void explainYamlException( const YAML::Exception& e, const QByteArray& data );
|
||||||
|
|
||||||
} // namespace
|
} // namespace CalamaresUtils
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user