2016-05-16 09:11:40 +00:00
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// 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 <http://www.gnu.org/licenses/>.
# include "stdpch.h"
# include "operationdialog.h"
# include "downloader.h"
# include "profilesdialog.h"
# include "configfile.h"
# include "config.h"
# include "profilesmodel.h"
# include "filescopier.h"
# include "filesextractor.h"
# include "filescleaner.h"
# include "seven_zip.h"
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
# include <QtWinExtras/QWinTaskbarProgress>
# include <QtWinExtras/QWinTaskbarButton>
# endif
2016-05-25 21:26:40 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2016-05-16 09:11:40 +00:00
# ifdef DEBUG_NEW
# define new DEBUG_NEW
# endif
2016-05-29 18:30:53 +00:00
COperationDialog : : COperationDialog ( QWidget * parent ) : QDialog ( parent ) , m_aborting ( false ) , m_operation ( OperationNone )
2016-05-16 09:11:40 +00:00
{
setupUi ( this ) ;
2016-05-16 12:50:15 +00:00
setWindowFlags ( windowFlags ( ) & ~ Qt : : WindowContextHelpButtonHint ) ;
2016-05-16 09:11:40 +00:00
# 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
2016-06-12 12:11:58 +00:00
m_downloader = new CDownloader ( this , this ) ;
2016-05-16 09:11:40 +00:00
connect ( operationButtonBox , SIGNAL ( clicked ( QAbstractButton * ) ) , SLOT ( onAbortClicked ( ) ) ) ;
// operations
connect ( this , SIGNAL ( prepare ( ) ) , SLOT ( onProgressPrepare ( ) ) ) ;
connect ( this , SIGNAL ( init ( qint64 , qint64 ) ) , SLOT ( onProgressInit ( qint64 , qint64 ) ) ) ;
connect ( this , SIGNAL ( start ( ) ) , SLOT ( onProgressStart ( ) ) ) ;
connect ( this , SIGNAL ( stop ( ) ) , SLOT ( onProgressStop ( ) ) ) ;
connect ( this , SIGNAL ( progress ( qint64 , QString ) ) , SLOT ( onProgressProgress ( qint64 , QString ) ) ) ;
connect ( this , SIGNAL ( success ( qint64 ) ) , SLOT ( onProgressSuccess ( qint64 ) ) ) ;
connect ( this , SIGNAL ( fail ( QString ) ) , SLOT ( onProgressFail ( QString ) ) ) ;
2016-05-16 12:52:47 +00:00
connect ( this , SIGNAL ( done ( ) ) , SLOT ( onDone ( ) ) ) ;
2016-05-16 09:11:40 +00:00
setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Fixed ) ;
}
COperationDialog : : ~ COperationDialog ( )
{
}
2016-06-14 17:39:39 +00:00
void COperationDialog : : setOperation ( OperationType operation )
2016-05-29 18:34:43 +00:00
{
m_operation = operation ;
}
2016-06-04 17:57:50 +00:00
void COperationDialog : : setUninstallComponents ( const SUninstallComponents & components )
{
m_components = components ;
}
2016-05-16 09:11:40 +00:00
void COperationDialog : : processNextStep ( )
2016-05-29 18:34:43 +00:00
{
switch ( m_operation )
{
case OperationMigrate :
2016-06-14 17:53:44 +00:00
case OperationInstall :
processInstallNextStep ( ) ;
2016-05-29 18:34:43 +00:00
break ;
2016-06-12 11:54:47 +00:00
case OperationUpdateProfiles :
2016-06-12 12:12:07 +00:00
processUpdateProfilesNextStep ( ) ;
2016-06-12 11:54:47 +00:00
break ;
2016-05-29 18:34:43 +00:00
case OperationUninstall :
processUninstallNextStep ( ) ;
break ;
default :
break ;
}
}
2016-06-14 17:53:44 +00:00
void COperationDialog : : processInstallNextStep ( )
2016-05-16 09:11:40 +00:00
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
const CServer & server = config - > getServer ( ) ;
// default profile
const CProfile & configuration = config - > getProfile ( ) ;
2016-05-16 12:54:24 +00:00
// long operations are done in a thread
2016-06-14 17:53:44 +00:00
OperationStep step = config - > getInstallNextStep ( ) ;
2016-05-16 12:54:24 +00:00
switch ( step )
2016-05-16 09:11:40 +00:00
{
2016-06-14 17:39:39 +00:00
case DownloadData :
2016-05-16 12:49:18 +00:00
downloadData ( ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case ExtractDownloadedData :
QtConcurrent : : run ( this , & COperationDialog : : extractDownloadedData ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case DownloadClient :
2016-05-16 12:49:18 +00:00
downloadClient ( ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case ExtractDownloadedClient :
QtConcurrent : : run ( this , & COperationDialog : : extractDownloadedClient ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case CopyDataFiles :
QtConcurrent : : run ( this , & COperationDialog : : copyDataFiles ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case CopyProfileFiles :
2016-05-16 09:11:40 +00:00
QtConcurrent : : run ( this , & COperationDialog : : copyProfileFiles ) ;
break ;
2016-06-14 17:39:39 +00:00
case CleanFiles :
2016-05-29 18:34:43 +00:00
QtConcurrent : : run ( this , & COperationDialog : : cleanFiles ) ;
break ;
2016-06-14 17:39:39 +00:00
case ExtractBnpClient :
2016-05-16 09:11:40 +00:00
QtConcurrent : : run ( this , & COperationDialog : : extractBnpClient ) ;
break ;
2016-06-14 17:39:39 +00:00
case CopyInstaller :
2016-05-29 18:34:43 +00:00
QtConcurrent : : run ( this , & COperationDialog : : copyInstaller ) ;
2016-05-26 17:30:18 +00:00
break ;
2016-06-14 17:39:39 +00:00
case UninstallOldClient :
2016-05-29 18:34:43 +00:00
uninstallOldClient ( ) ;
2016-05-16 09:11:40 +00:00
break ;
2016-06-14 17:39:39 +00:00
case CreateProfile :
2016-05-16 09:11:40 +00:00
createDefaultProfile ( ) ;
break ;
2016-06-14 17:39:39 +00:00
case CreateShortcuts :
2016-05-16 09:11:40 +00:00
createDefaultShortcuts ( ) ;
break ;
2016-06-14 17:39:39 +00:00
case CreateAddRemoveEntry :
2016-05-26 17:34:15 +00:00
createAddRemoveEntry ( ) ;
break ;
2016-06-14 17:39:39 +00:00
case Done :
2016-05-16 12:53:19 +00:00
accept ( ) ;
break ;
2016-05-16 09:11:40 +00:00
default :
// cases already managed in main.cpp
2016-06-14 17:39:39 +00:00
qDebug ( ) < < " Shouldn't happen, step " < < step ;
2016-05-16 09:11:40 +00:00
break ;
}
}
2016-06-12 11:54:47 +00:00
void COperationDialog : : processUpdateProfilesNextStep ( )
{
2016-06-12 13:10:37 +00:00
// TODO: check all servers are downloaded
// TODO: delete profiles directories that are not used anymore
// TODO: create shortcuts
2016-06-12 11:54:47 +00:00
}
2016-06-14 17:51:28 +00:00
QStringList serversToUpdate ;
QStringList profilesToDelete ;
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// append all old profiles
foreach ( const CProfile & profile , config - > getBackupProfiles ( ) )
{
if ( QFile : : exists ( profile . getDirectory ( ) ) ) profilesToDelete < < profile . id ;
}
const CServer & defaultServer = config - > getServer ( ) ;
foreach ( const CProfile & profile , config - > getProfiles ( ) )
{
const CServer & server = config - > getServer ( profile . server ) ;
QString serverDirectory = server . getDirectory ( ) ;
// check if Ryzom is installed in new server directory
if ( server . id ! = defaultServer . id & & ! config - > isRyzomInstalledIn ( serverDirectory ) & & serversToUpdate . indexOf ( server . id ) = = - 1 )
{
serversToUpdate < < server . id ;
}
// remove profiles that still exist
profilesToDelete . removeAll ( profile . id ) ;
}
if ( ! profilesToDelete . isEmpty ( ) )
{
m_components . profiles < < profilesToDelete ;
// delete profiles in another thread
QtConcurrent : : run ( this , & COperationDialog : : deleteComponentsProfiles ) ;
return ;
}
// servers files to download/update
foreach ( const QString & serverId , serversToUpdate )
{
const CServer & server = config - > getServer ( serverId ) ;
// data
if ( ! config - > areRyzomDataInstalledIn ( server . getDirectory ( ) ) )
{
QString dataFile = config - > getInstallationDirectory ( ) + " / " + server . dataDownloadFilename ;
// archive already downloaded
if ( QFile : : exists ( dataFile ) )
{
// make server current
m_currentServerId = server . id ;
// uncompress it
QtConcurrent : : run ( this , & COperationDialog : : extractDownloadedData ) ;
return ;
}
// data download URLs are different, can't copy data from default server
if ( server . dataDownloadUrl ! = defaultServer . dataDownloadUrl )
{
// download it
// TODO
return ;
}
// same data used
// copy them
// TODO
return ;
}
// client
if ( ! config - > isRyzomClientInstalledIn ( server . getDirectory ( ) ) )
{
// client download URLs are different, can't copy client from default server
if ( server . clientDownloadUrl = = defaultServer . clientDownloadUrl )
{
if ( QFile : : exists ( " " ) )
downloadData ( ) ;
return ;
}
}
else
{
QString clientFile = config - > getInstallationDirectory ( ) + " / " + server . clientDownloadFilename ;
}
}
2016-05-29 18:34:43 +00:00
}
void COperationDialog : : processUninstallNextStep ( )
{
2016-06-04 17:57:50 +00:00
CConfigFile * config = CConfigFile : : getInstance ( ) ;
if ( ! m_components . servers . isEmpty ( ) )
{
QtConcurrent : : run ( this , & COperationDialog : : deleteComponentsServers ) ;
}
else if ( ! m_components . profiles . isEmpty ( ) )
{
QtConcurrent : : run ( this , & COperationDialog : : deleteComponentsProfiles ) ;
}
else if ( m_components . installer )
{
QtConcurrent : : run ( this , & COperationDialog : : deleteComponentsInstaller ) ;
}
else
{
// done
accept ( ) ;
}
2016-05-29 18:34:43 +00:00
}
2016-05-16 09:11:40 +00:00
void COperationDialog : : showEvent ( QShowEvent * e )
{
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button - > setWindow ( windowHandle ( ) ) ;
# endif
e - > accept ( ) ;
processNextStep ( ) ;
}
void COperationDialog : : closeEvent ( QCloseEvent * e )
{
if ( e - > spontaneous ( ) )
{
e - > ignore ( ) ;
onAbortClicked ( ) ;
}
}
void COperationDialog : : onAbortClicked ( )
{
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. \n Are you sure to abort download? " ) ) ;
if ( res ! = QMessageBox : : Yes ) return ;
}
}
QMutexLocker locker ( & m_abortingMutex ) ;
m_aborting = true ;
}
void COperationDialog : : onProgressPrepare ( )
{
operationProgressBar - > setFormat ( tr ( " %p% (%v/%m KiB) " ) ) ;
operationProgressBar - > setMinimum ( 0 ) ;
operationProgressBar - > setMaximum ( 0 ) ;
operationProgressBar - > setValue ( 0 ) ;
operationLabel - > setText ( m_currentOperation ) ;
}
void COperationDialog : : onProgressInit ( qint64 current , qint64 total )
{
operationProgressBar - > setMinimum ( 0 ) ;
operationProgressBar - > setMaximum ( total / 1024 ) ;
operationProgressBar - > 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 COperationDialog : : onProgressStart ( )
{
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button - > progress ( ) - > show ( ) ;
# endif
}
void COperationDialog : : onProgressStop ( )
{
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button - > progress ( ) - > hide ( ) ;
# endif
2016-05-16 12:53:19 +00:00
reject ( ) ;
2016-05-16 09:11:40 +00:00
}
void COperationDialog : : onProgressProgress ( qint64 current , const QString & filename )
{
operationProgressLabel - > setText ( m_currentOperationProgressFormat . arg ( filename ) ) ;
operationProgressBar - > setValue ( current / 1024 ) ;
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button - > progress ( ) - > setValue ( current / 1024 ) ;
# endif
}
void COperationDialog : : onProgressSuccess ( qint64 total )
{
operationProgressBar - > setValue ( total / 1024 ) ;
# if defined(Q_OS_WIN32) && defined(QT_WINEXTRAS_LIB)
m_button - > progress ( ) - > hide ( ) ;
# endif
}
void COperationDialog : : onProgressFail ( const QString & error )
{
QMessageBox : : critical ( this , tr ( " Error " ) , error ) ;
}
void COperationDialog : : onDone ( )
{
2016-05-16 12:49:18 +00:00
if ( ! operationShouldStop ( ) ) processNextStep ( ) ;
}
void COperationDialog : : downloadData ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
2016-06-14 17:54:51 +00:00
const CServer & server = config - > getServer ( m_currentServerId ) ;
2016-05-16 12:49:18 +00:00
2016-05-16 14:21:47 +00:00
m_currentOperation = QApplication : : tr ( " Download data required by server %1 " ) . arg ( server . name ) ;
2016-05-16 12:49:18 +00:00
m_currentOperationProgressFormat = QApplication : : tr ( " Downloading %1... " ) ;
m_downloader - > prepareFile ( config - > expandVariables ( server . dataDownloadUrl ) , config - > getInstallationDirectory ( ) + " / " + config - > expandVariables ( server . dataDownloadFilename ) + " .part " ) ;
}
2016-06-14 17:39:39 +00:00
void COperationDialog : : extractDownloadedData ( )
{
// TODO: implement
}
2016-05-16 12:49:18 +00:00
void COperationDialog : : downloadClient ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
2016-06-14 17:54:51 +00:00
const CServer & server = config - > getServer ( m_currentServerId ) ;
2016-05-16 12:49:18 +00:00
2016-05-16 14:21:47 +00:00
m_currentOperation = QApplication : : tr ( " Download client required by server %1 " ) . arg ( server . name ) ;
2016-05-16 12:49:18 +00:00
m_currentOperationProgressFormat = QApplication : : tr ( " Downloading %1... " ) ;
m_downloader - > prepareFile ( config - > expandVariables ( server . clientDownloadUrl ) , config - > getInstallationDirectory ( ) + " / " + config - > expandVariables ( server . clientDownloadFilename ) + " .part " ) ;
2016-05-16 09:11:40 +00:00
}
2016-06-14 17:50:19 +00:00
void COperationDialog : : extractDownloadedClient ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
const CServer & server = config - > getServer ( m_currentServerId ) ;
m_currentOperation = QApplication : : tr ( " Extract data files required by server %1 " ) . arg ( server . name ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Extracting %1... " ) ;
CFilesExtractor extractor ( this ) ;
extractor . setSourceFile ( config - > getInstallationDirectory ( ) + " / " + server . clientDownloadFilename ) ;
extractor . setDestinationDirectory ( server . getDirectory ( ) ) ;
if ( extractor . exec ( ) )
{
}
else
{
}
emit done ( ) ;
}
void COperationDialog : : copyDataFiles ( )
2016-05-16 09:11:40 +00:00
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
2016-06-14 17:54:51 +00:00
const CServer & server = config - > getServer ( m_currentServerId ) ;
2016-05-16 09:11:40 +00:00
2016-06-14 17:52:48 +00:00
m_currentOperation = QApplication : : tr ( " Copy data files required by server %1 " ) . arg ( server . name ) ;
2016-05-16 12:50:53 +00:00
m_currentOperationProgressFormat = QApplication : : tr ( " Copying %1... " ) ;
2016-05-16 09:11:40 +00:00
QStringList serverFiles ;
serverFiles < < " cfg " ;
serverFiles < < " data " ;
serverFiles < < " examples " ;
serverFiles < < " patch " ;
serverFiles < < " unpack " ;
CFilesCopier copier ( this ) ;
copier . setSourceDirectory ( config - > getSrcServerDirectory ( ) ) ;
2016-06-14 17:45:29 +00:00
copier . setDestinationDirectory ( server . getDirectory ( ) ) ;
2016-05-16 09:11:40 +00:00
copier . setIncludeFilter ( serverFiles ) ;
if ( copier . exec ( ) )
{
}
else
{
}
2016-05-16 12:52:47 +00:00
emit done ( ) ;
2016-05-16 09:11:40 +00:00
}
void COperationDialog : : copyProfileFiles ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
const CServer & server = config - > getServer ( ) ;
// default profile
const CProfile & profile = config - > getProfile ( ) ;
2016-05-16 12:50:53 +00:00
m_currentOperation = QApplication : : tr ( " Copy old profile to new location " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Copying %1... " ) ;
2016-05-16 09:11:40 +00:00
QStringList profileFiles ;
profileFiles < < " cache " ;
profileFiles < < " save " ;
profileFiles < < " user " ;
profileFiles < < " screenshots " ;
profileFiles < < " client.cfg " ;
profileFiles < < " *.log " ;
CFilesCopier copier ( this ) ;
copier . setSourceDirectory ( config - > getSrcProfileDirectory ( ) ) ;
2016-06-14 17:45:29 +00:00
copier . setDestinationDirectory ( profile . getDirectory ( ) ) ;
2016-05-16 09:11:40 +00:00
copier . setIncludeFilter ( profileFiles ) ;
if ( copier . exec ( ) )
{
}
else
{
}
2016-05-16 12:52:47 +00:00
emit done ( ) ;
2016-05-16 09:11:40 +00:00
}
void COperationDialog : : extractBnpClient ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
const CServer & server = config - > getServer ( ) ;
2016-05-16 12:50:53 +00:00
m_currentOperation = QApplication : : tr ( " Extract client to new location " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Extracting %1... " ) ;
2016-06-14 17:45:29 +00:00
QString destinationDirectory = server . getDirectory ( ) ;
2016-05-16 09:11:40 +00:00
CFilesExtractor extractor ( this ) ;
extractor . setSourceFile ( config - > getSrcServerClientBNPFullPath ( ) ) ;
2016-06-14 17:36:26 +00:00
extractor . setDestinationDirectory ( destinationDirectory ) ;
2016-05-16 09:11:40 +00:00
extractor . exec ( ) ;
2016-05-16 12:52:16 +00:00
QString upgradeScript = destinationDirectory + " /upgd_nl. " ;
# ifdef Q_OS_WIN
upgradeScript + = " bat " ;
# else
upgradeScript + = " sh " ;
# endif
if ( QFile : : exists ( upgradeScript ) )
{
QProcess process ;
QProcessEnvironment env = QProcessEnvironment : : systemEnvironment ( ) ;
2016-05-17 18:47:38 +00:00
env . insert ( " RYZOM_CLIENT " , QDir : : toNativeSeparators ( destinationDirectory + " / " + server . clientFilename ) ) ;
2016-05-16 12:52:16 +00:00
env . insert ( " UNPACKPATH " , QDir : : toNativeSeparators ( destinationDirectory + " /unpack " ) ) ;
env . insert ( " ROOTPATH " , QDir : : toNativeSeparators ( destinationDirectory ) ) ;
env . insert ( " STARTUPPATH " , " " ) ;
process . setProcessEnvironment ( env ) ;
2016-06-12 12:19:39 +00:00
// permissions to execute script
QFileDevice : : Permissions permissions ;
permissions | = QFileDevice : : ExeOther ;
permissions | = QFileDevice : : ExeOwner ;
permissions | = QFileDevice : : ExeUser ;
permissions | = QFileDevice : : ReadOther ;
permissions | = QFileDevice : : ReadOwner ;
permissions | = QFileDevice : : ReadUser ;
permissions | = QFileDevice : : WriteOwner ;
if ( ! QFile : : setPermissions ( upgradeScript , permissions ) )
{
qDebug ( ) < < " Unable to set executable flag to " < < upgradeScript ;
}
2016-05-16 12:52:16 +00:00
process . start ( upgradeScript ) ;
while ( process . waitForFinished ( ) )
{
qDebug ( ) < < " waiting " ;
}
}
emit done ( ) ;
2016-05-16 09:11:40 +00:00
}
2016-05-29 18:34:43 +00:00
void COperationDialog : : copyInstaller ( )
2016-05-26 17:30:18 +00:00
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
const CServer & server = config - > getServer ( ) ;
m_currentOperation = QApplication : : tr ( " Copy installer to new location " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Copying %1... " ) ;
QString destinationDirectory = config - > getInstallationDirectory ( ) ;
// rename old client to installer
QString newInstallerFilename = server . installerFilename ;
if ( ! newInstallerFilename . isEmpty ( ) )
{
QString oldInstallerFullPath = QApplication : : applicationFilePath ( ) ;
QString newInstallerFullPath = config - > getInstallationDirectory ( ) + " / " + newInstallerFilename ;
if ( ! QFile : : exists ( newInstallerFullPath ) )
{
QStringList filter ;
filter < < " msvcp100.dll " ;
filter < < " msvcr100.dll " ;
CFilesCopier copier ( this ) ;
copier . setIncludeFilter ( filter ) ;
copier . addFile ( oldInstallerFullPath ) ;
copier . setSourceDirectory ( config - > getSrcServerDirectory ( ) ) ;
copier . setDestinationDirectory ( config - > getInstallationDirectory ( ) ) ;
copier . exec ( ) ;
// copied file
oldInstallerFullPath = config - > getInstallationDirectory ( ) + " / " + QFileInfo ( oldInstallerFullPath ) . fileName ( ) ;
// rename old filename if different
if ( oldInstallerFullPath ! = newInstallerFullPath )
{
QFile : : rename ( oldInstallerFullPath , newInstallerFullPath ) ;
}
}
}
emit done ( ) ;
}
2016-05-29 18:32:33 +00:00
void COperationDialog : : uninstallOldClient ( )
{
# ifdef Q_OS_WIN
# ifdef Q_OS_WIN64
// use WOW6432Node in 64 bits (64 bits OS and 64 bits Installer) because Ryzom old installer was in 32 bits
QSettings settings ( " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ WOW6432Node \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\ Ryzom " , QSettings : : NativeFormat ) ;
# else
QSettings settings ( " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\ Ryzom " , QSettings : : NativeFormat ) ;
# endif
// check if Ryzom 2.1.0 is installed
if ( settings . contains ( " UninstallString " ) )
{
QString uninstaller = settings . value ( " UninstallString " ) . toString ( ) ;
if ( ! uninstaller . isEmpty ( ) & & QFile : : exists ( uninstaller ) )
{
QMessageBox : : StandardButtons button = QMessageBox : : question ( this , tr ( " Uninstall old client " ) , tr ( " An old version of Ryzom has been detected on this system, would you like to uninstall it to save space disk? " ) ) ;
if ( button = = QMessageBox : : Yes )
{
CConfigFile : : getInstance ( ) - > setShouldUninstallOldClient ( true ) ;
QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( uninstaller ) ) ;
}
else
{
// don't ask this question anymore
CConfigFile : : getInstance ( ) - > setShouldUninstallOldClient ( false ) ;
}
}
}
# endif
emit done ( ) ;
}
2016-05-16 09:11:40 +00:00
void COperationDialog : : cleanFiles ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// default server
const CServer & server = config - > getServer ( ) ;
2016-05-16 12:50:53 +00:00
m_currentOperation = QApplication : : tr ( " Clean obsolete files " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Deleting %1... " ) ;
2016-05-16 09:11:40 +00:00
CFilesCleaner cleaner ( this ) ;
2016-06-14 17:45:29 +00:00
cleaner . setDirectory ( server . getDirectory ( ) ) ;
2016-05-16 09:11:40 +00:00
cleaner . exec ( ) ;
2016-05-16 12:49:50 +00:00
emit done ( ) ;
}
bool COperationDialog : : createDefaultProfile ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
CServer server = config - > getServer ( config - > getDefaultServerIndex ( ) ) ;
m_currentOperation = QApplication : : tr ( " Create default profile " ) ;
CProfile profile ;
profile . id = " 0 " ;
profile . name = QString ( " Ryzom (%1) " ) . arg ( server . name ) ;
profile . server = server . id ;
profile . comments = " Default profile created by Ryzom Installer " ;
# ifdef Q_OS_WIN32
// C:\Users\Public\Desktop
profile . desktopShortcut = QFile : : exists ( QStandardPaths : : writableLocation ( QStandardPaths : : DesktopLocation ) + " /Ryzom.lnk " ) ;
# endif
// TODO
// profile.menuShortcut
config - > addProfile ( profile ) ;
config - > save ( ) ;
emit done ( ) ;
return true ;
}
bool COperationDialog : : createDefaultShortcuts ( )
{
emit done ( ) ;
return true ;
2016-05-16 09:11:40 +00:00
}
2016-05-25 21:26:40 +00:00
bool COperationDialog : : createAddRemoveEntry ( )
{
CConfigFile * config = CConfigFile : : getInstance ( ) ;
const CServer & server = config - > getServer ( ) ;
QString oldInstallerFilename = server . clientFilenameOld ;
QString newInstallerFilename = server . installerFilename ;
if ( ! oldInstallerFilename . isEmpty ( ) & & ! newInstallerFilename . isEmpty ( ) )
{
QString oldInstallerFullPath = config - > getSrcServerDirectory ( ) + " / " + oldInstallerFilename ;
QString newInstallerFullPath = config - > getInstallationDirectory ( ) + " / " + newInstallerFilename ;
if ( QFile : : exists ( newInstallerFullPath ) )
{
2016-05-26 17:34:15 +00:00
# ifdef Q_OS_WIN
2016-05-25 21:26:40 +00:00
QSettings settings ( " HKEY_CURRENT_USER \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\ Ryzom " , QSettings : : NativeFormat ) ;
QStringList versionTokens = QString ( RYZOM_VERSION ) . split ( ' . ' ) ;
2016-05-27 20:20:41 +00:00
QString nativeFullPath = QDir : : toNativeSeparators ( newInstallerFullPath ) ;
2016-05-25 21:26:40 +00:00
settings . setValue ( " Comments " , " " ) ;
2016-05-27 20:20:41 +00:00
settings . setValue ( " DisplayIcon " , nativeFullPath + " ,0 " ) ;
2016-05-25 21:26:40 +00:00
settings . setValue ( " DisplayName " , " Ryzom " ) ;
settings . setValue ( " DisplayVersion " , RYZOM_VERSION ) ;
settings . setValue ( " EstimatedSize " , 1500000 ) ; // TODO: compute real size
settings . setValue ( " InstallDate " , QDateTime : : currentDateTime ( ) . toString ( " Ymd " ) ) ;
settings . setValue ( " InstallLocation " , config - > getInstallationDirectory ( ) ) ;
settings . setValue ( " MajorVersion " , versionTokens [ 0 ] . toInt ( ) ) ;
settings . setValue ( " MinorVersion " , versionTokens [ 1 ] . toInt ( ) ) ;
settings . setValue ( " NoModify " , 0 ) ;
settings . setValue ( " NoRemove " , 0 ) ;
settings . setValue ( " NoRepair " , 0 ) ;
2016-05-27 20:20:41 +00:00
if ( ! config - > getProductPublisher ( ) . isEmpty ( ) ) settings . setValue ( " Publisher " , config - > getProductPublisher ( ) ) ;
settings . setValue ( " QuietUninstallString " , nativeFullPath + " -u -s " ) ;
settings . setValue ( " UninstallString " , nativeFullPath + " -u " ) ;
if ( ! config - > getProductUpdateUrl ( ) . isEmpty ( ) ) settings . setValue ( " URLUpdateInfo " , config - > getProductUpdateUrl ( ) ) ;
if ( ! config - > getProductAboutUrl ( ) . isEmpty ( ) ) settings . setValue ( " URLInfoAbout " , config - > getProductAboutUrl ( ) ) ;
if ( ! config - > getProductHelpUrl ( ) . isEmpty ( ) ) settings . setValue ( " HelpLink " , config - > getProductHelpUrl ( ) ) ;
2016-05-25 21:26:40 +00:00
// ModifyPath
2016-05-26 17:34:15 +00:00
# endif
2016-05-25 21:26:40 +00:00
}
}
2016-05-26 17:34:15 +00:00
emit done ( ) ;
2016-05-25 21:26:40 +00:00
return true ;
}
2016-06-07 11:24:26 +00:00
bool COperationDialog : : deleteAddRemoveEntry ( )
{
# ifdef Q_OS_WIN
QSettings settings ( " HKEY_CURRENT_USER \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall \\ Ryzom " , QSettings : : NativeFormat ) ;
settings . remove ( " " ) ;
# endif
emit done ( ) ;
return true ;
}
2016-06-04 17:57:50 +00:00
void COperationDialog : : deleteComponentsServers ( )
{
m_currentOperation = QApplication : : tr ( " Delete client files " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Deleting %1... " ) ;
2016-06-07 11:24:26 +00:00
emit prepare ( ) ;
emit init ( 0 , m_components . servers . size ( ) ) ;
emit start ( ) ;
2016-06-04 17:57:50 +00:00
CConfigFile * config = CConfigFile : : getInstance ( ) ;
2016-06-07 11:24:26 +00:00
int i = 0 ;
2016-06-14 17:43:45 +00:00
foreach ( const QString & serverId , m_components . servers )
2016-06-04 17:57:50 +00:00
{
2016-06-07 11:24:26 +00:00
if ( operationShouldStop ( ) )
{
emit stop ( ) ;
return ;
}
2016-06-14 17:43:45 +00:00
const CServer & server = config - > getServer ( serverId ) ;
2016-06-04 17:57:50 +00:00
2016-06-07 11:24:26 +00:00
emit progress ( i + + , server . name ) ;
2016-06-14 17:45:29 +00:00
QString path = server . getDirectory ( ) ;
2016-06-04 17:57:50 +00:00
2016-06-14 17:49:03 +00:00
if ( ! path . isEmpty ( ) )
2016-06-04 17:57:50 +00:00
{
2016-06-14 17:49:03 +00:00
QDir dir ( path ) ;
if ( dir . exists ( ) & & ! dir . removeRecursively ( ) )
{
emit fail ( tr ( " Unable to delete files for client %1 " ) . arg ( server . name ) ) ;
return ;
}
2016-06-04 17:57:50 +00:00
}
}
2016-06-07 11:24:26 +00:00
emit success ( m_components . servers . size ( ) ) ;
2016-06-04 17:57:50 +00:00
emit done ( ) ;
}
void COperationDialog : : deleteComponentsProfiles ( )
{
2016-06-07 11:24:26 +00:00
m_currentOperation = QApplication : : tr ( " Delete profiles " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Deleting profile %1... " ) ;
emit prepare ( ) ;
emit init ( 0 , m_components . servers . size ( ) ) ;
CConfigFile * config = CConfigFile : : getInstance ( ) ;
int i = 0 ;
2016-06-14 17:43:45 +00:00
foreach ( const QString & profileId , m_components . profiles )
2016-06-07 11:24:26 +00:00
{
if ( operationShouldStop ( ) )
{
emit stop ( ) ;
return ;
}
2016-06-14 17:43:45 +00:00
const CProfile & profile = config - > getProfile ( profileId ) ;
2016-06-07 11:24:26 +00:00
emit progress ( i + + , profile . name ) ;
2016-06-14 17:45:29 +00:00
QString path = profile . getDirectory ( ) ;
2016-06-07 11:24:26 +00:00
2016-06-14 17:49:03 +00:00
if ( ! path . isEmpty ( ) )
2016-06-07 11:24:26 +00:00
{
2016-06-14 17:49:03 +00:00
QDir dir ( path ) ;
if ( dir . exists ( ) & & ! dir . removeRecursively ( ) )
{
emit fail ( tr ( " Unable to delete files for profile %1 " ) . arg ( profile . name ) ) ;
return ;
}
2016-06-07 11:24:26 +00:00
}
2016-06-14 17:46:18 +00:00
// delete profile
config - > removeProfile ( profileId ) ;
2016-06-07 11:24:26 +00:00
}
2016-06-14 17:55:41 +00:00
// clear list of all profiles to uninstall
m_components . profiles . clear ( ) ;
2016-06-07 11:24:26 +00:00
emit success ( m_components . servers . size ( ) ) ;
2016-06-04 17:57:50 +00:00
emit done ( ) ;
}
void COperationDialog : : deleteComponentsInstaller ( )
{
2016-06-07 11:24:26 +00:00
m_currentOperation = QApplication : : tr ( " Delete installer " ) ;
m_currentOperationProgressFormat = QApplication : : tr ( " Deleting %1... " ) ;
CConfigFile * config = CConfigFile : : getInstance ( ) ;
// TODO: delete installer
deleteAddRemoveEntry ( ) ;
emit onProgressSuccess ( m_components . servers . size ( ) ) ;
2016-06-04 17:57:50 +00:00
emit done ( ) ;
}
2016-05-16 09:11:40 +00:00
void COperationDialog : : operationPrepare ( )
{
emit prepare ( ) ;
}
void COperationDialog : : operationInit ( qint64 current , qint64 total )
{
emit init ( current , total ) ;
}
void COperationDialog : : operationStart ( )
{
emit start ( ) ;
}
void COperationDialog : : operationStop ( )
{
emit stop ( ) ;
}
void COperationDialog : : operationProgress ( qint64 current , const QString & filename )
{
emit progress ( current , filename ) ;
}
void COperationDialog : : operationSuccess ( qint64 total )
{
emit success ( total ) ;
}
void COperationDialog : : operationFail ( const QString & error )
{
emit fail ( error ) ;
}
bool COperationDialog : : operationShouldStop ( )
{
QMutexLocker locker ( & m_abortingMutex ) ;
return m_aborting ;
}