diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-02-08 08:40:48 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-10 22:53:13 +0100 |
commit | c908fc4448989d0319f86da35c8fa66ad1440fa2 (patch) | |
tree | d3cc0c1980a0cb48b6a423478aa80c9b9af51280 /src/gui/util | |
parent | d43a01e1496c9be16cd2e3dc290bf70e926ceb99 (diff) | |
download | qtbase-c908fc4448989d0319f86da35c8fa66ad1440fa2.tar.gz |
Add QPlatformServices class.
- Add QPlatformServices as back-end for
QDesktopServices.
- Bring back UNIX/Linux desktop detection in platformsupport
as a generic implementation.
- Add Windows implementation.
Reviewed-by: Morten Johan Sorvig <morten.sorvig@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
Change-Id: If94bb65755df4f849edd83c57143ee2c73002137
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src/gui/util')
-rw-r--r-- | src/gui/util/qdesktopservices.cpp | 21 | ||||
-rw-r--r-- | src/gui/util/qdesktopservices_mac.cpp | 127 | ||||
-rw-r--r-- | src/gui/util/qdesktopservices_qpa.cpp | 61 | ||||
-rw-r--r-- | src/gui/util/qdesktopservices_win.cpp | 177 | ||||
-rw-r--r-- | src/gui/util/qdesktopservices_x11.cpp | 131 |
5 files changed, 11 insertions, 506 deletions
diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp index 0f1312e02d..13e2585b88 100644 --- a/src/gui/util/qdesktopservices.cpp +++ b/src/gui/util/qdesktopservices.cpp @@ -45,14 +45,14 @@ #include <qdebug.h> -#include "qdesktopservices_qpa.cpp" - #include <qstandardpaths.h> #include <qhash.h> #include <qobject.h> #include <qcoreapplication.h> +#include <private/qguiapplication_p.h> #include <qurl.h> #include <qmutex.h> +#include <qplatformservices_qpa.h> QT_BEGIN_NAMESPACE @@ -185,14 +185,15 @@ bool QDesktopServices::openUrl(const QUrl &url) return result; // ### support bool slot return type } } - - bool result; - if (url.scheme() == QLatin1String("file")) - result = openDocument(url); - else - result = launchWebBrowser(url); - - return result; + if (!url.isValid()) + return false; + QPlatformServices *platformServices = QGuiApplicationPrivate::platformIntegration()->services(); + if (!platformServices) { + qWarning("%s: The platform plugin does not support services.", Q_FUNC_INFO); + return false; + } + return url.scheme() == QStringLiteral("file") ? + platformServices->openDocument(url) : platformServices->openUrl(url); } /*! diff --git a/src/gui/util/qdesktopservices_mac.cpp b/src/gui/util/qdesktopservices_mac.cpp deleted file mode 100644 index 84c7156ef3..0000000000 --- a/src/gui/util/qdesktopservices_mac.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QT_NO_DESKTOPSERVICES - -#include <qprocess.h> -#include <qstringlist.h> -#include <qdir.h> -#include <qurl.h> -#include <private/qcore_mac_p.h> -#include <qcoreapplication.h> - -#include <ApplicationServices/ApplicationServices.h> - -QT_BEGIN_NAMESPACE - -/* - Translates a QDesktopServices::StandardLocation into the mac equivalent. -*/ -OSType translateLocation(QDesktopServices::StandardLocation type) -{ - switch (type) { - case QDesktopServices::DesktopLocation: - return kDesktopFolderType; break; - - case QDesktopServices::DocumentsLocation: - return kDocumentsFolderType; break; - - case QDesktopServices::FontsLocation: - // There are at least two different font directories on the mac: /Library/Fonts and ~/Library/Fonts. - // To select a specific one we have to specify a different first parameter when calling FSFindFolder. - return kFontsFolderType; break; - - case QDesktopServices::ApplicationsLocation: - return kApplicationsFolderType; break; - - case QDesktopServices::MusicLocation: - return kMusicDocumentsFolderType; break; - - case QDesktopServices::MoviesLocation: - return kMovieDocumentsFolderType; break; - - case QDesktopServices::PicturesLocation: - return kPictureDocumentsFolderType; break; - - case QDesktopServices::TempLocation: - return kTemporaryFolderType; break; - - case QDesktopServices::DataLocation: - return kApplicationSupportFolderType; break; - - case QDesktopServices::CacheLocation: - return kCachedDataFolderType; break; - - default: - return kDesktopFolderType; break; - } -} - -static bool lsOpen(const QUrl &url) -{ - if (!url.isValid() || url.scheme().isEmpty()) - return false; - - QCFType<CFURLRef> cfUrl = CFURLCreateWithString(0, QCFString(QString::fromLatin1(url.toEncoded())), 0); - if (cfUrl == 0) - return false; - - const OSStatus err = LSOpenCFURLRef(cfUrl, 0); - return (err == noErr); -} - -static bool launchWebBrowser(const QUrl &url) -{ - return lsOpen(url); -} - -static bool openDocument(const QUrl &file) -{ - if (!file.isValid()) - return false; - - // LSOpen does not work in this case, use QProcess open instead. - return QProcess::startDetached(QLatin1String("open"), QStringList() << file.toLocalFile()); -} - -QT_END_NAMESPACE - -#endif // QT_NO_DESKTOPSERVICES diff --git a/src/gui/util/qdesktopservices_qpa.cpp b/src/gui/util/qdesktopservices_qpa.cpp deleted file mode 100644 index b94267e72e..0000000000 --- a/src/gui/util/qdesktopservices_qpa.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <qdebug.h> -#include <qurl.h> - -QT_BEGIN_NAMESPACE - -static bool launchWebBrowser(const QUrl &url) -{ - Q_UNUSED(url); - qWarning("QDesktopServices::launchWebBrowser not implemented"); - return false; -} - -static bool openDocument(const QUrl &file) -{ - Q_UNUSED(file); - qWarning("QDesktopServices::openDocument not implemented"); - return false; -} - -QT_END_NAMESPACE diff --git a/src/gui/util/qdesktopservices_win.cpp b/src/gui/util/qdesktopservices_win.cpp deleted file mode 100644 index 88f245d6f6..0000000000 --- a/src/gui/util/qdesktopservices_win.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <qsettings.h> -#include <qdir.h> -#include <private/qsystemlibrary_p.h> -#include <qurl.h> -#include <qstringlist.h> -#include <qprocess.h> -#include <qtemporaryfile.h> -#include <qcoreapplication.h> - -#include <qt_windows.h> -#include <shlobj.h> -#if !defined(Q_OS_WINCE) -# include <intshcut.h> -#else -# include <qguifunctions_wince.h> -# if !defined(STANDARDSHELL_UI_MODEL) -# include <winx.h> -# endif -#endif - -#ifndef CSIDL_MYMUSIC -#define CSIDL_MYMUSIC 13 -#define CSIDL_MYVIDEO 14 -#endif - -#ifndef QT_NO_DESKTOPSERVICES - -QT_BEGIN_NAMESPACE - -static bool openDocument(const QUrl &file) -{ - if (!file.isValid()) - return false; - QString filePath = file.toLocalFile(); - if (filePath.isEmpty()) - filePath = file.toString(); - quintptr returnValue = (quintptr)ShellExecute(0, 0, (wchar_t*)filePath.utf16(), 0, 0, SW_SHOWNORMAL); - return (returnValue > 32); //ShellExecute returns a value greater than 32 if successful -} - -static QString expandEnvStrings(const QString &command) -{ -#if defined(Q_OS_WINCE) - return command; -#else - wchar_t buffer[MAX_PATH]; - if (ExpandEnvironmentStrings((wchar_t*)command.utf16(), buffer, MAX_PATH)) - return QString::fromWCharArray(buffer); - else - return command; -#endif -} - -static bool launchWebBrowser(const QUrl &url) -{ - if (url.scheme() == QLatin1String("mailto")) { - //Retrieve the commandline for the default mail client - //the default key used below is the command line for the mailto: shell command - DWORD bufferSize = sizeof(wchar_t) * MAX_PATH; - long returnValue = -1; - QString command; - - HKEY handle; - LONG res; - wchar_t keyValue[MAX_PATH] = {0}; - QString keyName(QLatin1String("mailto")); - - //Check if user has set preference, otherwise use default. - res = RegOpenKeyEx(HKEY_CURRENT_USER, - L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\mailto\\UserChoice", - 0, KEY_READ, &handle); - if (res == ERROR_SUCCESS) { - returnValue = RegQueryValueEx(handle, L"Progid", 0, 0, reinterpret_cast<unsigned char*>(keyValue), &bufferSize); - if (!returnValue) - keyName = QString::fromUtf16((const ushort*)keyValue); - RegCloseKey(handle); - } - keyName += QLatin1String("\\Shell\\Open\\Command"); - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, (const wchar_t*)keyName.utf16(), 0, KEY_READ, &handle); - if (res != ERROR_SUCCESS) - return false; - - bufferSize = sizeof(wchar_t) * MAX_PATH; - returnValue = RegQueryValueEx(handle, L"", 0, 0, reinterpret_cast<unsigned char*>(keyValue), &bufferSize); - if (!returnValue) - command = QString::fromRawData((QChar*)keyValue, bufferSize); - RegCloseKey(handle); - - if (returnValue) - return false; - - command = expandEnvStrings(command); - command = command.trimmed(); - //Make sure the path for the process is in quotes - int index = -1 ; - if (command[0]!= QLatin1Char('\"')) { - index = command.indexOf(QLatin1String(".exe "), 0, Qt::CaseInsensitive); - command.insert(index+4, QLatin1Char('\"')); - command.insert(0, QLatin1Char('\"')); - } - //pass the url as the parameter - index = command.lastIndexOf(QLatin1String("%1")); - if (index != -1){ - command.replace(index, 2, url.toString()); - } - //start the process - PROCESS_INFORMATION pi; - ZeroMemory(&pi, sizeof(pi)); - STARTUPINFO si; - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - - returnValue = CreateProcess(NULL, (wchar_t*)command.utf16(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); - - if (!returnValue) - return false; - - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; - } - - if (!url.isValid()) - return false; - - if (url.scheme().isEmpty()) - return openDocument(url); - - quintptr returnValue = (quintptr)ShellExecute(0, 0, (wchar_t *)QString::fromUtf8(url.toEncoded().constData()).utf16(), - 0, 0, SW_SHOWNORMAL); - return (returnValue > 32); -} - -QT_END_NAMESPACE - -#endif // QT_NO_DESKTOPSERVICES diff --git a/src/gui/util/qdesktopservices_x11.cpp b/src/gui/util/qdesktopservices_x11.cpp deleted file mode 100644 index 73cf47a1db..0000000000 --- a/src/gui/util/qdesktopservices_x11.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdesktopservices.h" - -#ifndef QT_NO_DESKTOPSERVICES - -#include <qprocess.h> -#include <qurl.h> -#include <qdir.h> -#include <qfile.h> -#include <qtextstream.h> -#include <private/qt_x11_p.h> -#include <qcoreapplication.h> -#include <stdlib.h> - -QT_BEGIN_NAMESPACE - -inline static bool launch(const QUrl &url, const QString &client) -{ -#if !defined(QT_NO_PROCESS) - return (QProcess::startDetached(client + QLatin1Char(' ') + QString::fromLatin1(url.toEncoded().constData()))); -#else - return (::system((client + QLatin1Char(' ') + QString::fromLatin1(url.toEncoded().constData())).toLocal8Bit().constData()) != -1); -#endif -} - -static bool openDocument(const QUrl &url) -{ - if (!url.isValid()) - return false; - - if (launch(url, QLatin1String("xdg-open"))) - return true; - - // Use the X11->desktopEnvironment value if X11 is non-NULL, - // otherwise just attempt to launch command regardless of the desktop environment - if ((!X11 || (X11 && X11->desktopEnvironment == DE_GNOME)) && launch(url, QLatin1String("gnome-open"))) { - return true; - } else { - if ((!X11 || (X11 && X11->desktopEnvironment == DE_KDE)) && launch(url, QLatin1String("kfmclient exec"))) - return true; - } - - if (launch(url, QLatin1String("firefox"))) - return true; - if (launch(url, QLatin1String("mozilla"))) - return true; - if (launch(url, QLatin1String("netscape"))) - return true; - if (launch(url, QLatin1String("opera"))) - return true; - - return false; -} - -static bool launchWebBrowser(const QUrl &url) -{ - if (!url.isValid()) - return false; - if (url.scheme() == QLatin1String("mailto")) - return openDocument(url); - - if (launch(url, QLatin1String("xdg-open"))) - return true; - if (launch(url, QString::fromLocal8Bit(getenv("DEFAULT_BROWSER")))) - return true; - if (launch(url, QString::fromLocal8Bit(getenv("BROWSER")))) - return true; - - // Use the X11->desktopEnvironment value if X11 is non-NULL, - // otherwise just attempt to launch command regardless of the desktop environment - if ((!X11 || (X11 && X11->desktopEnvironment == DE_GNOME)) && launch(url, QLatin1String("gnome-open"))) { - return true; - } else { - if ((!X11 || (X11 && X11->desktopEnvironment == DE_KDE)) && launch(url, QLatin1String("kfmclient openURL"))) - return true; - } - - if (launch(url, QLatin1String("firefox"))) - return true; - if (launch(url, QLatin1String("mozilla"))) - return true; - if (launch(url, QLatin1String("netscape"))) - return true; - if (launch(url, QLatin1String("opera"))) - return true; - return false; -} - -QT_END_NAMESPACE - -#endif // QT_NO_DESKTOPSERVICES |