// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpch.h" #include "mainwindow.h" #include "downloader.h" #include "archive.h" #include "wizarddialog.h" #include "profilesdialog.h" #include "configfile.h" #include "config.h" #include "profilesmodel.h" #include "seven_zip.h" #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) #include #include #endif #ifdef DEBUG_NEW #define new DEBUG_NEW #endif CMainWindow::CMainWindow():QMainWindow(), m_archive(NULL), m_statusLabel(NULL) { setupUi(this); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button = new QWinTaskbarButton(this); #endif connect(resumeButton, SIGNAL(clicked()), SLOT(onResumeClicked())); connect(stopButton, SIGNAL(clicked()), SLOT(onStopClicked())); // downloader m_downloader = new CDownloader(this); connect(m_downloader, SIGNAL(downloadPrepare()), SLOT(onDownloadPrepare())); connect(m_downloader, SIGNAL(downloadInit(qint64, qint64)), SLOT(onDownloadInit(qint64, qint64))); connect(m_downloader, SIGNAL(downloadStart()), SLOT(onDownloadStart())); connect(m_downloader, SIGNAL(downloadStop()), SLOT(onDownloadStop())); connect(m_downloader, SIGNAL(downloadProgress(qint64)), SLOT(onDownloadProgress(qint64))); connect(m_downloader, SIGNAL(downloadSuccess(qint64)), SLOT(onDownloadSuccess(qint64))); connect(m_downloader, SIGNAL(downloadFail(QString)), SLOT(onDownloadFail(QString))); connect(m_downloader, SIGNAL(htmlPageContent(QString)), SLOT(onHtmlPageContent(QString))); // archive m_archive = new CArchive(this); connect(m_archive, SIGNAL(extractPrepare()), SLOT(onExtractPrepare())); connect(m_archive, SIGNAL(extractInit(qint64, qint64)), SLOT(onExtractInit(qint64, qint64))); connect(m_archive, SIGNAL(extractStart()), SLOT(onExtractStart())); connect(m_archive, SIGNAL(extractStop()), SLOT(onExtractStop())); connect(m_archive, SIGNAL(extractProgress(qint64, QString)), SLOT(onExtractProgress(qint64, QString))); connect(m_archive, SIGNAL(extractSuccess(qint64)), SLOT(onExtractSuccess(qint64))); connect(m_archive, SIGNAL(extractFail(QString)), SLOT(onExtractFail(QString))); connect(actionProfiles, SIGNAL(triggered()), SLOT(onProfiles())); connect(playButton, SIGNAL(clicked()), SLOT(onPlayClicked())); connect(configureButton, SIGNAL(clicked()), SLOT(onConfigureClicked())); connect(actionAboutQt, SIGNAL(triggered()), SLOT(onAboutQt())); connect(actionAbout, SIGNAL(triggered()), SLOT(onAbout())); m_statusLabel = new QLabel(); statusBar()->addWidget(m_statusLabel); // setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } CMainWindow::~CMainWindow() { } void CMainWindow::processNextStep() { CConfigFile *config = CConfigFile::getInstance(); // default server const CServer &server = config->getServer(); // default profile const CProfile &configuration = config->getProfile(); switch(CConfigFile::getInstance()->getNextStep()) { case CConfigFile::DisplayNoServerError: break; case CConfigFile::ShowWizard: break; case CConfigFile::DownloadData: displayProgressBar(); m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part"); break; case CConfigFile::ExtractDownloadedData: displayProgressBar(); break; case CConfigFile::DownloadClient: displayProgressBar(); m_downloader->prepareFile(config->expandVariables(server.clientDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename) + ".part"); break; case CConfigFile::ExtractDownloadedClient: displayProgressBar(); break; case CConfigFile::CopyServerFiles: displayProgressBar(); m_archive->copyServerFiles(config->getSrcServerDirectory(), config->getInstallationDirectory() + "/" + server.id); break; case CConfigFile::CopyProfileFiles: displayProgressBar(); m_archive->copyProfileFiles(config->getSrcProfileDirectory(), config->getProfileDirectory() + "/0"); break; case CConfigFile::ExtractBnpClient: displayProgressBar(); m_archive->extract(config->getSrcServerClientBNPFullPath(), config->getInstallationDirectory() + "/" + server.id); break; case CConfigFile::CleanFiles: hideProgressBar(); m_archive->cleanServerFiles(config->getInstallationDirectory() + "/" + server.id); break; case CConfigFile::CreateProfile: displayProgressBar(); break; case CConfigFile::CreateShortcuts: displayProgressBar(); break; default: // cases already managed in main.cpp displayConfigurationsChoices(); break; } m_downloader->getHtmlPageContent(config->expandVariables(server.displayUrl)); } void CMainWindow::displayProgressBar() { downloadFrame->setVisible(true); configurationFrame->setVisible(false); resumeButton->setVisible(true); stopButton->setVisible(false); } void CMainWindow::displayConfigurationsChoices() { downloadFrame->setVisible(false); configurationFrame->setVisible(true); profilesComboBox->setModel(new CProfilesModel(this)); } void CMainWindow::showEvent(QShowEvent *e) { #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->setWindow(windowHandle()); #endif e->accept(); processNextStep(); } void CMainWindow::closeEvent(QCloseEvent *e) { hide(); e->accept(); } void CMainWindow::onResumeClicked() { m_downloader->getFile(); } void CMainWindow::onStopClicked() { if (m_downloader->isDownloading()) { if (!m_downloader->supportsResume()) { QMessageBox::StandardButton res = QMessageBox::question(this, tr("Confirmation"), tr("Warning, this server doesn't support resume! If you stop download now, you won't be able to resume it later.\nAre you sure to abort download?")); if (res != QMessageBox::Yes) return; } m_downloader->stop(); } else { m_archive->stop(); } } void CMainWindow::onPlayClicked() { int profileIndex = profilesComboBox->currentIndex(); if (profileIndex < 0) return; CProfile profile = CConfigFile::getInstance()->getProfile(profileIndex); if (profile.executable.isEmpty()) return; QStringList arguments; arguments << "-p"; arguments << QString::number(profileIndex); arguments << profile.arguments; bool started = QProcess::startDetached(profile.executable, arguments); } void CMainWindow::onConfigureClicked() { } void CMainWindow::onProfiles() { CProfilesDialog dialog; dialog.exec(); } void CMainWindow::onAbout() { QString br("
"); QMessageBox::about(this, tr("About %1").arg("Ryzom Installer"), QString("Ryzom Installer") + QApplication::applicationVersion() + br + tr("Program to install, download and manage Ryzom configurations.") + br+br+ tr("Author: %1").arg("Cedric 'Kervala' OCHS") + br + tr("Copyright: %1").arg(COPYRIGHT) + br + tr("Support: %1").arg("Ryzom Core on Bitbucket")); } void CMainWindow::onAboutQt() { QMessageBox::aboutQt(this); } void CMainWindow::onDownloadPrepare() { progressBar->setFormat(tr("%p% (%v/%m KiB)")); progressBar->setMinimum(0); progressBar->setMaximum(0); progressBar->setValue(0); resumeButton->setVisible(false); stopButton->setVisible(false); } void CMainWindow::onDownloadInit(qint64 current, qint64 total) { resumeButton->setVisible(true); stopButton->setVisible(false); progressBar->setMinimum(0); progressBar->setMaximum(total / 1024); progressBar->setValue(current / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->setMinimum(0); m_button->progress()->setMaximum(total / 1024); m_button->progress()->setValue(current / 1024); #endif } void CMainWindow::onDownloadStart() { resumeButton->setVisible(false); stopButton->setVisible(true); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->show(); #endif } void CMainWindow::onDownloadStop() { resumeButton->setVisible(true); stopButton->setVisible(false); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->hide(); #endif } void CMainWindow::onDownloadProgress(qint64 current) { progressBar->setValue(current / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->setValue(current / 1024); #endif } void CMainWindow::onDownloadSuccess(qint64 total) { progressBar->setValue(total / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->hide(); #endif resumeButton->setVisible(false); stopButton->setVisible(false); } void CMainWindow::onDownloadFail(const QString &error) { resumeButton->setVisible(true); stopButton->setVisible(false); } void CMainWindow::onHtmlPageContent(const QString &html) { htmlTextEdit->setHtml(html); } void CMainWindow::onExtractPrepare() { progressBar->setFormat("%p%"); progressBar->setMinimum(0); progressBar->setMaximum(0); progressBar->setValue(0); resumeButton->setVisible(false); stopButton->setVisible(false); } void CMainWindow::onExtractInit(qint64 current, qint64 total) { resumeButton->setVisible(true); stopButton->setVisible(false); progressBar->setMinimum(0); progressBar->setMaximum(total / 1024); progressBar->setValue(current / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->setMinimum(0); m_button->progress()->setMaximum(total / 1024); m_button->progress()->setValue(current / 1024); #endif } void CMainWindow::onExtractStart() { resumeButton->setVisible(false); stopButton->setVisible(true); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->show(); #endif } void CMainWindow::onExtractStop() { resumeButton->setVisible(true); stopButton->setVisible(false); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->hide(); #endif } void CMainWindow::onExtractProgress(qint64 current, const QString &filename) { m_statusLabel->setText(tr("Extracting %1...").arg(filename)); progressBar->setValue(current / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->setValue(current / 1024); #endif } void CMainWindow::onExtractSuccess(qint64 total) { m_statusLabel->setText(tr("Extraction done")); progressBar->setValue(total / 1024); #if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB) m_button->progress()->hide(); #endif resumeButton->setVisible(false); stopButton->setVisible(false); } processNextStep(); } void CMainWindow::onExtractFail(const QString &error) { resumeButton->setVisible(true); stopButton->setVisible(false); }