File indexing completed on 2024-05-05 04:38:47

0001 /*
0002     SPDX-FileCopyrightText: 2012 Ivan Shapovalov <intelfx100@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "shellutils.h"
0008 #include <QGuiApplication>
0009 #include <QTextStream>
0010 #include <QUrl>
0011 #include <QFile>
0012 #include <QList>
0013 #include <interfaces/icore.h>
0014 #include <interfaces/iuicontroller.h>
0015 
0016 #include <KLocalizedString>
0017 #include <KMessageBox>
0018 #include <KMessageBox_KDevCompat>
0019 #include <KParts/MainWindow>
0020 
0021 namespace KDevelop {
0022 bool askUser(const QString& mainText,
0023              const QString& ttyPrompt,
0024              const QString& mboxTitle,
0025              const QString& mboxAdditionalText,
0026              const QString& confirmText,
0027              const QString& rejectText,
0028              bool ttyDefaultToYes)
0029 {
0030     if (!qobject_cast<QGuiApplication*>(qApp)) {
0031         // no ui-mode e.g. for duchainify and other tools
0032         QTextStream out(stdout);
0033         out << mainText << Qt::endl;
0034         QTextStream in(stdin);
0035         QString input;
0036         while (true) {
0037             if (ttyDefaultToYes) {
0038                 out << ttyPrompt << QLatin1String(": [Y/n] ") << Qt::flush;
0039             } else {
0040                 out << ttyPrompt << QLatin1String(": [y/N] ") << Qt::flush;
0041             }
0042             input = in.readLine().trimmed();
0043             if (input.isEmpty()) {
0044                 return ttyDefaultToYes;
0045             } else if (input.toLower() == QLatin1String("y")) {
0046                 return true;
0047             } else if (input.toLower() == QLatin1String("n")) {
0048                 return false;
0049             }
0050         }
0051     } else {
0052         auto okButton = KStandardGuiItem::ok();
0053         okButton.setText(confirmText);
0054         auto rejectButton = KStandardGuiItem::cancel();
0055         rejectButton.setText(rejectText);
0056         int userAnswer = KMessageBox::questionTwoActions(ICore::self()->uiController()->activeMainWindow(),
0057                                                          mainText + QLatin1String("\n\n") + mboxAdditionalText,
0058                                                          mboxTitle, okButton, rejectButton);
0059         return userAnswer == KMessageBox::PrimaryAction;
0060     }
0061 }
0062 
0063 bool ensureWritable(const QList<QUrl>& urls)
0064 {
0065     QStringList notWritable;
0066     for (const QUrl& url : urls) {
0067         if (url.isLocalFile()) {
0068             QFile file(url.toLocalFile());
0069             if (file.exists() && !(file.permissions() & QFileDevice::WriteOwner) &&
0070                 !(file.permissions() & QFileDevice::WriteGroup)) {
0071                 notWritable << url.toLocalFile();
0072             }
0073         }
0074     }
0075 
0076     if (!notWritable.isEmpty()) {
0077         int answer = KMessageBox::questionTwoActionsCancel(
0078             ICore::self()->uiController()->activeMainWindow(),
0079             i18n("You don't have write permissions for the following files; add write permissions for owner before "
0080                  "saving?")
0081                 + QLatin1String("\n\n") + notWritable.join(QLatin1Char('\n')),
0082             i18nc("@title:window", "Some Files are Write-Protected"),
0083             KGuiItem(i18nc("@action:button", "Set Write Permissions"), QStringLiteral("dialog-ok")),
0084             KGuiItem(i18nc("@action:button", "Ignore"), QStringLiteral("dialog-cancel")), KStandardGuiItem::cancel());
0085         if (answer == KMessageBox::PrimaryAction) {
0086             bool success = true;
0087             for (const QString& filename : qAsConst(notWritable)) {
0088                 QFile file(filename);
0089                 QFileDevice::Permissions permissions = file.permissions();
0090                 permissions |= QFileDevice::WriteOwner;
0091                 success &= file.setPermissions(permissions);
0092             }
0093 
0094             if (!success) {
0095                 KMessageBox::error(ICore::self()->uiController()->activeMainWindow(),
0096                                    i18n("Failed adding write permissions for some files."),
0097                                    i18nc("@title:window", "Failed Setting Permissions"));
0098                 return false;
0099             }
0100         }
0101         return answer != KMessageBox::Cancel;
0102     }
0103     return true;
0104 }
0105 
0106 }