make QProcessEnvironment::systemEnvironment() encoding-safe
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>
Thu, 21 Apr 2011 19:30:34 +0000 (21:30 +0200)
committerOlivier Goffart <olivier.goffart@nokia.com>
Tue, 10 May 2011 10:54:52 +0000 (12:54 +0200)
on unix, don't do the roundtrip over unicode.

on windows, use the WinAPI unicode environment instead of the 8-bit CRT
environment.

Reviewed-by: thiago
Reviewed-by: dt
(cherry picked from commit 60194ad0ea68d7c82b4729119d122dcfeb909842)

src/corelib/io/qprocess.cpp
src/corelib/io/qprocess_unix.cpp
src/corelib/io/qprocess_win.cpp

index 80e0b0f..9ce9fd8 100644 (file)
@@ -2301,6 +2301,8 @@ QStringList QProcess::systemEnvironment()
 }
 
 /*!
+    \fn QProcessEnvironment QProcessEnvironment::systemEnvironment()
+
     \since 4.6
 
     \brief The systemEnvironment function returns the environment of
@@ -2316,21 +2318,6 @@ QStringList QProcess::systemEnvironment()
 
     \sa QProcess::systemEnvironment()
 */
-QProcessEnvironment QProcessEnvironment::systemEnvironment()
-{
-    QProcessEnvironment env;
-    const char *entry;
-    for (int count = 0; (entry = environ[count]); ++count) {
-        const char *equal = strchr(entry, '=');
-        if (!equal)
-            continue;
-
-        QByteArray name(entry, equal - entry);
-        QByteArray value(equal + 1);
-        env.insert(QString::fromLocal8Bit(name), QString::fromLocal8Bit(value));
-    }
-    return env;
-}
 
 /*!
     \typedef Q_PID
index 7edefd3..4e50bc5 100644 (file)
@@ -467,6 +467,23 @@ bool QProcessPrivate::createChannel(Channel &channel)
     }
 }
 
+QProcessEnvironment QProcessEnvironment::systemEnvironment()
+{
+    QProcessEnvironment env;
+    const char *entry;
+    for (int count = 0; (entry = environ[count]); ++count) {
+        const char *equal = strchr(entry, '=');
+        if (!equal)
+            continue;
+
+        QByteArray name(entry, equal - entry);
+        QByteArray value(equal + 1);
+        env.d->hash.insert(QProcessEnvironmentPrivate::Key(name),
+                           QProcessEnvironmentPrivate::Value(value));
+    }
+    return env;
+}
+
 static char **_q_dupEnvironment(const QProcessEnvironmentPrivate::Hash &environment, int *envc)
 {
     *envc = 0;
index 82043a5..7739bbd 100644 (file)
@@ -278,6 +278,26 @@ static QString qt_create_commandline(const QString &program, const QStringList &
     return args;
 }
 
+QProcessEnvironment QProcessEnvironment::systemEnvironment()
+{
+    QProcessEnvironment env;
+    // Calls to setenv() affect the low-level environment as well.
+    // This is not the case the other way round.
+    wchar_t *envStrings = GetEnvironmentStringsW();
+    for (const wchar_t *entry = envStrings; *entry; ) {
+        int entryLen = wcslen(entry);
+        if (const wchar_t *equal = wcschr(entry, L'=')) {
+            int nameLen = equal - entry;
+            QString name = QString::fromWCharArray(entry, nameLen);
+            QString value = QString::fromWCharArray(equal + 1, entryLen - nameLen - 1);
+            env.d->hash.insert(QProcessEnvironmentPrivate::Key(name), value);
+        }
+        entry += entryLen + 1;
+    }
+    FreeEnvironmentStrings(envStrings);
+    return env;
+}
+
 static QByteArray qt_create_environment(const QProcessEnvironmentPrivate::Hash &environment)
 {
     QByteArray envlist;