source: calamares/trunk/fuentes/src/libcalamares/utils/CalamaresUtils.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 13 months ago

sync with github

File size: 10.9 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2013-2016, Teo Mrnjavac <teo@kde.org>
4 *
5 *   Originally from Tomahawk, portions:
6 *   Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
7 *   Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
8 *   Copyright 2010-2012, Jeff Mitchell <jeff@tomahawk-player.org>
9 *
10 *   Calamares is free software: you can redistribute it and/or modify
11 *   it under the terms of the GNU General Public License as published by
12 *   the Free Software Foundation, either version 3 of the License, or
13 *   (at your option) any later version.
14 *
15 *   Calamares is distributed in the hope that it will be useful,
16 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 *   GNU General Public License for more details.
19 *
20 *   You should have received a copy of the GNU General Public License
21 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24#include "CalamaresUtils.h"
25
26#include "CalamaresConfig.h"
27#include "Logger.h"
28
29#include <QCoreApplication>
30#include <QDebug>
31#include <QDir>
32#include <QLocale>
33#include <QStandardPaths>
34#include <QTranslator>
35
36
37// stdc++
38#include <iostream>
39
40using namespace std;
41
42namespace CalamaresUtils
43{
44
45static QDir s_appDataDir( CMAKE_INSTALL_FULL_DATADIR );
46static QDir s_qmlModulesDir( QString( CMAKE_INSTALL_FULL_DATADIR ) + "/qml" );
47static bool s_isAppDataDirOverridden = false;
48
49static QTranslator* s_brandingTranslator = nullptr;
50static QTranslator* s_translator = nullptr;
51static QString s_translatorLocaleName;
52
53
54static bool
55isWritableDir( const QDir& dir )
56{
57    // We log with cerr here because we might be looking for the log dir
58    QString path = dir.absolutePath();
59    if ( !dir.exists() )
60    {
61        if ( !dir.mkpath( "." ) )
62        {
63            cerr << "warning: failed to create " << qPrintable( path ) << endl;
64            return false;
65        }
66        return true;
67    }
68
69    QFileInfo info( path );
70    if ( !info.isDir() )
71    {
72        cerr << "warning: " << qPrintable( path ) << " is not a dir\n";
73        return false;
74    }
75    if ( !info.isWritable() )
76    {
77        cerr << "warning: " << qPrintable( path ) << " is not writable\n";
78        return false;
79    }
80    return true;
81}
82
83
84QDir
85qmlModulesDir()
86{
87    return s_qmlModulesDir;
88}
89
90
91void
92setAppDataDir( const QDir& dir )
93{
94    s_appDataDir = dir;
95    s_isAppDataDirOverridden = true;
96}
97
98
99bool
100isAppDataDirOverridden()
101{
102    return s_isAppDataDirOverridden;
103}
104
105
106QDir
107appDataDir()
108{
109    return s_appDataDir;
110}
111
112
113QDir
114systemLibDir()
115{
116    QDir path( CMAKE_INSTALL_FULL_LIBDIR );
117    return path;
118}
119
120
121QDir
122appLogDir()
123{
124    QString path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation );
125    QDir dir( path );
126    if ( isWritableDir( dir ) )
127        return dir;
128
129    cerr << "warning: Could not find a standard writable location for log dir, falling back to $HOME\n";
130    dir = QDir::home();
131    if ( isWritableDir( dir ) )
132        return dir;
133
134    cerr << "warning: Found no writable location for log dir, falling back to the temp dir\n";
135    return QDir::temp();
136}
137
138
139void
140installTranslator( const QLocale& locale,
141                   const QString& brandingTranslationsPrefix,
142                   QObject* parent )
143{
144    QString localeName = locale.name();
145    localeName.replace( "-", "_" );
146
147    if ( localeName == "C" )
148        localeName = "en";
149
150    // Special case of sr@latin
151    //
152    // See top-level CMakeLists.txt about special cases for translation loading.
153    if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript )
154        localeName = QStringLiteral( "sr@latin" );
155
156    cDebug() << "Looking for translations for" << localeName;
157
158    QTranslator* translator = nullptr;
159
160    // Branding translations
161    if ( !brandingTranslationsPrefix.isEmpty() )
162    {
163        QString brandingTranslationsDirPath( brandingTranslationsPrefix );
164        brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf(
165                                                  QDir::separator() ) );
166        QDir brandingTranslationsDir( brandingTranslationsDirPath );
167        if ( brandingTranslationsDir.exists() )
168        {
169            QString filenameBase( brandingTranslationsPrefix );
170            filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf(
171                                        QDir::separator() ) + 1 );
172            translator = new QTranslator( parent );
173            if ( translator->load( locale,
174                                   filenameBase,
175                                   "_",
176                                   brandingTranslationsDir.absolutePath() ) )
177            {
178                cDebug() << " .. Branding using locale:" << localeName;
179            }
180            else
181            {
182                cDebug() << " .. Branding using default, system locale not found:" << localeName;
183                translator->load( brandingTranslationsPrefix + "en" );
184            }
185
186            if ( s_brandingTranslator )
187            {
188                QCoreApplication::removeTranslator( s_brandingTranslator );
189                delete s_brandingTranslator;
190            }
191
192            QCoreApplication::installTranslator( translator );
193            s_brandingTranslator = translator;
194        }
195    }
196
197    // Calamares translations
198    translator = new QTranslator( parent );
199    if ( translator->load( QString( ":/lang/calamares_" ) + localeName ) )
200    {
201        cDebug() << " .. Calamares using locale:" << localeName;
202    }
203    else
204    {
205        cDebug() << " .. Calamares using default, system locale not found:" << localeName;
206        translator->load( QString( ":/lang/calamares_en" ) );
207    }
208
209    if ( s_translator )
210    {
211        QCoreApplication::removeTranslator( s_translator );
212        delete s_translator;
213    }
214
215    QCoreApplication::installTranslator( translator );
216    s_translator = translator;
217
218    s_translatorLocaleName = localeName;
219}
220
221
222QString
223translatorLocaleName()
224{
225    return s_translatorLocaleName;
226}
227
228
229void
230setQmlModulesDir( const QDir& dir )
231{
232    s_qmlModulesDir = dir;
233}
234
235
236QString
237removeDiacritics( const QString& string )
238{
239    const QString diacriticLetters = QString::fromUtf8(
240        "ŠŒŽšœžŸ¥µÀ"
241        "ÁÂÃÄÅÆÇÈÉÊ"
242        "ËÌÍÎÏÐÑÒÓÔ"
243        "ÕÖØÙÚÛÜÝßà"
244        "áâãäåæçèéê"
245        "ëìíîïðñòóô"
246        "õöøùúûüýÿÞ"
247        "þČčĆćĐ𩹮"
248        "žŞşĞğİıȚțȘ"
249        "șĂăŐőŰűŘřĀ"
250        "āĒēĪīŌōŪūŢ"
251        "ţẀẁẂẃŴŵŶŷĎ"
252        "ďĚěŇňŤťŮůŔ"
253        "ॹĘꣳŃńŚ"
254        "śŹźŻż"
255    );
256    const QStringList noDiacriticLetters = {
257        "S", "OE", "Z", "s", "oe", "z", "Y", "Y", "u", "A",
258        "A", "A", "A", "A", "AA", "AE", "C", "E", "E", "E",
259        "E", "I", "I", "I", "I", "D", "N", "O", "O", "O",
260        "O", "E", "OE", "U", "U", "U", "E", "Y", "s", "a",
261        "a", "a", "a", "e", "aa", "ae", "c", "e", "e", "e",
262        "e", "i", "i", "i", "i", "d", "n", "o", "o", "o",
263        "o", "e", "oe", "u", "u", "u", "e", "y", "y", "TH",
264        "th", "C", "c", "C", "c", "DJ", "dj", "S", "s", "Z",
265        "z", "S", "s", "G", "g", "I", "i", "T", "t", "S",
266        "s", "A", "a", "O", "o", "U", "u", "R", "r", "A",
267        "a", "E", "e", "I", "i", "O", "o", "U", "u", "T",
268        "t", "W", "w", "W", "w", "W", "w", "Y", "y", "D",
269        "d", "E", "e", "N", "n", "T", "t", "U", "u", "R",
270        "r", "A", "a", "E", "e", "L", "l", "N", "n", "S",
271        "s", "Z", "z", "Z", "z"
272    };
273
274    QString output;
275    for ( const QChar &c : string )
276    {
277        int i = diacriticLetters.indexOf( c );
278        if ( i < 0 )
279        {
280            output.append( c );
281        }
282        else
283        {
284            QString replacement = noDiacriticLetters[ i ];
285            output.append( replacement );
286        }
287    }
288
289    return output;
290}
291
292
293// Function CalamaresUtils::obscure based on KStringHandler::obscure,
294// part of KDElibs by KDE, file kstringhandler.cpp.
295// Original copyright statement follows.
296/* This file is part of the KDE libraries
297   Copyright (C) 1999 Ian Zepp (icszepp@islc.net)
298   Copyright (C) 2006 by Dominic Battre <dominic@battre.de>
299   Copyright (C) 2006 by Martin Pool <mbp@canonical.com>
300
301   This library is free software; you can redistribute it and/or
302   modify it under the terms of the GNU Library General Public
303   License as published by the Free Software Foundation; either
304   version 2 of the License, or (at your option) any later version.
305
306   This library is distributed in the hope that it will be useful,
307   but WITHOUT ANY WARRANTY; without even the implied warranty of
308   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
309   Library General Public License for more details.
310
311   You should have received a copy of the GNU Library General Public License
312   along with this library; see the file COPYING.LIB.  If not, write to
313   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
314   Boston, MA 02110-1301, USA.
315*/
316QString
317obscure( const QString& string )
318{
319    QString result;
320    const QChar *unicode = string.unicode();
321    for ( int i = 0; i < string.length(); ++i )
322        // yes, no typo. can't encode ' ' or '!' because
323        // they're the unicode BOM. stupid scrambling. stupid.
324        result += ( unicode[ i ].unicode() <= 0x21 ) ?
325                      unicode[ i ] :
326                      QChar( 0x1001F - unicode[ i ].unicode() );
327    return result;
328}
329
330
331void
332crash()
333{
334    volatile int* a = nullptr;
335    *a = 1;
336}
337
338bool
339getBool( const QVariantMap& map, const QString& key, bool d )
340{
341    bool result = d;
342    if ( map.contains( key ) )
343    {
344        auto v = map.value( key );
345        if ( v.type() == QVariant::Bool )
346            result = v.toBool();
347    }
348
349    return result;
350}
351
352QString
353getString(const QVariantMap& map, const QString& key)
354{
355    if ( map.contains( key ) )
356    {
357        auto v = map.value( key );
358        if ( v.type() == QVariant::String )
359            return v.toString();
360    }
361    return QString();
362}
363
364int
365getInteger( const QVariantMap& map, const QString& key, int d )
366{
367    int result = d;
368    if ( map.contains( key ) )
369    {
370        auto v = map.value( key );
371        if ( v.type() == QVariant::Int )
372            result = v.toInt();
373    }
374
375    return result;
376}
377
378double
379getDouble( const QVariantMap& map, const QString& key, double d )
380{
381    double result = d;
382    if ( map.contains( key ) )
383    {
384        auto v = map.value( key );
385        if ( v.type() == QVariant::Int )
386            result = v.toInt();
387        else if ( v.type() == QVariant::Double )
388            result = v.toDouble();
389    }
390
391    return result;
392}
393
394QVariantMap
395getSubMap( const QVariantMap& map, const QString& key, bool& success )
396{
397    success = false;
398
399    if ( map.contains( key ) )
400    {
401        auto v = map.value( key );
402        if ( v.type() == QVariant::Map )
403        {
404            success = true;
405            return v.toMap();
406        }
407    }
408    return QVariantMap();
409}
410
411}
Note: See TracBrowser for help on using the repository browser.