2013-11-22 17:01:13 +01:00
///////////////////////////////////////////////////////////////////////////////
// Simple x264 Launcher
2015-01-31 19:56:04 +01:00
// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
2013-11-22 17:01:13 +01:00
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
# include "win_updater.h"
# include "uic_win_updater.h"
# include "global.h"
2014-02-12 19:34:14 +01:00
# include "model_sysinfo.h"
2013-12-09 22:19:32 +01:00
# include "thread_updater.h"
2013-11-23 15:20:07 +01:00
# include "checksum.h"
# include <QMovie>
# include <QCloseEvent>
# include <QTimer>
2013-11-29 18:10:11 +01:00
# include <QMessageBox>
2013-12-11 15:50:26 +01:00
# include <QDesktopServices>
# include <QUrl>
# include <QProcess>
# include <QFileInfo>
# include <QDir>
# include <QMap>
2013-11-23 15:20:07 +01:00
///////////////////////////////////////////////////////////////////////////////
2014-04-21 16:39:54 +02:00
const UpdaterDialog : : binary_t UpdaterDialog : : BINARIES [ ] =
{
{ " wget.exe " , " 7b522345239bcb95b5b0f7f50a883ba5957894a1feb769763e38ed789a8a0f63fead0155f54b9ffd0f1cdc5dfd855d207a6e7a8e4fd192589a8838ce646c504e " , 1 } ,
2014-10-08 23:40:47 +02:00
{ " gpgv.exe " , " 97eebd656ad2799cbb69250ea9434b5afc8bcf578097703594277451f4e752166464a077ba71d5960824fa71e52f2a9e94c6368ae70a93d86a10720b3fced2fd " , 1 } ,
2014-04-21 16:39:54 +02:00
{ " gpgv.gpg " , " 58e0f0e462bbd0b5aa4f638801c1097da7da4b3eb38c8c88ad1db23705c0f11e174b083fa55fe76bd3ba196341c967833a6f3427d6f63ad8565900745535d8fa " , 0 } ,
2014-10-08 23:40:47 +02:00
{ " wupd.exe " , " 1156dd9aa47df35dfeb68cb9bea26cf5236c1bf4c29c22676b450e827aa8e4419858d2b9a2c9e94747ad43704a145724ec5b0280d16922e52c6c47e324739571 " , 1 } ,
2014-04-21 16:39:54 +02:00
{ NULL , NULL , 0 }
} ;
2013-11-23 15:20:07 +01:00
# define UPDATE_TEXT(N, TEXT) ui->label_phase##N->setText((TEXT))
# define UPDATE_ICON(N, ICON) ui->icon_phase##N->setPixmap(QIcon(": / buttons / " ICON ".png").pixmap(16, 16))
# define SHOW_ANIMATION(FLAG) do \
{ \
2013-12-16 22:58:21 +01:00
ui - > frameAnimation - > setVisible ( ( FLAG ) ) ; \
2013-11-23 15:20:07 +01:00
ui - > labelInfo - > setVisible ( ! ( FLAG ) ) ; \
ui - > labelUrl - > setVisible ( ! ( FLAG ) ) ; \
2013-12-16 22:58:21 +01:00
ui - > labelBuildNo - > setVisible ( ! ( FLAG ) ) ; \
2013-12-13 15:25:36 +01:00
if ( ( FLAG ) ) m_animator - > start ( ) ; else m_animator - > stop ( ) ; \
2013-11-23 15:20:07 +01:00
} \
while ( 0 )
2013-11-22 17:01:13 +01:00
///////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor
///////////////////////////////////////////////////////////////////////////////
2014-04-20 19:40:59 +02:00
UpdaterDialog : : UpdaterDialog ( QWidget * parent , const SysinfoModel * sysinfo , const char * const updateUrl )
2013-11-22 17:01:13 +01:00
:
QDialog ( parent ) ,
2013-11-23 15:20:07 +01:00
ui ( new Ui : : UpdaterDialog ( ) ) ,
2014-02-12 19:34:14 +01:00
m_sysinfo ( sysinfo ) ,
2014-04-20 19:40:59 +02:00
m_updateUrl ( updateUrl ) ,
2013-12-11 15:50:26 +01:00
m_status ( UpdateCheckThread : : UpdateStatus_NotStartedYet ) ,
2013-12-09 22:19:32 +01:00
m_thread ( NULL ) ,
2013-12-13 15:25:36 +01:00
m_updaterProcess ( NULL ) ,
2013-12-14 22:30:19 +01:00
m_success ( false ) ,
2013-11-23 15:20:07 +01:00
m_firstShow ( true )
2013-11-22 17:01:13 +01:00
{
//Init the dialog, from the .ui file
ui - > setupUi ( this ) ;
setWindowFlags ( windowFlags ( ) & ( ~ Qt : : WindowContextHelpButtonHint ) ) ;
//Fix size
2013-11-23 15:20:07 +01:00
setFixedSize ( size ( ) ) ;
2013-12-11 15:50:26 +01:00
//Enable buttons
connect ( ui - > buttonCancel , SIGNAL ( clicked ( ) ) , this , SLOT ( close ( ) ) ) ;
connect ( ui - > buttonDownload , SIGNAL ( clicked ( ) ) , this , SLOT ( installUpdate ( ) ) ) ;
connect ( ui - > buttonRetry , SIGNAL ( clicked ( ) ) , this , SLOT ( checkForUpdates ( ) ) ) ;
//Enable info label
connect ( ui - > labelUrl , SIGNAL ( linkActivated ( QString ) ) , this , SLOT ( openUrl ( QString ) ) ) ;
2013-11-23 15:20:07 +01:00
//Init animation
m_animator = new QMovie ( " :/images/loading.gif " ) ;
ui - > labelLoadingCenter - > setMovie ( m_animator ) ;
//Init buttons
ui - > buttonCancel - > setEnabled ( false ) ;
ui - > buttonRetry - > hide ( ) ;
ui - > buttonDownload - > hide ( ) ;
2013-12-16 22:58:21 +01:00
//Start animation
SHOW_ANIMATION ( true ) ;
2013-11-22 17:01:13 +01:00
}
UpdaterDialog : : ~ UpdaterDialog ( void )
{
2013-12-09 22:19:32 +01:00
if ( m_thread )
{
if ( ! m_thread - > wait ( 1000 ) )
{
m_thread - > terminate ( ) ;
m_thread - > wait ( ) ;
}
}
2013-12-11 15:50:26 +01:00
if ( ( ! m_keysFile . isEmpty ( ) ) & & QFile : : exists ( m_keysFile ) )
{
QFile : : setPermissions ( m_keysFile , QFile : : ReadOwner | QFile : : WriteOwner ) ;
QFile : : remove ( m_keysFile ) ;
m_keysFile . clear ( ) ;
}
2013-12-09 22:19:32 +01:00
X264_DELETE ( m_thread ) ;
2013-11-23 15:20:07 +01:00
X264_DELETE ( m_animator ) ;
2013-12-09 22:19:32 +01:00
2013-11-22 17:01:13 +01:00
delete ui ;
}
///////////////////////////////////////////////////////////////////////////////
// Public Functions
///////////////////////////////////////////////////////////////////////////////
2013-11-29 18:10:11 +01:00
/*None yet*/
2013-11-22 17:01:13 +01:00
///////////////////////////////////////////////////////////////////////////////
// Events
///////////////////////////////////////////////////////////////////////////////
2013-12-13 15:25:36 +01:00
bool UpdaterDialog : : event ( QEvent * e )
{
if ( ( e - > type ( ) = = QEvent : : ActivationChange ) & & ( m_updaterProcess ! = NULL ) )
{
x264_bring_process_to_front ( m_updaterProcess ) ;
}
return QDialog : : event ( e ) ;
}
2013-11-23 15:20:07 +01:00
void UpdaterDialog : : showEvent ( QShowEvent * event )
{
if ( m_firstShow )
{
m_firstShow = false ;
2013-12-14 22:30:19 +01:00
QTimer : : singleShot ( 16 , this , SLOT ( initUpdate ( ) ) ) ;
2013-11-23 15:20:07 +01:00
}
}
void UpdaterDialog : : closeEvent ( QCloseEvent * e )
{
if ( ! ui - > buttonCancel - > isEnabled ( ) )
{
e - > ignore ( ) ;
}
}
2013-11-22 17:01:13 +01:00
2013-12-11 15:50:26 +01:00
void UpdaterDialog : : keyPressEvent ( QKeyEvent * event )
{
if ( event - > key ( ) = = Qt : : Key_F11 )
{
QFile logFile ( QString ( " %1/%2.log " ) . arg ( x264_temp_directory ( ) , x264_rand_str ( ) ) ) ;
if ( logFile . open ( QIODevice : : WriteOnly | QIODevice : : Truncate ) )
{
logFile . write ( " \xEF \xBB \xBF " ) ;
for ( QStringList : : ConstIterator iter = m_logFile . constBegin ( ) ; iter ! = m_logFile . constEnd ( ) ; iter + + )
{
logFile . write ( iter - > toUtf8 ( ) ) ;
logFile . write ( " \r \n " ) ;
}
logFile . close ( ) ;
QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( logFile . fileName ( ) ) ) ;
}
}
}
2013-11-22 17:01:13 +01:00
///////////////////////////////////////////////////////////////////////////////
// Slots
///////////////////////////////////////////////////////////////////////////////
2013-11-23 15:20:07 +01:00
void UpdaterDialog : : initUpdate ( void )
{
2013-12-09 20:42:02 +01:00
//Check binary files
2013-12-11 15:50:26 +01:00
QString wgetBin , gpgvBin ;
if ( ! checkBinaries ( wgetBin , gpgvBin ) )
2013-12-09 20:42:02 +01:00
{
ui - > buttonCancel - > setEnabled ( true ) ;
2014-04-20 19:40:59 +02:00
const QString message = QString ( " %1<br><br><nobr><a href= \" %2 \" >%3</a></nobr><br> " ) . arg ( tr ( " At least one file required by the web-update tool is missing or corrupted.<br>Please re-install this application and then try again! " ) , QString : : fromLatin1 ( m_updateUrl ) , QString : : fromLatin1 ( m_updateUrl ) . replace ( " - " , " − " ) ) ;
if ( QMessageBox : : critical ( this , tr ( " File Error " ) , message , tr ( " Download Latest Version " ) , tr ( " Discard " ) ) = = 0 )
{
QDesktopServices : : openUrl ( QUrl ( QString : : fromLatin1 ( m_updateUrl ) ) ) ;
}
2013-12-16 22:58:21 +01:00
close ( ) ; return ;
}
//Make sure user does have admin access
if ( ! x264_user_is_admin ( ) )
{
qWarning ( " User is not in the \" admin \" group, cannot update! " ) ;
QString message ;
message + = QString ( " <nobr>%1</nobr><br> " ) . arg ( tr ( " Sorry, but only users in the \" Administrators \" group can install updates. " ) ) ;
message + = QString ( " <nobr>%1</nobr> " ) . arg ( tr ( " Please start application from an administrator account and try again! " ) ) ;
if ( QMessageBox : : critical ( this , this - > windowTitle ( ) , message , tr ( " Discard " ) , tr ( " Ignore " ) ) ! = 1 )
{
ui - > buttonCancel - > setEnabled ( true ) ;
close ( ) ; return ;
}
2013-12-09 20:42:02 +01:00
}
2013-12-09 22:19:32 +01:00
//Create and setup thread
if ( ! m_thread )
{
2013-12-11 15:50:26 +01:00
m_thread = new UpdateCheckThread ( wgetBin , gpgvBin , m_keysFile , false ) ;
2013-12-09 22:19:32 +01:00
connect ( m_thread , SIGNAL ( statusChanged ( int ) ) , this , SLOT ( threadStatusChanged ( int ) ) ) ;
connect ( m_thread , SIGNAL ( finished ( ) ) , this , SLOT ( threadFinished ( ) ) ) ;
connect ( m_thread , SIGNAL ( terminated ( ) ) , this , SLOT ( threadFinished ( ) ) ) ;
2013-12-11 15:50:26 +01:00
connect ( m_thread , SIGNAL ( messageLogged ( QString ) ) , this , SLOT ( threadMessageLogged ( QString ) ) ) ;
2013-12-09 22:19:32 +01:00
}
2013-12-09 20:42:02 +01:00
2013-12-11 15:50:26 +01:00
//Begin updater run
2013-12-14 22:30:19 +01:00
QTimer : : singleShot ( 16 , this , SLOT ( checkForUpdates ( ) ) ) ;
2013-12-09 22:19:32 +01:00
}
void UpdaterDialog : : checkForUpdates ( void )
{
if ( ( ! m_thread ) | | m_thread - > isRunning ( ) )
{
qWarning ( " Update in progress, cannot check for updates now! " ) ;
}
2013-12-11 15:50:26 +01:00
//Clear texts
ui - > retranslateUi ( this ) ;
2013-12-14 22:30:19 +01:00
ui - > labelBuildNo - > setText ( tr ( " Installed build is #%1 | Latest build is #%2 " ) . arg ( QString : : number ( x264_version_build ( ) ) , tr ( " N/A " ) ) ) ;
2013-12-11 15:50:26 +01:00
2013-12-09 22:19:32 +01:00
//Init buttons
ui - > buttonCancel - > setEnabled ( false ) ;
ui - > buttonRetry - > hide ( ) ;
ui - > buttonDownload - > hide ( ) ;
//Hide labels
ui - > labelInfo - > hide ( ) ;
ui - > labelUrl - > hide ( ) ;
2013-12-11 15:50:26 +01:00
2013-12-09 22:19:32 +01:00
//Update status
threadStatusChanged ( UpdateCheckThread : : UpdateStatus_NotStartedYet ) ;
2013-12-11 15:50:26 +01:00
//Start animation
SHOW_ANIMATION ( true ) ;
2013-12-09 22:19:32 +01:00
//Update cursor
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
QApplication : : setOverrideCursor ( Qt : : WaitCursor ) ;
2013-12-11 15:50:26 +01:00
//Clear log
m_logFile . clear ( ) ;
2013-12-09 22:19:32 +01:00
//Start the updater thread
2013-12-14 22:30:19 +01:00
QTimer : : singleShot ( 250 , m_thread , SLOT ( start ( ) ) ) ;
2013-11-23 15:20:07 +01:00
}
2013-12-09 22:19:32 +01:00
void UpdaterDialog : : threadStatusChanged ( int status )
2013-11-23 15:20:07 +01:00
{
2013-12-11 15:50:26 +01:00
switch ( m_status = status )
2013-11-23 15:20:07 +01:00
{
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_NotStartedYet :
UPDATE_ICON ( 1 , " clock " ) ;
UPDATE_ICON ( 2 , " clock " ) ;
UPDATE_ICON ( 3 , " clock " ) ;
break ;
case UpdateCheckThread : : UpdateStatus_CheckingConnection :
2013-11-23 15:20:07 +01:00
UPDATE_ICON ( 1 , " play " ) ;
break ;
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_FetchingUpdates :
2013-11-23 15:20:07 +01:00
UPDATE_ICON ( 1 , " shield_green " ) ;
UPDATE_TEXT ( 1 , tr ( " Internet connection is working. " ) ) ;
UPDATE_ICON ( 2 , " play " ) ;
break ;
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_ErrorNoConnection :
2013-12-11 15:50:26 +01:00
UPDATE_ICON ( 1 , " shield_error " ) ;
UPDATE_TEXT ( 1 , tr ( " Computer is currently offline! " ) ) ;
UPDATE_ICON ( 2 , " shield_grey " ) ;
UPDATE_ICON ( 3 , " shield_grey " ) ;
break ;
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_ErrorConnectionTestFailed :
2013-12-11 15:50:26 +01:00
UPDATE_ICON ( 1 , " shield_error " ) ;
UPDATE_TEXT ( 1 , tr ( " Internet connectivity test failed! " ) ) ;
UPDATE_ICON ( 2 , " shield_grey " ) ;
UPDATE_ICON ( 3 , " shield_grey " ) ;
break ;
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_ErrorFetchUpdateInfo :
2013-12-11 15:50:26 +01:00
UPDATE_ICON ( 2 , " shield_error " ) ;
UPDATE_TEXT ( 2 , tr ( " Failed to download the update information! " ) ) ;
UPDATE_ICON ( 3 , " shield_grey " ) ;
break ;
case UpdateCheckThread : : UpdateStatus_CompletedUpdateAvailable :
case UpdateCheckThread : : UpdateStatus_CompletedNoUpdates :
case UpdateCheckThread : : UpdateStatus_CompletedNewVersionOlder :
UPDATE_ICON ( 2 , " shield_green " ) ;
UPDATE_TEXT ( 2 , tr ( " Update information received successfully. " ) ) ;
UPDATE_ICON ( 3 , " play " ) ;
2013-12-09 22:19:32 +01:00
break ;
default :
2014-04-16 14:57:32 +02:00
THROW ( " Unknown status code! " ) ;
2013-12-09 22:19:32 +01:00
}
2013-12-11 15:50:26 +01:00
}
void UpdaterDialog : : threadFinished ( void )
2013-12-14 22:30:19 +01:00
{
m_success = m_thread - > getSuccess ( ) ;
QTimer : : singleShot ( ( m_success ? 1000 : 0 ) , this , SLOT ( updateFinished ( ) ) ) ;
}
void UpdaterDialog : : updateFinished ( void )
2013-12-11 15:50:26 +01:00
{
//Restore cursor
QApplication : : restoreOverrideCursor ( ) ;
2013-12-13 15:25:36 +01:00
//If update was successfull, process final updater state
if ( m_thread - > getSuccess ( ) )
2013-12-09 22:19:32 +01:00
{
2013-12-13 15:25:36 +01:00
switch ( m_status )
{
case UpdateCheckThread : : UpdateStatus_CompletedUpdateAvailable :
UPDATE_ICON ( 3 , " shield_exclamation " ) ;
UPDATE_TEXT ( 3 , tr ( " A newer version is available! " ) ) ;
ui - > buttonDownload - > show ( ) ;
break ;
case UpdateCheckThread : : UpdateStatus_CompletedNoUpdates :
UPDATE_ICON ( 3 , " shield_green " ) ;
UPDATE_TEXT ( 3 , tr ( " Your version is up-to-date. " ) ) ;
break ;
case UpdateCheckThread : : UpdateStatus_CompletedNewVersionOlder :
2013-12-14 22:30:19 +01:00
UPDATE_ICON ( 3 , " shield_blue " ) ;
2013-12-14 14:20:43 +01:00
UPDATE_TEXT ( 3 , tr ( " You are using a pre-release version! " ) ) ;
2013-12-13 15:25:36 +01:00
break ;
default :
qWarning ( " Update thread succeeded with unexpected status code: %d " , m_status ) ;
}
2013-12-11 15:50:26 +01:00
}
//Show update info or retry button
switch ( m_status )
{
case UpdateCheckThread : : UpdateStatus_CompletedUpdateAvailable :
case UpdateCheckThread : : UpdateStatus_CompletedNoUpdates :
case UpdateCheckThread : : UpdateStatus_CompletedNewVersionOlder :
SHOW_ANIMATION ( false ) ;
2013-12-14 22:30:19 +01:00
ui - > labelBuildNo - > setText ( tr ( " Installed build is #%1 | Latest build is #%2 " ) . arg ( QString : : number ( x264_version_build ( ) ) , QString : : number ( m_thread - > getUpdateInfo ( ) - > m_buildNo ) ) ) ;
2013-12-11 15:50:26 +01:00
ui - > labelUrl - > setText ( QString ( " <a href= \" %1 \" >%1</a> " ) . arg ( m_thread - > getUpdateInfo ( ) - > m_downloadSite ) ) ;
break ;
2013-12-09 22:19:32 +01:00
case UpdateCheckThread : : UpdateStatus_ErrorNoConnection :
case UpdateCheckThread : : UpdateStatus_ErrorConnectionTestFailed :
case UpdateCheckThread : : UpdateStatus_ErrorFetchUpdateInfo :
2013-12-13 15:25:36 +01:00
m_animator - > stop ( ) ;
2013-12-11 15:50:26 +01:00
ui - > buttonRetry - > show ( ) ;
2013-11-23 15:20:07 +01:00
break ;
2013-12-13 15:25:36 +01:00
default :
qWarning ( " Update thread finished with unexpected status code: %d " , m_status ) ;
2013-11-23 15:20:07 +01:00
}
2013-12-11 15:50:26 +01:00
//Re-enbale cancel button
ui - > buttonCancel - > setEnabled ( true ) ;
}
void UpdaterDialog : : threadMessageLogged ( const QString & message )
{
m_logFile < < message ;
}
void UpdaterDialog : : openUrl ( const QString & url )
{
qDebug ( " Open URL: %s " , url . toLatin1 ( ) . constData ( ) ) ;
QDesktopServices : : openUrl ( QUrl ( url ) ) ;
}
void UpdaterDialog : : installUpdate ( void )
{
if ( ! ( ( m_thread ) & & m_thread - > getSuccess ( ) ) )
{
qWarning ( " Cannot download/install update at this point! " ) ;
return ;
}
2013-12-13 15:25:36 +01:00
QApplication : : setOverrideCursor ( Qt : : WaitCursor ) ;
ui - > buttonDownload - > hide ( ) ;
ui - > buttonCancel - > setEnabled ( false ) ;
SHOW_ANIMATION ( true ) ;
2013-12-11 15:50:26 +01:00
const UpdateInfo * updateInfo = m_thread - > getUpdateInfo ( ) ;
QProcess process ;
QStringList args ;
QEventLoop loop ;
x264_init_process ( process , x264_temp_directory ( ) , false ) ;
connect ( & process , SIGNAL ( error ( QProcess : : ProcessError ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) , & loop , SLOT ( quit ( ) ) ) ;
args < < QString ( " /Location=%1 " ) . arg ( updateInfo - > m_downloadAddress ) ;
args < < QString ( " /Filename=%1 " ) . arg ( updateInfo - > m_downloadFilename ) ;
args < < QString ( " /TicketID=%1 " ) . arg ( updateInfo - > m_downloadFilecode ) ;
args < < QString ( " /ToFolder=%1 " ) . arg ( QDir : : toNativeSeparators ( QDir ( QApplication : : applicationDirPath ( ) ) . canonicalPath ( ) ) ) ;
args < < QString ( " /ToExFile=%1.exe " ) . arg ( QFileInfo ( QFileInfo ( QApplication : : applicationFilePath ( ) ) . canonicalFilePath ( ) ) . completeBaseName ( ) ) ;
args < < QString ( " /AppTitle=Simple x264 Launcher (Build #%1) " ) . arg ( QString : : number ( updateInfo - > m_buildNo ) ) ;
process . start ( m_wupdFile , args ) ;
if ( ! process . waitForStarted ( ) )
{
2013-12-13 15:25:36 +01:00
QApplication : : restoreOverrideCursor ( ) ;
SHOW_ANIMATION ( false ) ;
2013-12-11 15:50:26 +01:00
QMessageBox : : critical ( this , tr ( " Update Failed " ) , tr ( " Sorry, failed to launch web-update program! " ) ) ;
2013-12-13 15:25:36 +01:00
ui - > buttonDownload - > show ( ) ;
ui - > buttonCancel - > setEnabled ( true ) ;
2013-12-11 15:50:26 +01:00
return ;
}
2013-12-13 15:25:36 +01:00
m_updaterProcess = x264_process_id ( process ) ;
2013-12-11 15:50:26 +01:00
loop . exec ( QEventLoop : : ExcludeUserInputEvents ) ;
if ( ! process . waitForFinished ( ) )
{
process . kill ( ) ;
process . waitForFinished ( ) ;
}
2013-12-13 15:25:36 +01:00
m_updaterProcess = NULL ;
2013-12-11 15:50:26 +01:00
QApplication : : restoreOverrideCursor ( ) ;
ui - > buttonDownload - > show ( ) ;
ui - > buttonCancel - > setEnabled ( true ) ;
2013-12-13 15:25:36 +01:00
SHOW_ANIMATION ( false ) ;
2013-12-11 15:50:26 +01:00
if ( process . exitCode ( ) = = 0 )
{
2013-12-14 22:30:19 +01:00
done ( READY_TO_INSTALL_UPDATE ) ;
2013-12-11 15:50:26 +01:00
}
2013-11-23 15:20:07 +01:00
}
2013-12-09 20:42:02 +01:00
///////////////////////////////////////////////////////////////////////////////
// Private Functions
///////////////////////////////////////////////////////////////////////////////
2013-12-11 15:50:26 +01:00
bool UpdaterDialog : : checkBinaries ( QString & wgetBin , QString & gpgvBin )
2013-12-09 20:42:02 +01:00
{
qDebug ( " [File Verification] " ) ;
2013-12-11 15:50:26 +01:00
QMap < QString , QString > binaries ;
m_keysFile . clear ( ) ;
m_wupdFile . clear ( ) ;
wgetBin . clear ( ) ;
gpgvBin . clear ( ) ;
2013-12-09 20:42:02 +01:00
bool okay = true ;
2013-12-09 22:19:32 +01:00
2014-04-21 16:39:54 +02:00
for ( size_t i = 0 ; BINARIES [ i ] . name ; i + + )
2013-12-09 20:42:02 +01:00
{
2014-04-21 16:39:54 +02:00
const QString binPath = QString ( " %1/toolset/common/%2 " ) . arg ( m_sysinfo - > getAppPath ( ) , QString : : fromLatin1 ( BINARIES [ i ] . name ) ) ;
if ( okay = okay & & checkFileHash ( binPath , BINARIES [ i ] . hash ) )
2013-12-09 22:19:32 +01:00
{
2014-04-21 16:39:54 +02:00
binaries . insert ( BINARIES [ i ] . name , binPath ) ;
2013-12-09 22:19:32 +01:00
}
2013-12-16 22:58:21 +01:00
QApplication : : processEvents ( QEventLoop : : ExcludeUserInputEvents ) ;
2013-12-09 20:42:02 +01:00
}
if ( okay )
{
2013-12-11 15:50:26 +01:00
wgetBin = binaries . value ( " wget.exe " ) ;
gpgvBin = binaries . value ( " gpgv.exe " ) ;
m_wupdFile = binaries . value ( " wupd.exe " ) ;
m_keysFile = QString ( " %1/%2.gpg " ) . arg ( x264_temp_directory ( ) , x264_rand_str ( ) ) ;
if ( okay = QFile : : copy ( binaries . value ( " gpgv.gpg " ) , m_keysFile ) )
{
QFile : : setPermissions ( m_keysFile , QFile : : ReadOwner ) ;
}
qDebug ( " %s \n " , okay ? " Completed. " : " Failed to copy GPG file! " ) ;
2013-12-09 20:42:02 +01:00
}
return okay ;
}
bool UpdaterDialog : : checkFileHash ( const QString & filePath , const char * expectedHash )
{
qDebug ( " Checking file: %s " , filePath . toUtf8 ( ) . constData ( ) ) ;
QBlake2Checksum checksum2 ;
QFile file ( filePath ) ;
if ( file . open ( QIODevice : : ReadOnly ) )
{
checksum2 . update ( file ) ;
const QByteArray fileHash = checksum2 . finalize ( ) ;
if ( ( strlen ( expectedHash ) ! = fileHash . size ( ) ) | | ( memcmp ( fileHash . constData ( ) , expectedHash , fileHash . size ( ) ) ! = 0 ) )
{
qWarning ( " \n File appears to be corrupted: \n %s \n " , filePath . toUtf8 ( ) . constData ( ) ) ;
qWarning ( " Expected Hash: %s \n Detected Hash: %s \n " , expectedHash , fileHash . constData ( ) ) ;
return false ;
}
return true ;
}
else
{
qWarning ( " Failed to open file: \n %s \n " , filePath . toUtf8 ( ) . constData ( ) ) ;
return false ;
}
}