Author: jghali
Date: Fri Sep  1 10:44:10 2017
New Revision: 22150

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22150
Log:
fix potential crashes in charstyle widget caused by unexpected languages 
strings such as "fr_FR.UTF-8"

Modified:
    trunk/Scribus/scribus/langmgr.cpp
    trunk/Scribus/scribus/langmgr.h
    trunk/Scribus/scribus/prefsmanager.cpp
    trunk/Scribus/scribus/scribusapp.cpp
    trunk/Scribus/scribus/ui/smcstylewidget.cpp
    trunk/Scribus/scribus/util.cpp
    trunk/Scribus/scribus/util.h

Modified: trunk/Scribus/scribus/langmgr.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/langmgr.cpp
==============================================================================
--- trunk/Scribus/scribus/langmgr.cpp   (original)
+++ trunk/Scribus/scribus/langmgr.cpp   Fri Sep  1 10:44:10 2017
@@ -829,12 +829,56 @@
        return "";
 }
 
+const QString LanguageManager::getShortAbbrevFromAbbrevDecomposition(QString 
langAbbrev)
+{
+       int tIndex = langTableIndex(langAbbrev);
+       if (tIndex >= 0)
+               return m_langTable[tIndex].m_priAbbrev;
+
+       QStringList abbrevs = getAbbrevDecomposition(langAbbrev);
+       for (int i = 1; i < abbrevs.count(); ++i)
+       {
+               tIndex = langTableIndex(abbrevs.at(i));
+               if (tIndex >= 0)
+                       return m_langTable[tIndex].m_priAbbrev;
+       }
+
+       return "";
+}
+
 const QString LanguageManager::getAlternativeAbbrevfromAbbrev(QString 
langAbbrev)
 {
        int i=langTableIndex(langAbbrev);
        if (i!=-1)
                return m_langTable[i].m_altAbbrev;
        return "";
+}
+
+QStringList LanguageManager::getAbbrevDecomposition(QString langAbbrev)
+{
+       QStringList abbrevs;
+       abbrevs.append(langAbbrev);
+
+       QString curAbbrev  = langAbbrev;
+       QString delimiters = QString::fromLatin1("_.");
+
+       while (true)
+       {
+               int rightMost = 0;
+               for (int i = 0; i < delimiters.length(); i++)
+               {
+                       int k = curAbbrev.lastIndexOf(delimiters[i]);
+                       if (k > rightMost)
+                               rightMost = k;
+               }
+
+               if (rightMost == 0)
+                       break;
+
+               curAbbrev.truncate(rightMost);
+               abbrevs.append(curAbbrev);
+       }
+       return abbrevs;
 }
 
 void LanguageManager::fillInstalledStringList(QStringList *stringListToFill)

Modified: trunk/Scribus/scribus/langmgr.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/langmgr.h
==============================================================================
--- trunk/Scribus/scribus/langmgr.h     (original)
+++ trunk/Scribus/scribus/langmgr.h     Fri Sep  1 10:44:10 2017
@@ -51,7 +51,9 @@
        const QString getLangFromTransLang(QString transLang);
        const QString getTransLangFromLang(QString lang);
        const QString getShortAbbrevFromAbbrev(QString langAbbrev);
+       const QString getShortAbbrevFromAbbrevDecomposition(QString langAbbrev);
        const QString getAlternativeAbbrevfromAbbrev(QString langAbbrev);
+       QStringList   getAbbrevDecomposition(QString langAbbrev);
        void fillInstalledStringList(QStringList *stringListToFill);
        void fillInstalledGUIStringList(QStringList *stringListToFill);
        void fillInstalledHyphStringList(QStringList *stringListToFill);

Modified: trunk/Scribus/scribus/prefsmanager.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/prefsmanager.cpp
==============================================================================
--- trunk/Scribus/scribus/prefsmanager.cpp      (original)
+++ trunk/Scribus/scribus/prefsmanager.cpp      Fri Sep  1 10:44:10 2017
@@ -54,6 +54,7 @@
 #include "scribusstructs.h"
 #include "sctextstream.h"
 #include "units.h"
+#include "util.h"
 #include "util_color.h"
 #include "util_file.h"
 #include "util_ghostscript.h"
@@ -321,7 +322,9 @@
        appPrefs.scrapbookPrefs.writePreviews = true;
        appPrefs.scrapbookPrefs.numScrapbookCopies = 10;
        appPrefs.displayPrefs.marginColored = false;
-       appPrefs.docSetupPrefs.language = ScQApp->currGUILanguage();
+       appPrefs.docSetupPrefs.language = 
LanguageManager::instance()->getShortAbbrevFromAbbrevDecomposition(ScQApp->currGUILanguage());
+       if (appPrefs.docSetupPrefs.language.isEmpty())
+               appPrefs.docSetupPrefs.language = "en_GB";
        appPrefs.docSetupPrefs.pageSize = 
LocaleManager::instance()->pageSizeForLocale(ScQApp->currGUILanguage());
        appPrefs.docSetupPrefs.pageOrientation = 0;
        PageSize defaultPageSize(appPrefs.docSetupPrefs.pageSize);
