|
|
|
#include "installationpage.hpp"
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QTextCodec>
|
|
|
|
#include <QFileInfo>
|
|
|
|
#include <QFileDialog>
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
|
|
#include "mainwizard.hpp"
|
|
|
|
|
|
|
|
Wizard::InstallationPage::InstallationPage(QWidget *parent) :
|
|
|
|
QWizardPage(parent)
|
|
|
|
{
|
|
|
|
mWizard = qobject_cast<MainWizard*>(parent);
|
|
|
|
|
|
|
|
setupUi(this);
|
|
|
|
|
|
|
|
mFinished = false;
|
|
|
|
|
|
|
|
mThread = new QThread();
|
|
|
|
mUnshield = new UnshieldWorker();
|
|
|
|
mUnshield->moveToThread(mThread);
|
|
|
|
|
|
|
|
connect(mThread, SIGNAL(started()),
|
|
|
|
mUnshield, SLOT(extract()));
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(finished()),
|
|
|
|
mThread, SLOT(quit()));
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(finished()),
|
|
|
|
this, SLOT(installationFinished()), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(error(QString, QString)),
|
|
|
|
this, SLOT(installationError(QString, QString)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(textChanged(QString)),
|
|
|
|
installProgressLabel, SLOT(setText(QString)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(textChanged(QString)),
|
|
|
|
logTextEdit, SLOT(appendPlainText(QString)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(textChanged(QString)),
|
|
|
|
mWizard, SLOT(addLogText(QString)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(progressChanged(int)),
|
|
|
|
installProgressBar, SLOT(setValue(int)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
connect(mUnshield, SIGNAL(requestFileDialog(Wizard::Component)),
|
|
|
|
this, SLOT(showFileDialog(Wizard::Component)), Qt::QueuedConnection);
|
|
|
|
}
|
|
|
|
|
|
|
|
Wizard::InstallationPage::~InstallationPage()
|
|
|
|
{
|
|
|
|
if (mThread->isRunning()) {
|
|
|
|
mUnshield->stopWorker();
|
|
|
|
mThread->quit();
|
|
|
|
mThread->wait();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete mUnshield;
|
|
|
|
delete mThread;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Wizard::InstallationPage::initializePage()
|
|
|
|
{
|
|
|
|
QString path(field(QLatin1String("installation.path")).toString());
|
|
|
|
QStringList components(field(QLatin1String("installation.components")).toStringList());
|
|
|
|
|
|
|
|
logTextEdit->appendPlainText(QString("Installing to %1").arg(path));
|
|
|
|
logTextEdit->appendPlainText(QString("Installing %1.").arg(components.join(", ")));
|
|
|
|
|
|
|
|
installProgressBar->setMinimum(0);
|
|
|
|
|
|
|
|
// Set the progressbar maximum to a multiple of 100
|
|
|
|
// That way installing all three components would yield 300%
|
|
|
|
// When one component is done the bar will be filled by 33%
|
|
|
|
|
|
|
|
if (field(QLatin1String("installation.retailDisc")).toBool() == true) {
|
|
|
|
installProgressBar->setMaximum((components.count() * 100));
|
|
|
|
} else {
|
|
|
|
if (components.contains(QLatin1String("Tribunal"))
|
|
|
|
&& !mWizard->mInstallations[path].hasTribunal)
|
|
|
|
installProgressBar->setMaximum(100);
|
|
|
|
|
|
|
|
if (components.contains(QLatin1String("Bloodmoon"))
|
|
|
|
&& !mWizard->mInstallations[path].hasBloodmoon)
|
|
|
|
installProgressBar->setMaximum(installProgressBar->maximum() + 100);
|
|
|
|
}
|
|
|
|
|
|
|
|
startInstallation();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Wizard::InstallationPage::startInstallation()
|
|
|
|
{
|
|
|
|
QStringList components(field(QLatin1String("installation.components")).toStringList());
|
|
|
|
QString path(field(QLatin1String("installation.path")).toString());
|
|
|
|
|
|
|
|
if (field(QLatin1String("installation.retailDisc")).toBool() == true)
|
|
|
|
{
|
|
|
|
// Always install Morrowind
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Morrowind, true);
|
|
|
|
|
|
|
|
if (components.contains(QLatin1String("Tribunal")))
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Tribunal, true);
|
|
|
|
|
|
|
|
if (components.contains(QLatin1String("Bloodmoon")))
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Bloodmoon, true);
|
|
|
|
} else {
|
|
|
|
// Morrowind should already be installed
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Morrowind, false);
|
|
|
|
|
|
|
|
if (components.contains(QLatin1String("Tribunal"))
|
|
|
|
&& !mWizard->mInstallations[path].hasTribunal)
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Tribunal, true);
|
|
|
|
|
|
|
|
if (components.contains(QLatin1String("Bloodmoon"))
|
|
|
|
&& !mWizard->mInstallations[path].hasBloodmoon)
|
|
|
|
mUnshield->setInstallComponent(Wizard::Component_Bloodmoon, true);
|
|
|
|
|
|
|
|
// Set the location of the Morrowind.ini to update
|
|
|
|
mUnshield->setIniPath(mWizard->mInstallations[path].iniPath);
|
|
|
|
mUnshield->setupSettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the installation target path
|
|
|
|
mUnshield->setPath(path);
|
|
|
|
|
|
|
|
// Set the right codec to use for Morrowind.ini
|
|
|
|
QString language(field(QLatin1String("installation.language")).toString());
|
|
|
|
|
|
|
|
if (language == QLatin1String("Polish")) {
|
|
|
|
mUnshield->setIniCodec(QTextCodec::codecForName("windows-1250"));
|
|
|
|
} else if (language == QLatin1String("Russian")) {
|
|
|
|
mUnshield->setIniCodec(QTextCodec::codecForName("windows-1251"));
|
|
|
|
} else {
|
|
|
|
mUnshield->setIniCodec(QTextCodec::codecForName("windows-1252"));
|
|
|
|
}
|
|
|
|
|
|
|
|
mThread->start();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Wizard::InstallationPage::showFileDialog(Wizard::Component component)
|
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString path = QFileDialog::getExistingDirectory(this,
|
|
|
|
tr("Select %1 installation media").arg(name),
|
|
|
|
QDir::rootPath());
|
|
|
|
|
|
|
|
if (path.isEmpty()) {
|
|
|
|
logTextEdit->appendHtml(tr("<p><br/><span style=\"color:red;\"> \
|
Some PVS-Studio and cppcheck fixes
cppcheck:
[apps/esmtool/record.cpp:697]: (performance) Prefer prefix ++/-- operators for non-primitive types.
[apps/esmtool/record.cpp:1126]: (performance) Prefer prefix ++/-- operators for non-primitive types.
[apps/esmtool/record.cpp:1138]: (performance) Prefer prefix ++/-- operators for non-primitive types.
[apps/niftest/niftest.cpp:36]: (performance) Function parameter 'filename' should be passed by reference.
[apps/niftest/niftest.cpp:41]: (performance) Function parameter 'filename' should be passed by reference.
[apps/opencs/model/prefs/boolsetting.cpp:25]: (warning) Possible leak in public function. The pointer 'mWidget' is not deallocated before it is allocated.
[apps/opencs/model/prefs/shortcuteventhandler.cpp:52]: (warning) Return value of std::remove() ignored. Elements remain in container.
[apps/openmw/mwstate/quicksavemanager.cpp:5]: (performance) Variable 'mSaveName' is assigned in constructor body. Consider performing initialization in initialization list.
PVS-Studio:
apps/opencs/model/filter/parser.cpp 582 warn V560 A part of conditional expression is always true: allowPredefined.
apps/opencs/view/world/referencecreator.cpp 67 warn V547 Expression '!errors.empty()' is always false.
apps/opencs/view/world/referencecreator.cpp 74 warn V547 Expression '!errors.empty()' is always false.
apps/opencs/view/doc/loader.cpp 170 warn V560 A part of conditional expression is always true: !completed.
apps/opencs/view/doc/loader.cpp 170 warn V560 A part of conditional expression is always true: !error.empty().
apps/opencs/model/tools/pathgridcheck.cpp 32 err V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 32, 34.
apps/opencs/model/world/refidadapterimp.cpp 1376 err V547 Expression 'subColIndex < 3' is always true.
apps/openmw/mwgui/widgets.hpp 318 warn V703 It is odd that the 'mEnableRepeat' field in derived class 'MWScrollBar' overwrites field in base class 'ScrollBar'. Check lines: widgets.hpp:318, MyGUI_ScrollBar.h:179.
apps/openmw/mwgui/widgets.hpp 319 warn V703 It is odd that the 'mRepeatTriggerTime' field in derived class 'MWScrollBar' overwrites field in base class 'ScrollBar'. Check lines: widgets.hpp:319, MyGUI_ScrollBar.h:180.
apps/openmw/mwgui/widgets.hpp 320 warn V703 It is odd that the 'mRepeatStepTime' field in derived class 'MWScrollBar' overwrites field in base class 'ScrollBar'. Check lines: widgets.hpp:320, MyGUI_ScrollBar.h:181
apps/openmw/mwmechanics/actors.cpp 1425 warn V547 Expression '!detected' is always true.
apps/openmw/mwmechanics/character.cpp 2155 err V547 Expression 'mode == 0' is always true.
apps/openmw/mwmechanics/character.cpp 1192 warn V592 The expression was enclosed by parentheses twice: ((expression)). One pair of parentheses is unnecessary or misprint is present.
apps/openmw/mwmechanics/character.cpp 521 warn V560 A part of conditional expression is always true: (idle == mIdleState).
apps/openmw/mwmechanics/pathfinding.cpp 317 err V547 Expression 'mPath.size() >= 2' is always true.
apps/openmw/mwscript/interpretercontext.cpp 409 warn V560 A part of conditional expression is always false: rank > 9.
apps/openmw/mwgui/windowbase.cpp 28 warn V560 A part of conditional expression is always true: !visible.
apps/openmw/mwgui/journalwindow.cpp 561 warn V547 Expression '!mAllQuests' is always false.
apps/openmw/mwgui/referenceinterface.cpp 18 warn V571 Recurring check. The '!mPtr.isEmpty()' condition was already verified in line 16.
apps/openmw/mwworld/scene.cpp 463 warn V547 Expression 'adjustPlayerPos' is always true.
apps/openmw/mwworld/worldimp.cpp 409 err V766 An item with the same key '"sCompanionShare"' has already been added.
apps/openmw/mwworld/cellstore.cpp 691 warn V519 The 'state.mWaterLevel' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 689, 691.
apps/openmw/mwworld/weather.cpp 1125 warn V519 The 'mResult.mParticleEffect' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1123, 1125.
apps/openmw/mwworld/weather.cpp 1137 warn V519 The 'mResult.mParticleEffect' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1135, 1137.
apps/wizard/unshield/unshieldworker.cpp 475 warn V728 An excessive check can be simplified. The '(A && B) || (!A && !B)' expression is equivalent to the 'bool(A) == bool(B)' expression.
apps/wizard/installationpage.cpp 163 warn V735 Possibly an incorrect HTML. The "</p" closing tag was encountered, while the "</span" tag was expected.
components/fontloader/fontloader.cpp 427 err V547 Expression 'i == 1' is always true.
components/nifosg/nifloader.cpp 282 warn V519 The 'created' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 278, 282.
components/esm/loadregn.cpp 119 err V586 The 'clear' function is called twice for deallocation of the same resource. Check lines: 112, 119.
components/esm/cellref.cpp 178 warn V581 The conditional expressions of the 'if' statements situated alongside each other are identical. Check lines: 175, 178.
components/esmterrain/storage.cpp 235 warn V560 A part of conditional expression is always true: colStart == 0.
components/esmterrain/storage.cpp 237 warn V560 A part of conditional expression is always true: rowStart == 0.
7 years ago
|
|
|
<b>Error: The installation was aborted by the user</b></span></p>"));
|
|
|
|
|
|
|
|
mWizard->addLogText(QLatin1String("Error: The installation was aborted by the user"));
|
|
|
|
mWizard->mError = true;
|
|
|
|
|
|
|
|
emit completeChanged();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
mUnshield->setDiskPath(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Wizard::InstallationPage::installationFinished()
|
|
|
|
{
|
|
|
|
QMessageBox msgBox;
|
|
|
|
msgBox.setWindowTitle(tr("Installation finished"));
|
|
|
|
msgBox.setIcon(QMessageBox::Information);
|
|
|
|
msgBox.setStandardButtons(QMessageBox::Ok);
|
|
|
|
msgBox.setText(tr("Installation completed successfully!"));
|
|
|
|
|
|
|
|
msgBox.exec();
|
|
|
|
|
|
|
|
mFinished = true;
|
|
|
|
emit completeChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Wizard::InstallationPage::installationError(const QString &text, const QString &details)
|
|
|
|
{
|
|
|
|
installProgressLabel->setText(tr("Installation failed!"));
|
|
|
|
|
|
|
|
logTextEdit->appendHtml(tr("<p><br/><span style=\"color:red;\"> \
|
|
|
|
<b>Error: %1</b></p>").arg(text));
|
|
|
|
logTextEdit->appendHtml(tr("<p><span style=\"color:red;\"> \
|
|
|
|
<b>%1</b></p>").arg(details));
|
|
|
|
|
|
|
|
mWizard->addLogText(QLatin1String("Error: ") + text);
|
|
|
|
mWizard->addLogText(details);
|
|
|
|
|
|
|
|
mWizard->mError = true;
|
|
|
|
QMessageBox msgBox;
|
|
|
|
msgBox.setWindowTitle(tr("An error occurred"));
|
|
|
|
msgBox.setIcon(QMessageBox::Critical);
|
|
|
|
msgBox.setStandardButtons(QMessageBox::Ok);
|
|
|
|
msgBox.setText(tr("<html><head/><body><p><b>The Wizard has encountered an error</b></p> \
|
|
|
|
<p>The error reported was:</p><p>%1</p> \
|
|
|
|
<p>Press "Show Details..." for more information.</p></body></html>").arg(text));
|
|
|
|
|
|
|
|
msgBox.setDetailedText(details);
|
|
|
|
msgBox.exec();
|
|
|
|
|
|
|
|
|
|
|
|
emit completeChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Wizard::InstallationPage::isComplete() const
|
|
|
|
{
|
|
|
|
if (!mWizard->mError) {
|
|
|
|
return mFinished;
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int Wizard::InstallationPage::nextId() const
|
|
|
|
{
|
|
|
|
if (field(QLatin1String("installation.retailDisc")).toBool() == true) {
|
|
|
|
return MainWizard::Page_Conclusion;
|
|
|
|
} else {
|
|
|
|
if (!mWizard->mError) {
|
|
|
|
return MainWizard::Page_Import;
|
|
|
|
} else {
|
|
|
|
return MainWizard::Page_Conclusion;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|