2013-11-22 17:01:13 +01:00
///////////////////////////////////////////////////////////////////////////////
// Simple x264 Launcher
2014-01-27 19:58:24 +01:00
// Copyright (C) 2004-2014 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
///////////////////////////////////////////////////////////////////////////////
# 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))
2013-12-16 22:58:21 +01:00
/*
ui - > labelLoadingLeft - > setVisible ( ( FLAG ) ) ; \
ui - > labelLoadingCenter - > setVisible ( ( FLAG ) ) ; \
ui - > labelLoadingRight - > setVisible ( ( FLAG ) ) ; \
*/
2013-11-23 15:20:07 +01:00
# 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-02-12 19:34:14 +01:00
UpdaterDialog : : UpdaterDialog ( QWidget * parent , const SysinfoModel * sysinfo )
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 ) ,
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 ) ;
QMessageBox : : critical ( this , tr ( " File Error " ) , tr ( " At least one file required by web-update is missing or corrupted.<br>Please re-install this application and then try again! " ) ) ;
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] " ) ;
static struct
{
const char * name ;
const char * hash ;
}
FILE_INFO [ ] =
{
{ " wget.exe " , " 7b522345239bcb95b5b0f7f50a883ba5957894a1feb769763e38ed789a8a0f63fead0155f54b9ffd0f1cdc5dfd855d207a6e7a8e4fd192589a8838ce646c504e " } ,
2014-02-02 15:57:08 +01:00
{ " gpgv.exe " , " b42b7ef5650cd78d92773f03d4eefc90d9ba6ffe6af19d389851e32b5ab1c58c91c3dfceb2cbe0d0d13774ee2cf100c20f0add7f33463229999da5aaa861f064 " } ,
2013-12-09 20:42:02 +01:00
{ " gpgv.gpg " , " 58e0f0e462bbd0b5aa4f638801c1097da7da4b3eb38c8c88ad1db23705c0f11e174b083fa55fe76bd3ba196341c967833a6f3427d6f63ad8565900745535d8fa " } ,
2014-02-02 15:57:08 +01:00
{ " wupd.exe " , " e8ee5fb11e4964c0091311a41b46e2ea49cf675755ee830c38a26027c81aecc78842c25facc0ac6b797586e4c4b22ac116dd1735b0b11b67c13e4a17fb1e5f5e " } ,
2013-12-09 20:42:02 +01:00
{ NULL , NULL }
} ;
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
2013-12-09 20:42:02 +01:00
for ( size_t i = 0 ; FILE_INFO [ i ] . name ; i + + )
{
2014-02-26 01:08:59 +01:00
const QString binPath = QString ( " %1/toolset/common/%2 " ) . arg ( m_sysinfo - > getAppPath ( ) , QString : : fromLatin1 ( FILE_INFO [ i ] . name ) ) ;
2013-12-09 22:19:32 +01:00
if ( okay = okay & & checkFileHash ( binPath , FILE_INFO [ i ] . hash ) )
{
2013-12-11 15:50:26 +01:00
binaries . insert ( FILE_INFO [ 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 ;
}
}