diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-07 23:31:58 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-15 14:40:40 -0400 |
| commit | 1897d60134e1cff31375f1c602196a99ece7fc86 (patch) | |
| tree | 3bc7391f2c7a15e500370b58a24e45756a2d411d /src | |
| parent | 7026aeaec859fd3632b1062e0cf14d2479c23076 (diff) | |
pulled java installation detection out of getFileExecutionContext() and into findJavaInstallation() because it was copy/pasted into EditExecutablesDialog
fixed FileDialogMemory::getOpenFileName() to also use the given directory correctly
handle browse binary button
Diffstat (limited to 'src')
| -rw-r--r-- | src/editexecutablesdialog.cpp | 104 | ||||
| -rw-r--r-- | src/editexecutablesdialog.h | 1 | ||||
| -rw-r--r-- | src/filedialogmemory.cpp | 16 | ||||
| -rw-r--r-- | src/organizercore.cpp | 70 | ||||
| -rw-r--r-- | src/organizercore.h | 2 |
5 files changed, 104 insertions, 89 deletions
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index efcec8e0..08e2c3d1 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -22,10 +22,12 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "filedialogmemory.h" #include "stackdata.h" #include "modlist.h" +#include "forcedloaddialog.h" +#include "organizercore.h" + #include <QMessageBox> #include <Shellapi.h> #include <utility.h> -#include "forcedloaddialog.h" #include <algorithm> using namespace MOBase; @@ -321,6 +323,30 @@ void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) save(); } +void EditExecutablesDialog::on_browseBinary_clicked() +{ + const QString binaryName = FileDialogMemory::getOpenFileName( + "editExecutableBinary", this, tr("Select a binary"), ui->binary->text(), + tr("Executable (%1)").arg("*.exe *.bat *.jar")); + + if (binaryName.isNull()) { + // canceled + return; + } + + if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { + setJarBinary(binaryName); + } else { + ui->binary->setText(QDir::toNativeSeparators(binaryName)); + } + + if (ui->title->text().isEmpty()) { + ui->title->setText(QFileInfo(binaryName).baseName()); + } + + save(); +} + void EditExecutablesDialog::on_browseWorkingDirectory_clicked() { QString dirName = FileDialogMemory::getExistingDirectory( @@ -356,6 +382,30 @@ void EditExecutablesDialog::on_configureLibraries_clicked() } } +void EditExecutablesDialog::setJarBinary(const QString& binaryName) +{ + auto java = OrganizerCore::findJavaInstallation(binaryName); + + if (java.isEmpty()) { + QMessageBox::information( + this, tr("Java (32-bit) required"), + tr("MO requires 32-bit java to run this application. If you already " + "have it installed, select javaw.exe from that installation as " + "the binary.")); + } + + // only save once + + m_settingUI = true; + ui->binary->setText(java); + ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); + ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); + m_settingUI = false; + + save(); +} + + void EditExecutablesDialog::resetInput() @@ -465,58 +515,6 @@ void EditExecutablesDialog::on_add_clicked() //refreshExecutablesWidget(); } -void EditExecutablesDialog::on_browseBinary_clicked() -{ - QString binaryName = FileDialogMemory::getOpenFileName( - "editExecutableBinary", this, tr("Select a binary"), QString(), - tr("Executable (%1)").arg("*.exe *.bat *.jar")); - - if (binaryName.isNull()) { - // canceled - return; - } - - if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { - QString binaryPath; - { // try to find java automatically - std::wstring binaryNameW = ToWString(binaryName); - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(binaryNameW.c_str(), nullptr, buffer) - > reinterpret_cast<HINSTANCE>(32)) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(binaryNameW.c_str(), &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", binaryNameW.c_str(), ::GetLastError()); - } else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = ToQString(buffer); - } - } - } - if (binaryPath.isEmpty()) { - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - QMessageBox::information(this, tr("Java (32-bit) required"), - tr("MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe " - "from that installation as the binary.")); - } else { - ui->binary->setText(binaryPath); - } - - ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); - ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); - } else { - ui->binary->setText(QDir::toNativeSeparators(binaryName)); - } - - if (ui->title->text().isEmpty()) { - ui->title->setText(QFileInfo(binaryName).baseName()); - } -} - void EditExecutablesDialog::on_remove_clicked() { if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()), diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 37b50127..1f3f0082 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -98,6 +98,7 @@ private: void clearEdits();
void setEdits(const Executable& e);
void save();
+ void setJarBinary(const QString& binaryName);
void resetInput();
bool executableChanged();
diff --git a/src/filedialogmemory.cpp b/src/filedialogmemory.cpp index 9607beb9..554a6235 100644 --- a/src/filedialogmemory.cpp +++ b/src/filedialogmemory.cpp @@ -61,14 +61,22 @@ QString FileDialogMemory::getOpenFileName( const QString &dir, const QString &filter, QString *selectedFilter,
QFileDialog::Options options)
{
- std::pair<std::map<QString, QString>::iterator, bool> currentDir =
- instance().m_Cache.insert(std::make_pair(dirID, dir));
+ QString currentDir = dir;
+
+ if (currentDir.isEmpty()) {
+ auto itor = instance().m_Cache.find(dirID);
+ if (itor != instance().m_Cache.end()) {
+ currentDir = itor->first;
+ }
+ }
+
+ QString result = QFileDialog::getOpenFileName(
+ parent, caption, currentDir, filter, selectedFilter, options);
- QString result = QFileDialog::getOpenFileName(parent, caption, currentDir.first->second,
- filter, selectedFilter, options);
if (!result.isNull()) {
instance().m_Cache[dirID] = QFileInfo(result).path();
}
+
return result;
}
diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 2172538e..c724e57f 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1182,6 +1182,34 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const return res; } +QString OrganizerCore::findJavaInstallation(const QString& jarFile) +{ + if (!jarFile.isEmpty()) { + // try to find java automatically based on the given jar file + std::wstring jarFileW = jarFile.toStdWString(); + + WCHAR buffer[MAX_PATH]; + if (::FindExecutableW(jarFileW.c_str(), nullptr, buffer) > (HINSTANCE)32) { + DWORD binaryType = 0UL; + if (!::GetBinaryTypeW(buffer, &binaryType)) { + qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); + } else if (binaryType == SCS_32BIT_BINARY || binaryType == SCS_64BIT_BINARY) { + return QString::fromWCharArray(buffer); + } + } + } + + // second attempt: look to the registry + QSettings reg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); + if (reg.contains("CurrentVersion")) { + QString currentVersion = reg.value("CurrentVersion").toString(); + return reg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); + } + + // not found + return {}; +} + bool OrganizerCore::getFileExecutionContext( QWidget* parent, const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type) @@ -1199,44 +1227,22 @@ bool OrganizerCore::getFileExecutionContext( type = FileExecutionTypes::Executable; return true; } else if (extension.compare("jar", Qt::CaseInsensitive) == 0) { - // types that need to be injected into - std::wstring targetPathW = targetInfo.absoluteFilePath().toStdWString(); - QString binaryPath; + auto java = findJavaInstallation(targetInfo.absoluteFilePath()); - { // try to find java automatically - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(buffer, &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); - } else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = QString::fromWCharArray(buffer); - } - } - } - if (binaryPath.isEmpty() && (extension == "jar")) { - // second attempt: look to the registry - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - binaryPath = QFileDialog::getOpenFileName( - parent, QObject::tr("Select binary"), QString(), QObject::tr("Binary") + " (*.exe)"); + if (java.isEmpty()) { + java = QFileDialog::getOpenFileName( + parent, QObject::tr("Select binary"), + QString(), QObject::tr("Binary") + " (*.exe)"); } - if (binaryPath.isEmpty()) { + + if (java.isEmpty()) { return false; } - binaryInfo = QFileInfo(binaryPath); - if (extension == "jar") { - arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } else { - arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } + binaryInfo = QFileInfo(java); + arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); type = FileExecutionTypes::Executable; + return true; } else { type = FileExecutionTypes::Other; diff --git a/src/organizercore.h b/src/organizercore.h index 8ed34e24..a4a57496 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -147,6 +147,8 @@ public: void doAfterLogin(const std::function<void()> &function) { m_PostLoginTasks.append(function); }
+ static QString findJavaInstallation(const QString& jarFile={});
+
static bool getFileExecutionContext(
QWidget* parent, const QFileInfo &targetInfo,
QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type);
|
