Commit d02d59dc authored by pvuorela's avatar pvuorela

Merge branch 'localehelper' into 'master'

Implement locale helper tool

See merge request !105
parents aade6416 ef050641
......@@ -69,6 +69,7 @@ rm -rf %{buildroot}
%{_libdir}/qt5/qml/org/nemomobile/systemsettings/plugins.qmltypes
%{_libdir}/qt5/qml/org/nemomobile/systemsettings/qmldir
%{_libdir}/libsystemsettings.so.*
%attr(4710,-,privileged) %{_libexecdir}/setlocale
%dir %attr(0775, root, privileged) /etc/location
%config %attr(0664, root, privileged) /etc/location/location.conf
......
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/
#include <QFile>
#include <QRegularExpression>
#include <QDebug>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "../src/localeconfig.h"
int main(int argc, char *argv[])
{
if (argc != 2) {
qWarning() << "No locale given";
return EXIT_FAILURE;
}
QString configPath = localeConfigPath();
if (configPath.isEmpty()) {
return EXIT_FAILURE;
}
QString newLocale = QString(argv[1]);
QRegularExpression allowedInput("^[a-zA-Z0-9\\.@_]*$");
if (!allowedInput.match(newLocale).hasMatch()) {
qWarning() << "Invalid locale input:" << newLocale;
return EXIT_FAILURE;
}
QFile localeConfig(configPath);
if (!localeConfig.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Unable to open locale configuration file for writing:" << configPath
<< "-" << localeConfig.errorString();
return EXIT_FAILURE;
}
localeConfig.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner |
QFileDevice::ReadGroup | QFileDevice::ReadOther);
if (fchown(localeConfig.handle(), 0, 0)) {
qWarning() << "Failed to set localeconfig as root:root" << strerror(errno);
}
localeConfig.write("# Autogenerated by settings\n");
localeConfig.write(QString("LANG=%1\n").arg(newLocale).toLatin1());
localeConfig.close();
return EXIT_SUCCESS;
}
TEMPLATE = app
TARGET = setlocale
TARGETPATH = /usr/libexec
target.path = $$TARGETPATH
QT = core
SOURCES += \
main.cpp \
../src/localeconfig.cpp
HEADERS += \
../src/localeconfig.h
INSTALLS += target
......@@ -30,17 +30,14 @@
*/
#include "languagemodel.h"
#include "localeconfig.h"
#include <QDir>
#include <QDebug>
#include <QSettings>
#include <QHash>
#include <QDBusInterface>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <QProcess>
namespace {
const char * const LanguageSupportDirectory = "/usr/share/jolla-supported-languages";
......@@ -50,15 +47,6 @@ bool nameLessThan(const Language &lang1, const Language &lang2)
return (lang1.name().localeAwareCompare(lang2.name()) <= 0);
}
QString localeConfigPath()
{
struct passwd *passwdInfo = getpwuid(getuid());
QString userName;
if (passwdInfo) {
userName = passwdInfo->pw_name;
}
return QString("/var/lib/environment/%1/locale.conf").arg(userName);
}
}
......@@ -183,17 +171,12 @@ QString LanguageModel::locale(int index) const
void LanguageModel::setSystemLocale(const QString &localeCode, LocaleUpdateMode updateMode)
{
QFile localeConfig(localeConfigPath());
if (!localeConfig.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Language model unable to open locale configuration file for writing:" << localeConfigPath()
<< " - " << localeConfig.errorString();
int ret = QProcess::execute(QLatin1String("/usr/libexec/setlocale"), QStringList(localeCode));
if (ret != 0) {
qWarning() << "Setting user locale failed!";
return;
}
localeConfig.write("# Autogenerated by settings\n");
localeConfig.write(QString("LANG=%1\n").arg(localeCode).toLatin1());
localeConfig.close();
int oldLocale = m_currentIndex;
m_currentIndex = getLocaleIndex(localeCode);
if (m_currentIndex != oldLocale) {
......@@ -229,7 +212,7 @@ QList<Language> LanguageModel::supportedLanguages()
languages.append(newLanguage);
}
qSort(languages.begin(), languages.end(), nameLessThan);
std::sort(languages.begin(), languages.end(), nameLessThan);
return languages;
}
......
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/
#include <QDebug>
#include "localeconfig.h"
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
QString localeConfigPath()
{
struct passwd *passwdInfo = getpwuid(getuid());
if (passwdInfo) {
QString userName = passwdInfo->pw_name;
return QString("/var/lib/environment/%1/locale.conf").arg(userName);
} else {
qWarning() << "Unable to get user info";
return QString();
}
}
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/
#ifndef LOCALECONFIG_H
#define LOCALECONFIG_H
#include <QString>
QString localeConfigPath();
#endif
......@@ -16,6 +16,7 @@ system(qdbusxml2cpp -c ConnmanServiceProxy -p connmanserviceproxy ../dbus/net.co
SOURCES += \
languagemodel.cpp \
localeconfig.cpp \
logging.cpp \
datetimesettings.cpp \
profilecontrol.cpp \
......@@ -71,6 +72,7 @@ PUBLIC_HEADERS = \
HEADERS += \
$$PUBLIC_HEADERS \
qdbusxml2cpp_dbus_types.h \
localeconfig.h \
batterystatus_p.h \
logging_p.h \
diskusage_p.h \
......
......@@ -6,4 +6,4 @@ src_plugins.depends = src
OTHER_FILES += rpm/nemo-qml-plugin-systemsettings.spec
SUBDIRS = src src_plugins tests
SUBDIRS = src src_plugins setlocale tests
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment