KIO

widgetsopenorexecutefilehandler.cpp
1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2020 Ahmad Samir <a.samirh78@gmail.com>
4
5 SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6*/
7
8#include "widgetsopenorexecutefilehandler.h"
9
10#include "executablefileopendialog_p.h"
11#include "openurljob.h"
12
13#include <KConfigGroup>
14#include <KJob>
15#include <KJobWidgets>
16#include <KSharedConfig>
17
18#include <QApplication>
19#include <QMimeDatabase>
20
21KIO::WidgetsOpenOrExecuteFileHandler::WidgetsOpenOrExecuteFileHandler(QObject *parent)
22 : KIO::OpenOrExecuteFileInterface(parent)
23{
24}
25
26KIO::WidgetsOpenOrExecuteFileHandler::~WidgetsOpenOrExecuteFileHandler() = default;
27
28static ExecutableFileOpenDialog::Mode promptMode(const QMimeType &mime)
29{
30 // Note that ExecutableFileOpenDialog::OpenAsExecute isn't useful here as
31 // OpenUrlJob treats .exe (application/x-ms-dos-executable) files as executables
32 // that are only opened using the default application associated with that MIME type
33 // e.g. WINE
34
35 if (mime.inherits(QStringLiteral("text/plain"))) {
36 return ExecutableFileOpenDialog::OpenOrExecute;
37 }
38 return ExecutableFileOpenDialog::OnlyExecute;
39}
40
41void KIO::WidgetsOpenOrExecuteFileHandler::promptUserOpenOrExecute(KJob *job, const QString &mimetype)
42{
43 KConfigGroup cfgGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), QStringLiteral("Executable scripts"));
44 const QString value = cfgGroup.readEntry("behaviourOnLaunch", "alwaysAsk");
45
46 if (value != QLatin1String("alwaysAsk")) {
47 Q_EMIT executeFile(value == QLatin1String("execute"));
48 return;
49 }
50
51 QWidget *parentWidget = nullptr;
52
53 if (job) {
54 parentWidget = KJobWidgets::window(job);
55 }
56
57 if (!parentWidget) {
58 parentWidget = m_parentWidget;
59 }
60
61 if (!parentWidget) {
62 parentWidget = qApp->activeWindow();
63 }
64
65 QMimeDatabase db;
66 QMimeType mime = db.mimeTypeForName(mimetype);
67
68 // TODO KF7 add url arg to promptUserOpenOrExecute.
69 QUrl url;
70 if (auto *openUrlJob = qobject_cast<KIO::OpenUrlJob *>(job)) {
71 url = openUrlJob->url();
72 }
73 ExecutableFileOpenDialog *dialog = new ExecutableFileOpenDialog(url, mime, promptMode(mime), parentWidget);
74 dialog->setAttribute(Qt::WA_DeleteOnClose);
75 dialog->setModal(true);
76
77 connect(dialog, &QDialog::finished, this, [this, dialog, mime](const int result) {
78 if (result == ExecutableFileOpenDialog::Rejected) {
80 return;
81 }
82
83 const bool isExecute = result == ExecutableFileOpenDialog::ExecuteFile;
84 Q_EMIT executeFile(isExecute);
85
86 if (dialog->isDontAskAgainChecked()) {
87 KConfigGroup cfgGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), QStringLiteral("Executable scripts"));
88 cfgGroup.writeEntry("behaviourOnLaunch", isExecute ? "execute" : "open");
89 }
90 });
91
92 dialog->show();
93}
94
95void KIO::WidgetsOpenOrExecuteFileHandler::setWindow(QWidget *window)
96{
97 m_parentWidget = window;
98}
99
100#include "moc_widgetsopenorexecutefilehandler.cpp"
void executeFile(bool enable)
Emitted by promptUserOpenOrExecute() once the user chooses an action.
void canceled()
Emitted by promptUserOpenOrExecute() if user selects cancel.
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
A namespace for KIO globals.
KIOCORE_EXPORT MimetypeJob * mimetype(const QUrl &url, JobFlags flags=DefaultFlags)
Find MIME type for one file or directory.
QWidget * window(QObject *job)
void finished(int result)
QMimeType mimeTypeForName(const QString &nameOrAlias) const const
bool inherits(const QString &mimeTypeName) const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
WA_DeleteOnClose
QString url(FormattingOptions options) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri May 2 2025 12:02:24 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.