diff --git a/apps/wizard/installationpage.cpp b/apps/wizard/installationpage.cpp index 33ceadf8c..3fcbd1fe2 100644 --- a/apps/wizard/installationpage.cpp +++ b/apps/wizard/installationpage.cpp @@ -148,13 +148,18 @@ void Wizard::InstallationPage::showFileDialog(Wizard::Component component) break; } - QString fileName = QFileDialog::getOpenFileName( - this, - tr("Select %1 installation file").arg(name), - QDir::rootPath(), - tr("InstallShield header files (*.hdr)")); +// QString fileName = QFileDialog::getOpenFileName( +// this, +// tr("Select %1 installation file").arg(name), +// QDir::rootPath(), +// tr("InstallShield header files (*.hdr)")); - if (fileName.isEmpty()) { + + QString path = QFileDialog::getExistingDirectory(this, + tr("Select %1 installation media").arg(name), + QDir::rootPath()); + + if (path.isEmpty()) { qDebug() << "Cancel was clicked!"; logTextEdit->appendHtml(tr("


\ @@ -164,8 +169,7 @@ void Wizard::InstallationPage::showFileDialog(Wizard::Component component) return; } - QFileInfo info(fileName); - mUnshield->setComponentPath(component, info.absolutePath()); + mUnshield->setDiskPath(path); } void Wizard::InstallationPage::installationFinished() diff --git a/apps/wizard/unshield/unshieldworker.cpp b/apps/wizard/unshield/unshieldworker.cpp index c23738943..223de41ce 100644 --- a/apps/wizard/unshield/unshieldworker.cpp +++ b/apps/wizard/unshield/unshieldworker.cpp @@ -20,12 +20,9 @@ Wizard::UnshieldWorker::UnshieldWorker(QObject *parent) : { unshield_set_log_level(0); - mMorrowindPath = QString(); - mTribunalPath = QString(); - mBloodmoonPath = QString(); - mPath = QString(); mIniPath = QString(); + mDiskPath = QString(); // Default to Latin encoding mIniCodec = QTextCodec::codecForName("windows-1252"); @@ -78,41 +75,6 @@ bool Wizard::UnshieldWorker::getInstallComponent(Component component) return false; } -void Wizard::UnshieldWorker::setComponentPath(Wizard::Component component, const QString &path) -{ - QWriteLocker writeLock(&mLock); - switch (component) { - - case Wizard::Component_Morrowind: - mMorrowindPath = path; - break; - case Wizard::Component_Tribunal: - mTribunalPath = path; - break; - case Wizard::Component_Bloodmoon: - mBloodmoonPath = path; - break; - } - - mWait.wakeAll(); -} - -QString Wizard::UnshieldWorker::getComponentPath(Component component) -{ - QReadLocker readLock(&mLock); - switch (component) { - - case Wizard::Component_Morrowind: - return mMorrowindPath; - case Wizard::Component_Tribunal: - return mTribunalPath; - case Wizard::Component_Bloodmoon: - return mBloodmoonPath; - } - - return QString(); -} - void Wizard::UnshieldWorker::setComponentDone(Component component, bool done) { QWriteLocker writeLock(&mLock); @@ -159,6 +121,13 @@ void Wizard::UnshieldWorker::setIniPath(const QString &path) mIniPath = path; } +void Wizard::UnshieldWorker::setDiskPath(const QString &path) +{ + QWriteLocker writeLock(&mLock); + mDiskPath = path; + mWait.wakeAll(); +} + QString Wizard::UnshieldWorker::getPath() { QReadLocker readLock(&mLock); @@ -171,6 +140,13 @@ QString Wizard::UnshieldWorker::getIniPath() return mIniPath; } +QString Wizard::UnshieldWorker::getDiskPath() +{ + QReadLocker readLock(&mLock); + return mDiskPath; +} + + void Wizard::UnshieldWorker::setIniCodec(QTextCodec *codec) { QWriteLocker writeLock(&mLock); @@ -332,7 +308,7 @@ bool Wizard::UnshieldWorker::installFile(const QString &fileName, const QString QFileInfoList list(dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)); - foreach(QFileInfo info, list) { + foreach(const QFileInfo &info, list) { if (info.isDir()) { result = installFile(fileName, info.absoluteFilePath()); } else { @@ -360,7 +336,7 @@ bool Wizard::UnshieldWorker::installDirectory(const QString &dirName, const QStr QFileInfoList list(dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs)); - foreach(QFileInfo info, list) { + foreach(const QFileInfo &info, list) { if (info.isSymLink()) continue; @@ -383,190 +359,75 @@ void Wizard::UnshieldWorker::extract() { qDebug() << "extract!"; - qDebug() << findFiles(QLatin1String("data1.hdr"), QLatin1String("/mnt/cdrom")); -// QDir disk; - -// if (getInstallComponent(Wizard::Component_Morrowind)) -// { -// if (!getComponentDone(Wizard::Component_Morrowind)) -// { -// if (getComponentPath(Wizard::Component_Morrowind).isEmpty()) { -// qDebug() << "request file dialog"; -// QReadLocker readLock(&mLock); -// emit requestFileDialog(Wizard::Component_Morrowind); -// mWait.wait(&mLock); -// } - -// if (!getComponentPath(Wizard::Component_Morrowind).isEmpty()) { -// disk.setPath(getComponentPath(Wizard::Component_Morrowind)); - -// if (!findInCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), QLatin1String("Morrowind.bsa"))) -// { -// QReadLocker readLock(&mLock); -// emit requestFileDialog(Wizard::Component_Morrowind); -// mWait.wait(&mLock); -// } else { -// if (installComponent(Wizard::Component_Morrowind)) { -// setComponentDone(Wizard::Component_Morrowind, true); -// } else { -// qDebug() << "Erorr installing Morrowind"; - -// return; -// } -// } -// } -// } -// } - -// if (getInstallComponent(Wizard::Component_Tribunal)) -// { -// setupAddon(Wizard::Component_Tribunal); -// } - -// if (getInstallComponent(Wizard::Component_Bloodmoon)) -// { -// setupAddon(Wizard::Component_Bloodmoon); -// } - -// // Update Morrowind configuration -// if (getInstallComponent(Wizard::Component_Tribunal)) -// { -// mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Tribunal.bsa"))); -// mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Tribunal.esm"))); -// } - -// if (getInstallComponent(Wizard::Component_Bloodmoon)) -// { -// mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Bloodmoon.bsa"))); -// mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Bloodmoon.esm"))); -// } - -// if (getInstallComponent(Wizard::Component_Tribunal) && -// getInstallComponent(Wizard::Component_Bloodmoon)) -// { -// mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Tribunal.bsa"))); -// mIniSettings.setValue(QLatin1String("Archives/Archive1"), QVariant(QString("Bloodmoon.bsa"))); -// mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Tribunal.esm"))); -// mIniSettings.setValue(QLatin1String("Game Files/Game File2"), QVariant(QString("Bloodmoon.esm"))); -// } - - -// // Write the settings to the Morrowind config file -// writeSettings(); - -// // Remove the temporary directory -// //removeDirectory(getPath() + QDir::separator() + QLatin1String("extract-temp")); - -// // Fill the progress bar -// int total = 0; - -// if (getInstallComponent(Wizard::Component_Morrowind)) -// total = 100; - -// if (getInstallComponent(Wizard::Component_Tribunal)) -// total = total + 100; - -// if (getInstallComponent(Wizard::Component_Bloodmoon)) -// total = total + 100; - -// emit textChanged(tr("Installation finished!")); -// emit progressChanged(total); -// emit finished(); - -// qDebug() << "installation finished!"; -} - -void Wizard::UnshieldWorker::setupAddon(Component component) -{ - qDebug() << "SetupAddon!" << getComponentPath(component) << getComponentPath(Wizard::Component_Morrowind); - - if (!getComponentDone(component)) + if (getInstallComponent(Wizard::Component_Morrowind)) { - qDebug() << "Component not done!"; - - QDir disk(getComponentPath(Wizard::Component_Morrowind)); - QString name; - if (component == Wizard::Component_Tribunal) - name = QLatin1String("Tribunal"); - - if (component == Wizard::Component_Bloodmoon) - name = QLatin1String("Bloodmoon"); - - if (name.isEmpty()) { - emit error(tr("Component parameter is invalid!"), tr("An invalid component parameter was supplied.")); - return; - } - - qDebug() << "Determine if file is in current data1.hdr: " << name; - - if (!disk.isEmpty()) { - if (!findInCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), name + QLatin1String(".bsa"))) - { - if (!disk.cd(name)) { - qDebug() << "not found on cd!"; - QReadLocker locker(&mLock); - emit requestFileDialog(component); - mWait.wait(&mLock); - - } else if (disk.exists(QLatin1String("data1.hdr"))) { - if (!findInCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), name + QLatin1String(".bsa"))) - { - QReadLocker locker(&mLock); - emit requestFileDialog(component); - mWait.wait(&mLock); - } else { - setComponentPath(component, disk.absolutePath()); - disk.setPath(getComponentPath(component)); - } - } - } - - } else { - QReadLocker locker(&mLock); - emit requestFileDialog(component); - mWait.wait(&mLock); - } - - disk.setPath(getComponentPath(component)); - - if (!findInCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), name + QLatin1String(".bsa"))) - { - if (!disk.cd(name)) { - qDebug() << "not found on cd!"; - QReadLocker locker(&mLock); - emit requestFileDialog(component); - mWait.wait(&mLock); - - } else if (disk.exists(QLatin1String("data1.hdr"))) { - if (!findInCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), name + QLatin1String(".bsa"))) - { - QReadLocker locker(&mLock); - emit requestFileDialog(component); - mWait.wait(&mLock); - } else { - setComponentPath(component, disk.absolutePath()); - disk.setPath(getComponentPath(component)); - } - } - - // Make sure the dir is up-to-date - //disk.setPath(getComponentPath(component)); - } - - // Now do the actual installing - - if (installComponent(component)) { - setComponentDone(component, true); - } else { - qDebug() << "Error installing " << name; - return; - } - - + if (!getComponentDone(Wizard::Component_Morrowind)) + if (!setupComponent(Wizard::Component_Morrowind)) + return; } + + if (getInstallComponent(Wizard::Component_Tribunal)) + { + if (!getComponentDone(Wizard::Component_Tribunal)) + if (!setupComponent(Wizard::Component_Tribunal)) + return; + } + + if (getInstallComponent(Wizard::Component_Bloodmoon)) + { + if (!getComponentDone(Wizard::Component_Bloodmoon)) + if (!setupComponent(Wizard::Component_Bloodmoon)) + return; + } + + // Update Morrowind configuration + if (getInstallComponent(Wizard::Component_Tribunal)) + { + mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Tribunal.bsa"))); + mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Tribunal.esm"))); + } + + if (getInstallComponent(Wizard::Component_Bloodmoon)) + { + mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Bloodmoon.bsa"))); + mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Bloodmoon.esm"))); + } + + if (getInstallComponent(Wizard::Component_Tribunal) && + getInstallComponent(Wizard::Component_Bloodmoon)) + { + mIniSettings.setValue(QLatin1String("Archives/Archive0"), QVariant(QString("Tribunal.bsa"))); + mIniSettings.setValue(QLatin1String("Archives/Archive1"), QVariant(QString("Bloodmoon.bsa"))); + mIniSettings.setValue(QLatin1String("Game Files/Game File1"), QVariant(QString("Tribunal.esm"))); + mIniSettings.setValue(QLatin1String("Game Files/Game File2"), QVariant(QString("Bloodmoon.esm"))); + } + + // Write the settings to the Morrowind config file + writeSettings(); + + // Remove the temporary directory + removeDirectory(getPath() + QDir::separator() + QLatin1String("extract-temp")); + + // Fill the progress bar + int total = 0; + + if (getInstallComponent(Wizard::Component_Morrowind)) + total = 100; + + if (getInstallComponent(Wizard::Component_Tribunal)) + total = total + 100; + + if (getInstallComponent(Wizard::Component_Bloodmoon)) + total = total + 100; + + emit textChanged(tr("Installation finished!")); + emit progressChanged(total); + emit finished(); + + qDebug() << "installation finished!"; } -bool Wizard::UnshieldWorker::installComponent(Component component) +bool Wizard::UnshieldWorker::setupComponent(Component component) { QString name; switch (component) { @@ -587,13 +448,79 @@ bool Wizard::UnshieldWorker::installComponent(Component component) return false; } + bool found = false; + QString cabFile; + QDir disk; + + // Keep showing the file dialog until we find the necessary install files + while (!found) { + if (getDiskPath().isEmpty()) { + QReadLocker readLock(&mLock); + emit requestFileDialog(component); + mWait.wait(&mLock); + disk.setPath(getDiskPath()); + } else { + disk.setPath(getDiskPath()); + } + + QStringList list(findFiles(QLatin1String("data1.hdr"), disk.absolutePath())); + + foreach (const QString &file, list) { + qDebug() << "current cab file is: " << file; + if (findInCab(file, name + QLatin1String(".bsa"))) { + cabFile = file; + found = true; + } + } + + if (!found) { + QReadLocker readLock(&mLock); + emit requestFileDialog(component); + mWait.wait(&mLock); + } + } + + if (installComponent(component, cabFile)) { + setComponentDone(component, true); + return true; + } else { + qDebug() << "Erorr installing " << name; + return false; + } + + return true; +} + +bool Wizard::UnshieldWorker::installComponent(Component component, const QString &path) +{ + QString name; + switch (component) { + + case Wizard::Component_Morrowind: + name = QLatin1String("Morrowind"); + break; + case Wizard::Component_Tribunal: + name = QLatin1String("Tribunal"); + break; + case Wizard::Component_Bloodmoon: + name = QLatin1String("Bloodmoon"); + break; + } + + if (name.isEmpty()) { + emit error(tr("Component parameter is invalid!"), tr("An invalid component parameter was supplied.")); + return false; + } + + qDebug() << "Install " << name << " from " << path; + + emit textChanged(tr("Installing %1").arg(name)); - QDir disk(getComponentPath(component)); + QFileInfo info(path); - if (!disk.exists()) { - qDebug() << "Component path not set: " << getComponentPath(Wizard::Component_Morrowind); - emit error(tr("Component path not set!"), tr("The source path for %1 was not set.").arg(name)); + if (!info.exists()) { + emit error(tr("Installation media path not set!"), tr("The source path for %1 was not set.").arg(name)); return false; } @@ -606,7 +533,6 @@ bool Wizard::UnshieldWorker::installComponent(Component component) removeDirectory(tempPath); if (!temp.mkpath(tempPath)) { - qDebug() << "Can't make path"; emit error(tr("Cannot create temporary directory!"), tr("Failed to create %1.").arg(tempPath)); return false; } @@ -619,24 +545,15 @@ bool Wizard::UnshieldWorker::installComponent(Component component) } if (!temp.cd(name)) { - qDebug() << "Can't cd to dir"; emit error(tr("Cannot move into temporary directory!"), tr("Failed to move into %1.").arg(temp.absoluteFilePath(name))); return false; } // Extract the installation files - if (!extractCab(disk.absoluteFilePath(QLatin1String("data1.hdr")), temp.absolutePath())) + if (!extractCab(info.absoluteFilePath(), temp.absolutePath())) return false; // Move the files from the temporary path to the destination folder -// emit textChanged(tr("Moving installation files")); -// if (!moveDirectory(temp.absoluteFilePath(QLatin1String("Data Files")), getPath())) { -// qDebug() << "failed to move files!"; -// emit error(tr("Moving extracted files failed!"), -// tr("Failed to move files from %1 to %2.").arg(temp.absoluteFilePath(QLatin1String("Data Files")), -// getPath())); -// return false; -// } emit textChanged(tr("Moving installation files")); // Install extracted directories @@ -658,20 +575,20 @@ bool Wizard::UnshieldWorker::installComponent(Component component) // Install directories from disk foreach (const QString &dir, directories) { qDebug() << "\n\nDISK DIRS!"; - installDirectory(dir, disk.absolutePath(), false); + installDirectory(dir, info.absolutePath(), false); } - QFileInfo info(disk.absoluteFilePath("Data Files")); - if (info.exists()) { + QFileInfo datafiles(info.absolutePath() + QDir::separator() + QLatin1String("Data Files")); + if (datafiles.exists()) { emit textChanged(tr("Installing: Data Files directory")); - copyDirectory(info.absoluteFilePath(), getPath()); + copyDirectory(datafiles.absoluteFilePath(), getPath()); } if (component == Wizard::Component_Morrowind) { QStringList files; files << QLatin1String("Morrowind.esm") - << QLatin1String("Morrowin.bsa"); + << QLatin1String("Morrowind.bsa"); foreach (const QString &file, files) { if (!installFile(file, temp.absolutePath())) { @@ -702,7 +619,9 @@ bool Wizard::UnshieldWorker::installComponent(Component component) QStringList files; files << QLatin1String("Tribunal.esm") - << QLatin1String("Tribunal.bsa"); + << QLatin1String("Tribunal.bsa") + << QLatin1String("Morrowind.esm") + << QLatin1String("Morrowind.bsa"); foreach (const QString &file, files) { if (!installFile(file, temp.absolutePath())) { @@ -710,7 +629,6 @@ bool Wizard::UnshieldWorker::installComponent(Component component) return false; } } - } if (component == Wizard::Component_Bloodmoon) @@ -726,7 +644,9 @@ bool Wizard::UnshieldWorker::installComponent(Component component) QStringList files; files << QLatin1String("Bloodmoon.esm") - << QLatin1String("Bloodmoon.bsa"); + << QLatin1String("Bloodmoon.bsa") + << QLatin1String("Morrowind.esm") + << QLatin1String("Morrowind.bsa"); foreach (const QString &file, files) { if (!installFile(file, temp.absolutePath())) { @@ -736,13 +656,12 @@ bool Wizard::UnshieldWorker::installComponent(Component component) } // Load Morrowind configuration settings from the setup script - QFileInfo inx(disk.absoluteFilePath(QLatin1String("setup.inx"))); + QStringList list(findFiles(QLatin1String("setup.inx"), getDiskPath())); - if (inx.exists()) { - emit textChanged(tr("Updating Morrowind configuration file")); - mIniSettings.parseInx(inx.absoluteFilePath()); - } else { - qDebug() << "setup.inx not found!"; + emit textChanged(tr("Updating Morrowind configuration file")); + + foreach (const QString &inx, list) { + mIniSettings.parseInx(inx); } } @@ -799,15 +718,23 @@ bool Wizard::UnshieldWorker::extractFile(Unshield *unshield, const QString &dest return success; } -QString Wizard::UnshieldWorker::findFile(const QString &fileName, const QString &path) +QString Wizard::UnshieldWorker::findFile(const QString &fileName, const QString &path, int depth) { - return findFiles(fileName, path).first(); + return findFiles(fileName, path, depth).first(); } -QStringList Wizard::UnshieldWorker::findFiles(const QString &fileName, const QString &path) +QStringList Wizard::UnshieldWorker::findFiles(const QString &fileName, const QString &path, int depth) { + qDebug() << "Searching path: " << path << " for: " << fileName; + static const int MAXIMUM_DEPTH = 5; + + if (depth >= MAXIMUM_DEPTH) { + qWarning("Maximum directory depth limit reached."); + return QStringList(); + } + QStringList result; - QDir dir(source); + QDir dir(path); if (!dir.exists()) return QStringList(); @@ -821,7 +748,7 @@ QStringList Wizard::UnshieldWorker::findFiles(const QString &fileName, const QSt continue; if (info.isDir()) { - result = findFiles(file, info.absoluteFilePath()); + result.append(findFiles(fileName, info.absoluteFilePath(), depth + 1)); } else { if (info.fileName() == fileName) { qDebug() << "File found at: " << info.absoluteFilePath(); @@ -831,7 +758,6 @@ QStringList Wizard::UnshieldWorker::findFiles(const QString &fileName, const QSt } return result; - } bool Wizard::UnshieldWorker::findInCab(const QString &cabFile, const QString &fileName) @@ -855,7 +781,6 @@ bool Wizard::UnshieldWorker::findInCab(const QString &cabFile, const QString &fi if (unshield_file_is_valid(unshield, j)) { QString current(QString::fromUtf8(unshield_file_name(unshield, j))); - qDebug() << "Current is: " << current; if (current.toLower() == fileName.toLower()) return true; // File is found! } diff --git a/apps/wizard/unshield/unshieldworker.hpp b/apps/wizard/unshield/unshieldworker.hpp index 74ae6c6d8..bda951456 100644 --- a/apps/wizard/unshield/unshieldworker.hpp +++ b/apps/wizard/unshield/unshieldworker.hpp @@ -31,7 +31,8 @@ namespace Wizard void setInstallComponent(Wizard::Component component, bool install); - void setComponentPath(Wizard::Component component, const QString &path); +// void setComponentPath(Wizard::Component component, const QString &path); + void setDiskPath(const QString &path); void setPath(const QString &path); void setIniPath(const QString &path); @@ -49,7 +50,8 @@ namespace Wizard bool getInstallComponent(Component component); - QString getComponentPath(Component component); + //QString getComponentPath(Component component); + QString getDiskPath(); void setComponentDone(Component component, bool done = true); bool getComponentDone(Component component); @@ -66,18 +68,14 @@ namespace Wizard bool extractFile(Unshield *unshield, const QString &destination, const QString &prefix, int index, int counter); bool findInCab(const QString &cabFile, const QString &fileName); - QString findFile(const QString &fileName, const QString &path); - QStringList findFiles(const QString &fileName, const QString &path); + QString findFile(const QString &fileName, const QString &path, int depth = 0); + QStringList findFiles(const QString &fileName, const QString &path, int depth = 0); bool installFile(const QString &fileName, const QString &path); bool installDirectory(const QString &dirName, const QString &path, bool recursive = true); - bool installMorrowind(); - bool installTribunal(); - bool installBloodmoon(); - - bool installComponent(Component component); - void setupAddon(Component component); + bool installComponent(Component component, const QString &path); + bool setupComponent(Component component); bool mInstallMorrowind; bool mInstallTribunal; @@ -87,12 +85,9 @@ namespace Wizard bool mTribunalDone; bool mBloodmoonDone; - QString mMorrowindPath; - QString mTribunalPath; - QString mBloodmoonPath; - QString mPath; QString mIniPath; + QString mDiskPath; IniSettings mIniSettings;