@@ -2001,6 +2004,9 @@
                if (dc.tagName()=="DocumentSetup")
                {
                        appPrefs.docSetupPrefs.language = 
dc.attribute("Language", "en_GB");
+                       appPrefs.docSetupPrefs.language = 
LanguageManager::instance()->getShortAbbrevFromAbbrevDecomposition(appPrefs.docSetupPrefs.language);
+                       if (appPrefs.docSetupPrefs.language.isEmpty())
+                               appPrefs.docSetupPrefs.language = "en_GB";
                        appPrefs.docSetupPrefs.docUnitIndex = 
dc.attribute("UnitIndex", "0").toInt();
                        appPrefs.docSetupPrefs.pageSize = 
dc.attribute("PageSize","A4");
                        appPrefs.docSetupPrefs.pageOrientation = 
dc.attribute("PageOrientation", "0").toInt();

Modified: trunk/Scribus/scribus/scribusapp.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/scribusapp.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusapp.cpp        (original)
+++ trunk/Scribus/scribus/scribusapp.cpp        Fri Sep  1 10:44:10 2017
@@ -49,6 +49,7 @@
 #include "scpaths.h"
 #include "scribuscore.h"
 #include "upgradechecker.h"
+#include "util.h"
 
 #ifdef WITH_TESTS
 #include "tests/runtests.h"
@@ -410,6 +411,7 @@
                                if (userprefsContext)
                                {
                                        QString prefslang = 
userprefsContext->get("gui_language","");
+                                       prefslang = cleanupLang(prefslang);
                                        if (!prefslang.isEmpty())
                                                langs.append(prefslang);
                                }
@@ -420,21 +422,27 @@
 
        if (!(lang = ::getenv("LANG")).isEmpty())
        {
+               lang = cleanupLang(lang);
                if (lang=="C")
                        lang="en";
-               langs.append(lang);
+               if (!lang.isEmpty())
+                       langs.append(lang);
        }
        if (!(lang = ::getenv("LC_MESSAGES")).isEmpty())
        {
+               lang = cleanupLang(lang);
                if (lang=="C")
                        lang="en";
-               langs.append(lang);
+               if (!lang.isEmpty())
+                       langs.append(lang);
        }
        if (!(lang = ::getenv("LC_ALL")).isEmpty())
        {
+               lang = cleanupLang(lang);
                if (lang=="C")
                        lang="en";
-               langs.append(lang);
+               if (!lang.isEmpty())
+                       langs.append(lang);
        }
 
 #if defined(_WIN32)
@@ -458,7 +466,7 @@
        }
 #endif
 
-       langs.append(QString(QLocale::system().name()));
+       langs.append(QLocale::system().name());
 
        // remove duplicate entries...
        QStringList::Iterator it = langs.end();

Modified: trunk/Scribus/scribus/ui/smcstylewidget.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/ui/smcstylewidget.cpp
==============================================================================
--- trunk/Scribus/scribus/ui/smcstylewidget.cpp (original)
+++ trunk/Scribus/scribus/ui/smcstylewidget.cpp Fri Sep  1 10:44:10 2017
@@ -309,10 +309,10 @@
        }
 
        QString defaultLang(defLang.isEmpty() ? "en_GB" : defLang);
-       QString clang(cstyle->language().isNull() || 
cstyle->language().isEmpty() ? defaultLang : cstyle->language());
+       QString clang(cstyle->language().isEmpty() ? defaultLang : 
cstyle->language());
        QString plang(QString::null);
        if (hasParent)
-               plang = parent->language().isNull() || 
parent->language().isEmpty() ? defaultLang : parent->language();
+               plang = parent->language().isEmpty() ? defaultLang : 
parent->language();
 
        int ci = -1, pi = -1, di = -1;
        QString tl = 
LanguageManager::instance()->getAbbrevFromLang(defaultLang, false);

Modified: trunk/Scribus/scribus/util.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/util.cpp
==============================================================================
--- trunk/Scribus/scribus/util.cpp      (original)
+++ trunk/Scribus/scribus/util.cpp      Fri Sep  1 10:44:10 2017
@@ -49,6 +49,16 @@
 #endif
 
 using namespace std;
+
+QString cleanupLang(const QString& lang)
+{
+       int dotIndex = lang.indexOf(QChar('.'));
+       if (dotIndex < 0)
+               return lang;
+
+       QString cleanLang = lang.left(dotIndex);
+       return cleanLang;
+}
 
 int System(const QString exename, const QStringList & args, const QString 
fileStdErr, const QString fileStdOut, bool* cancel)
 {

Modified: trunk/Scribus/scribus/util.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22150&path=/trunk/Scribus/scribus/util.h
==============================================================================
--- trunk/Scribus/scribus/util.h        (original)
+++ trunk/Scribus/scribus/util.h        Fri Sep  1 10:44:10 2017
@@ -34,7 +34,10 @@
 class  ScribusDoc;
 class  ScribusView;
 
-// class Foi;
+/*!
+\brief Cleanup language strings from extensions such as ".UTF-8" we can get 
from environment variables
+*/
+QString cleanupLang(const QString& lang);
 
 /*! \brief Compare double values by pre-multiplying by 10000 and converting to 
long if possible.
 If premultiplication does not allow to store result in a long value, perform a 
standard comparison.


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to