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 }