2010-11-27 19:41:58 +01:00
///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
2011-01-01 17:04:25 +01:00
// Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
2010-11-27 19:41:58 +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 "Dialog_Update.h"
2010-11-28 22:18:07 +01:00
# include "Global.h"
# include "Resource.h"
2010-11-29 20:36:27 +01:00
# include "Dialog_LogView.h"
# include "Model_Settings.h"
2011-02-25 13:40:45 +01:00
# include "WinSevenTaskbar.h"
2010-11-28 22:18:07 +01:00
2010-11-27 19:41:58 +01:00
# include <QClipboard>
# include <QFileDialog>
# include <QTimer>
2010-11-28 22:18:07 +01:00
# include <QProcess>
# include <QDate>
# include <QRegExp>
# include <QDesktopServices>
# include <QUrl>
# include <QCloseEvent>
2011-03-24 15:37:49 +01:00
# include <QMovie>
2010-11-27 19:41:58 +01:00
2011-03-24 15:37:49 +01:00
# include <time.h>
2011-04-11 21:55:34 +02:00
# include <MMSystem.h>
2010-11-27 19:41:58 +01:00
2010-11-28 22:18:07 +01:00
///////////////////////////////////////////////////////////////////////////////
2011-03-25 15:18:13 +01:00
static const char * header_id = " !Update " ;
2010-11-28 22:18:07 +01:00
static const char * section_id = " LameXP " ;
2011-02-12 22:17:42 +01:00
static const char * mirror_url_postfix [ ] =
{
" update.ver " ,
" update_beta.ver " ,
NULL
} ;
2010-11-28 22:18:07 +01:00
2010-12-06 18:29:34 +01:00
static const char * update_mirrors [ ] =
2010-11-28 22:18:07 +01:00
{
" http://mulder.dummwiedeutsch.de/ " ,
" http://mulder.brhack.net/ " ,
2011-02-02 21:40:18 +01:00
" http://lamexp.sourceforge.net/ " ,
2010-11-28 22:18:07 +01:00
" http://free.pages.at/borschdfresser/ " ,
" http://mplayer.savedonthe.net/ " ,
" http://www.tricksoft.de/ " ,
2011-03-24 15:37:49 +01:00
" http://mplayer.somestuff.org/ " ,
2010-11-28 22:18:07 +01:00
NULL
} ;
2010-12-06 18:29:34 +01:00
static const char * known_hosts [ ] =
{
2011-03-28 04:23:57 +02:00
" http://www.amazon.com/ " ,
" http://www.aol.com/ " ,
" http://www.ask.com/ " ,
" http://www.ebay.com/ " ,
2010-12-06 18:29:34 +01:00
" http://www.example.com/ " ,
2011-03-28 04:23:57 +02:00
" http://www.gitorious.org/ " ,
2010-12-06 18:29:34 +01:00
" http://www.google.com/ " ,
" http://www.msn.com/ " ,
2011-02-02 21:40:18 +01:00
" http://sourceforge.net/ " ,
2011-03-28 04:23:57 +02:00
" http://www.wikipedia.org/ " ,
" http://www.yahoo.com/ " ,
2011-03-24 15:37:49 +01:00
" http://www.youtube.com/ " ,
2010-12-06 18:29:34 +01:00
NULL
} ;
2011-03-24 15:37:49 +01:00
static const int MIN_CONNSCORE = 3 ;
2011-03-25 15:18:13 +01:00
static const int VERSION_INFO_EXPIRES_MONTHS = 6 ;
2010-12-06 18:29:34 +01:00
static char * USER_AGENT_STR = " Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101101 IceCat/3.6.12 (like Firefox/3.6.12) " ;
2010-11-28 22:18:07 +01:00
///////////////////////////////////////////////////////////////////////////////
class UpdateInfo
{
public :
2011-02-12 22:17:42 +01:00
UpdateInfo ( void ) { resetInfo ( ) ; }
void resetInfo ( void )
2010-11-28 22:18:07 +01:00
{
2011-02-12 22:17:42 +01:00
m_buildNo = 0 ;
m_buildDate . setDate ( 1900 , 1 , 1 ) ;
m_downloadSite . clear ( ) ;
m_downloadAddress . clear ( ) ;
m_downloadFilename . clear ( ) ;
m_downloadFilecode . clear ( ) ;
2010-11-28 22:18:07 +01:00
}
2011-02-12 22:17:42 +01:00
2010-11-28 22:18:07 +01:00
unsigned int m_buildNo ;
QDate m_buildDate ;
QString m_downloadSite ;
QString m_downloadAddress ;
QString m_downloadFilename ;
QString m_downloadFilecode ;
} ;
///////////////////////////////////////////////////////////////////////////////
2010-11-29 20:36:27 +01:00
UpdateDialog : : UpdateDialog ( SettingsModel * settings , QWidget * parent )
2010-11-27 19:41:58 +01:00
:
2010-11-28 22:18:07 +01:00
QDialog ( parent ) ,
m_binaryWGet ( lamexp_lookup_tool ( " wget.exe " ) ) ,
m_binaryGnuPG ( lamexp_lookup_tool ( " gpgv.exe " ) ) ,
m_binaryUpdater ( lamexp_lookup_tool ( " wupdate.exe " ) ) ,
m_binaryKeys ( lamexp_lookup_tool ( " gpgv.gpg " ) ) ,
2010-11-29 20:36:27 +01:00
m_updateInfo ( NULL ) ,
m_settings ( settings ) ,
m_logFile ( new QStringList ( ) ) ,
2011-05-03 14:28:06 +02:00
m_betaUpdates ( settings ? ( settings - > autoUpdateCheckBeta ( ) | | lamexp_version_demo ( ) ) : lamexp_version_demo ( ) ) ,
2011-02-18 00:53:36 +01:00
m_success ( false ) ,
m_updateReadyToInstall ( false )
2010-11-27 19:41:58 +01:00
{
2010-11-28 22:18:07 +01:00
if ( m_binaryWGet . isEmpty ( ) | | m_binaryGnuPG . isEmpty ( ) | | m_binaryUpdater . isEmpty ( ) | | m_binaryKeys . isEmpty ( ) )
{
throw " Tools not initialized correctly! " ;
}
2010-11-27 19:41:58 +01:00
//Init the dialog, from the .ui file
setupUi ( this ) ;
setWindowFlags ( windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ) ;
//Disable "X" button
HMENU hMenu = GetSystemMenu ( ( HWND ) winId ( ) , FALSE ) ;
EnableMenuItem ( hMenu , SC_CLOSE , MF_BYCOMMAND | MF_GRAYED ) ;
2011-03-24 15:37:49 +01:00
//Init animation
m_animator = new QMovie ( " :/images/Loading3.gif " ) ;
labelAnimationCenter - > setMovie ( m_animator ) ;
m_animator - > start ( ) ;
2010-11-28 22:18:07 +01:00
//Enable button
connect ( retryButton , SIGNAL ( clicked ( ) ) , this , SLOT ( checkForUpdates ( ) ) ) ;
connect ( installButton , SIGNAL ( clicked ( ) ) , this , SLOT ( applyUpdate ( ) ) ) ;
connect ( infoLabel , SIGNAL ( linkActivated ( QString ) ) , this , SLOT ( linkActivated ( QString ) ) ) ;
2010-11-29 20:36:27 +01:00
connect ( logButton , SIGNAL ( clicked ( ) ) , this , SLOT ( logButtonClicked ( ) ) ) ;
2011-02-25 13:40:45 +01:00
//Enable progress bar
connect ( progressBar , SIGNAL ( valueChanged ( int ) ) , this , SLOT ( progressBarValueChanged ( int ) ) ) ;
2010-11-27 19:41:58 +01:00
}
UpdateDialog : : ~ UpdateDialog ( void )
{
2011-03-24 15:37:49 +01:00
if ( m_animator ) m_animator - > stop ( ) ;
2010-11-28 22:18:07 +01:00
LAMEXP_DELETE ( m_updateInfo ) ;
2010-11-29 20:36:27 +01:00
LAMEXP_DELETE ( m_logFile ) ;
2011-03-24 15:37:49 +01:00
LAMEXP_DELETE ( m_animator ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarNoState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , NULL ) ;
2010-11-27 19:41:58 +01:00
}
void UpdateDialog : : showEvent ( QShowEvent * event )
{
2010-11-28 22:18:07 +01:00
QDialog : : showEvent ( event ) ;
2011-01-01 19:28:19 +01:00
labelVersionInstalled - > setText ( QString ( " %1 %2 (%3) " ) . arg ( tr ( " Build " ) , QString : : number ( lamexp_version_build ( ) ) , lamexp_version_date ( ) . toString ( Qt : : ISODate ) ) ) ;
labelVersionLatest - > setText ( QString ( " (%1) " ) . arg ( tr ( " Unknown " ) ) ) ;
2010-11-28 22:18:07 +01:00
QTimer : : singleShot ( 0 , this , SLOT ( updateInit ( ) ) ) ;
2010-11-27 19:41:58 +01:00
installButton - > setEnabled ( false ) ;
closeButton - > setEnabled ( false ) ;
2010-11-28 22:18:07 +01:00
retryButton - > setEnabled ( false ) ;
2010-11-29 20:36:27 +01:00
logButton - > setEnabled ( false ) ;
2010-11-28 22:18:07 +01:00
retryButton - > hide ( ) ;
2010-11-29 20:36:27 +01:00
logButton - > hide ( ) ;
2010-11-28 22:18:07 +01:00
infoLabel - > hide ( ) ;
2010-12-08 20:52:18 +01:00
hintLabel - > hide ( ) ;
hintIcon - > hide ( ) ;
2011-03-24 15:37:49 +01:00
frameAnimation - > hide ( ) ;
2010-11-28 22:18:07 +01:00
2010-12-06 18:29:34 +01:00
int counter = 2 ;
for ( int i = 0 ; known_hosts [ i ] ; i + + ) counter + + ;
for ( int i = 0 ; update_mirrors [ i ] ; i + + ) counter + + ;
2010-11-28 22:18:07 +01:00
2010-12-06 18:29:34 +01:00
progressBar - > setMaximum ( counter ) ;
2010-11-28 22:18:07 +01:00
progressBar - > setValue ( 0 ) ;
}
void UpdateDialog : : closeEvent ( QCloseEvent * event )
{
2011-02-25 13:40:45 +01:00
if ( ! closeButton - > isEnabled ( ) )
{
event - > ignore ( ) ;
}
else
{
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarNoState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , NULL ) ;
}
2010-11-27 19:41:58 +01:00
}
2010-12-08 20:52:18 +01:00
void UpdateDialog : : keyPressEvent ( QKeyEvent * e )
{
if ( e - > key ( ) = = Qt : : Key_F11 )
{
if ( closeButton - > isEnabled ( ) ) logButtonClicked ( ) ;
}
else
{
QDialog : : keyPressEvent ( e ) ;
}
}
2010-11-28 22:18:07 +01:00
void UpdateDialog : : updateInit ( void )
2010-11-27 19:41:58 +01:00
{
2010-11-28 22:18:07 +01:00
setMinimumSize ( size ( ) ) ;
setMaximumHeight ( height ( ) ) ;
checkForUpdates ( ) ;
}
void UpdateDialog : : checkForUpdates ( void )
{
bool success = false ;
2010-12-06 18:29:34 +01:00
int connectionScore = 0 ;
2010-11-28 22:18:07 +01:00
m_updateInfo = new UpdateInfo ;
progressBar - > setValue ( 0 ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarNormalState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/transmit_blue.png " ) ) ;
2010-11-28 22:18:07 +01:00
installButton - > setEnabled ( false ) ;
closeButton - > setEnabled ( false ) ;
retryButton - > setEnabled ( false ) ;
2010-11-29 20:36:27 +01:00
logButton - > setEnabled ( false ) ;
2010-11-28 22:18:07 +01:00
if ( infoLabel - > isVisible ( ) ) infoLabel - > hide ( ) ;
2010-12-08 20:52:18 +01:00
if ( hintLabel - > isVisible ( ) ) hintLabel - > hide ( ) ;
if ( hintIcon - > isVisible ( ) ) hintIcon - > hide ( ) ;
2011-03-24 15:37:49 +01:00
frameAnimation - > show ( ) ;
2010-11-28 22:18:07 +01:00
QApplication : : processEvents ( ) ;
QApplication : : setOverrideCursor ( Qt : : WaitCursor ) ;
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " Testing your internet connection, please wait... " ) ) ;
2010-12-06 18:29:34 +01:00
2010-11-29 20:36:27 +01:00
m_logFile - > clear ( ) ;
2010-12-06 18:29:34 +01:00
m_logFile - > append ( " Checking internet connection... " ) ;
2011-03-24 15:37:49 +01:00
QStringList hostList ;
2010-12-06 18:29:34 +01:00
for ( int i = 0 ; known_hosts [ i ] ; i + + )
2011-03-24 15:37:49 +01:00
{
hostList < < QString : : fromLatin1 ( known_hosts [ i ] ) ;
}
qsrand ( time ( NULL ) ) ;
while ( ! hostList . isEmpty ( ) )
2010-12-06 18:29:34 +01:00
{
progressBar - > setValue ( progressBar - > value ( ) + 1 ) ;
2011-03-24 15:37:49 +01:00
QString currentHost = hostList . takeAt ( qrand ( ) % hostList . count ( ) ) ;
2010-12-06 18:29:34 +01:00
if ( connectionScore < MIN_CONNSCORE )
{
2011-03-24 15:37:49 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Testing host: " < < currentHost < < " " ) ;
2011-02-25 22:03:39 +01:00
QString outFile = QString ( " %1/%2.htm " ) . arg ( lamexp_temp_folder2 ( ) , lamexp_rand_str ( ) ) ;
2011-03-24 15:37:49 +01:00
if ( getFile ( currentHost , outFile ) )
2010-12-06 18:29:34 +01:00
{
connectionScore + + ;
}
QFile : : remove ( outFile ) ;
}
}
if ( connectionScore < MIN_CONNSCORE )
{
if ( ! retryButton - > isVisible ( ) ) retryButton - > show ( ) ;
if ( ! logButton - > isVisible ( ) ) logButton - > show ( ) ;
closeButton - > setEnabled ( true ) ;
retryButton - > setEnabled ( true ) ;
logButton - > setEnabled ( true ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2011-01-12 22:08:09 +01:00
statusLabel - > setText ( tr ( " Network connectivity test has failed! " ) ) ;
2010-12-06 18:29:34 +01:00
progressBar - > setValue ( progressBar - > maximum ( ) ) ;
2011-03-28 04:23:57 +02:00
hintIcon - > setPixmap ( QIcon ( " :/icons/network_error.png " ) . pixmap ( 16 , 16 ) ) ;
2011-01-01 19:28:19 +01:00
hintLabel - > setText ( tr ( " Please make sure your internet connection is working properly and try again. " ) ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > show ( ) ;
hintLabel - > show ( ) ;
2010-12-06 18:29:34 +01:00
LAMEXP_DELETE ( m_updateInfo ) ;
if ( m_settings - > soundsEnabled ( ) ) PlaySound ( MAKEINTRESOURCE ( IDR_WAVE_ERROR ) , GetModuleHandle ( NULL ) , SND_RESOURCE | SND_ASYNC ) ;
QApplication : : restoreOverrideCursor ( ) ;
progressBar - > setValue ( progressBar - > maximum ( ) ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarErrorState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/exclamation.png " ) ) ;
2010-12-06 18:29:34 +01:00
return ;
}
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " Checking for new updates online, please wait... " ) ) ;
2010-11-29 20:36:27 +01:00
m_logFile - > append ( " Checking for updates online... " ) ;
2011-03-24 15:37:49 +01:00
QStringList mirrorList ;
2010-12-06 18:29:34 +01:00
for ( int i = 0 ; update_mirrors [ i ] ; i + + )
2010-11-28 22:18:07 +01:00
{
2011-03-24 15:37:49 +01:00
mirrorList < < QString : : fromLatin1 ( update_mirrors [ i ] ) ;
}
qsrand ( time ( NULL ) ) ;
for ( int i = 0 ; i < 16 ; i + + )
{
mirrorList . swap ( i % 4 , qrand ( ) % 4 ) ;
}
while ( ! mirrorList . isEmpty ( ) )
{
QString currentMirror = mirrorList . takeFirst ( ) ;
2010-12-06 18:29:34 +01:00
progressBar - > setValue ( progressBar - > value ( ) + 1 ) ;
if ( ! success )
2010-11-28 22:18:07 +01:00
{
2011-03-24 15:37:49 +01:00
if ( tryUpdateMirror ( m_updateInfo , currentMirror ) )
2010-12-06 18:29:34 +01:00
{
success = true ;
}
2010-11-28 22:18:07 +01:00
}
}
QApplication : : restoreOverrideCursor ( ) ;
2010-12-06 18:29:34 +01:00
progressBar - > setValue ( progressBar - > maximum ( ) ) ;
2011-02-25 13:40:45 +01:00
2010-11-28 22:18:07 +01:00
if ( ! success )
{
if ( ! retryButton - > isVisible ( ) ) retryButton - > show ( ) ;
2010-11-29 20:36:27 +01:00
if ( ! logButton - > isVisible ( ) ) logButton - > show ( ) ;
2010-11-28 22:18:07 +01:00
closeButton - > setEnabled ( true ) ;
retryButton - > setEnabled ( true ) ;
2010-11-29 20:36:27 +01:00
logButton - > setEnabled ( true ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " Failed to fetch update information from server! " ) ) ;
2010-11-28 22:18:07 +01:00
progressBar - > setValue ( progressBar - > maximum ( ) ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarErrorState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/exclamation.png " ) ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > setPixmap ( QIcon ( " :/icons/server_error.png " ) . pixmap ( 16 , 16 ) ) ;
2011-01-01 19:28:19 +01:00
hintLabel - > setText ( tr ( " Sorry, the update server might be busy at this time. Plase try again later. " ) ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > show ( ) ;
hintLabel - > show ( ) ;
2010-11-28 22:18:07 +01:00
LAMEXP_DELETE ( m_updateInfo ) ;
2010-11-29 20:36:27 +01:00
if ( m_settings - > soundsEnabled ( ) ) PlaySound ( MAKEINTRESOURCE ( IDR_WAVE_ERROR ) , GetModuleHandle ( NULL ) , SND_RESOURCE | SND_ASYNC ) ;
2010-11-28 22:18:07 +01:00
return ;
}
2010-11-29 20:36:27 +01:00
2011-01-01 19:28:19 +01:00
labelVersionLatest - > setText ( QString ( " %1 %2 (%3) " ) . arg ( tr ( " Build " ) , QString : : number ( m_updateInfo - > m_buildNo ) , m_updateInfo - > m_buildDate . toString ( Qt : : ISODate ) ) ) ;
2010-11-28 22:18:07 +01:00
infoLabel - > show ( ) ;
2011-01-01 19:28:19 +01:00
infoLabel - > setText ( QString ( " %1<br><a href= \" %2 \" >%2</a> " ) . arg ( tr ( " More information available at: " ) , m_updateInfo - > m_downloadSite ) ) ;
2010-11-28 22:18:07 +01:00
QApplication : : processEvents ( ) ;
if ( m_updateInfo - > m_buildNo > lamexp_version_build ( ) )
{
installButton - > setEnabled ( true ) ;
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " A new version of LameXP is available! " ) ) ;
2011-03-24 01:01:14 +01:00
hintIcon - > setPixmap ( QIcon ( " :/icons/shield_exclamation.png " ) . pixmap ( 16 , 16 ) ) ;
2011-01-01 19:28:19 +01:00
hintLabel - > setText ( tr ( " We highly recommend all users to install this update as soon as possible. " ) ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > show ( ) ;
hintLabel - > show ( ) ;
2011-03-24 01:01:14 +01:00
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/shield_exclamation.png " ) ) ;
2010-11-28 22:18:07 +01:00
MessageBeep ( MB_ICONINFORMATION ) ;
}
else if ( m_updateInfo - > m_buildNo = = lamexp_version_build ( ) )
{
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " No new updates available at this time. " ) ) ;
2011-03-24 01:01:14 +01:00
hintIcon - > setPixmap ( QIcon ( " :/icons/shield_green.png " ) . pixmap ( 16 , 16 ) ) ;
2011-01-01 19:28:19 +01:00
hintLabel - > setText ( tr ( " Your version of LameXP is still up-to-date. Please check for updates regularly! " ) ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > show ( ) ;
hintLabel - > show ( ) ;
2011-03-24 01:01:14 +01:00
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/shield_green.png " ) ) ;
2010-11-28 22:18:07 +01:00
MessageBeep ( MB_ICONINFORMATION ) ;
}
else
{
2011-01-01 19:28:19 +01:00
statusLabel - > setText ( tr ( " Your version appears to be newer than the latest release. " ) ) ;
2011-03-28 04:23:57 +02:00
hintIcon - > setPixmap ( QIcon ( " :/icons/shield_error.png " ) . pixmap ( 16 , 16 ) ) ;
2011-01-01 19:28:19 +01:00
hintLabel - > setText ( tr ( " This usually indicates your are currently using a pre-release version of LameXP. " ) ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2010-12-08 20:52:18 +01:00
hintIcon - > show ( ) ;
hintLabel - > show ( ) ;
2011-03-28 04:23:57 +02:00
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/shield_error.png " ) ) ;
2010-11-28 22:18:07 +01:00
MessageBeep ( MB_ICONEXCLAMATION ) ;
}
2010-11-27 19:41:58 +01:00
closeButton - > setEnabled ( true ) ;
2010-11-28 22:18:07 +01:00
if ( retryButton - > isVisible ( ) ) retryButton - > hide ( ) ;
2010-11-29 20:36:27 +01:00
if ( logButton - > isVisible ( ) ) logButton - > hide ( ) ;
2011-03-24 15:37:49 +01:00
if ( frameAnimation - > isVisible ( ) ) frameAnimation - > hide ( ) ;
2010-11-29 20:36:27 +01:00
m_success = true ;
2010-11-27 19:41:58 +01:00
}
2010-11-28 22:18:07 +01:00
bool UpdateDialog : : tryUpdateMirror ( UpdateInfo * updateInfo , const QString & url )
{
bool success = false ;
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Trying mirror: " < < url ) ;
2010-11-28 22:18:07 +01:00
2010-12-07 22:58:28 +01:00
QString randPart = lamexp_rand_str ( ) ;
2011-02-25 22:03:39 +01:00
QString outFileVersionInfo = QString ( " %1/%2.ver " ) . arg ( lamexp_temp_folder2 ( ) , randPart ) ;
QString outFileSignature = QString ( " %1/%2.sig " ) . arg ( lamexp_temp_folder2 ( ) , randPart ) ;
2010-11-28 22:18:07 +01:00
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Downloading update info: " ) ;
2011-05-03 14:28:06 +02:00
bool ok1 = getFile ( QString ( " %1%2 " ) . arg ( url , mirror_url_postfix [ m_betaUpdates ? 1 : 0 ] ) , outFileVersionInfo ) ;
2010-11-28 22:18:07 +01:00
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Downloading signature: " ) ;
2011-05-03 14:28:06 +02:00
bool ok2 = getFile ( QString ( " %1%2.sig " ) . arg ( url , mirror_url_postfix [ m_betaUpdates ? 1 : 0 ] ) , outFileSignature ) ;
2010-11-28 22:18:07 +01:00
if ( ok1 & & ok2 )
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Download okay, checking signature: " ) ;
2010-11-28 22:18:07 +01:00
if ( checkSignature ( outFileVersionInfo , outFileSignature ) )
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Signature okay, parsing info: " ) ;
2010-11-28 22:18:07 +01:00
success = parseVersionInfo ( outFileVersionInfo , updateInfo ) ;
}
else
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Bad signature, take care! " ) ;
2010-11-28 22:18:07 +01:00
}
}
else
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QStringList ( ) < < " " < < " Download has failed! " ) ;
2010-11-28 22:18:07 +01:00
}
QFile : : remove ( outFileVersionInfo ) ;
QFile : : remove ( outFileSignature ) ;
return success ;
}
bool UpdateDialog : : getFile ( const QString & url , const QString & outFile )
{
QFileInfo output ( outFile ) ;
output . setCaching ( false ) ;
if ( output . exists ( ) )
{
QFile : : remove ( output . canonicalFilePath ( ) ) ;
if ( output . exists ( ) )
{
return false ;
}
}
QProcess process ;
process . setProcessChannelMode ( QProcess : : MergedChannels ) ;
process . setReadChannel ( QProcess : : StandardOutput ) ;
2010-12-06 22:25:20 +01:00
process . setWorkingDirectory ( output . absolutePath ( ) ) ;
2010-11-28 22:18:07 +01:00
QEventLoop loop ;
connect ( & process , SIGNAL ( error ( QProcess : : ProcessError ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( readyRead ( ) ) , & loop , SLOT ( quit ( ) ) ) ;
2011-03-24 15:37:49 +01:00
QTimer timer ;
timer . setSingleShot ( true ) ;
timer . setInterval ( 15000 ) ;
connect ( & timer , SIGNAL ( timeout ( ) ) , & loop , SLOT ( quit ( ) ) ) ;
2010-12-06 22:25:20 +01:00
process . start ( m_binaryWGet , QStringList ( ) < < " -U " < < USER_AGENT_STR < < " -O " < < output . fileName ( ) < < url ) ;
2010-11-28 22:18:07 +01:00
if ( ! process . waitForStarted ( ) )
{
return false ;
}
2011-03-24 15:37:49 +01:00
timer . start ( ) ;
2010-11-28 22:18:07 +01:00
while ( process . state ( ) = = QProcess : : Running )
{
loop . exec ( ) ;
2011-03-24 15:37:49 +01:00
if ( ! timer . isActive ( ) )
{
qWarning ( " WGet process timed out <-- killing! " ) ;
process . kill ( ) ;
process . waitForFinished ( ) ;
m_logFile - > append ( " TIMEOUT !!! " ) ;
return false ;
}
2010-11-28 22:18:07 +01:00
while ( process . canReadLine ( ) )
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QString : : fromLatin1 ( process . readLine ( ) ) . simplified ( ) ) ;
2010-11-28 22:18:07 +01:00
}
}
2011-03-24 15:37:49 +01:00
timer . stop ( ) ;
timer . disconnect ( & timer , SIGNAL ( timeout ( ) ) , & loop , SLOT ( quit ( ) ) ) ;
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QString ( ) . sprintf ( " Exited with code %d " , process . exitCode ( ) ) ) ;
2010-11-28 22:18:07 +01:00
return ( process . exitCode ( ) = = 0 ) & & output . exists ( ) & & output . isFile ( ) ;
}
bool UpdateDialog : : checkSignature ( const QString & file , const QString & signature )
{
2010-12-06 22:25:20 +01:00
if ( QFileInfo ( file ) . absolutePath ( ) . compare ( QFileInfo ( signature ) . absolutePath ( ) , Qt : : CaseInsensitive ) ! = 0 )
{
qWarning ( " CheckSignature: File and signature should be in same folder! " ) ;
return false ;
}
2010-12-07 22:58:28 +01:00
if ( QFileInfo ( file ) . absolutePath ( ) . compare ( QFileInfo ( m_binaryKeys ) . absolutePath ( ) , Qt : : CaseInsensitive ) ! = 0 )
2010-12-06 22:25:20 +01:00
{
2010-12-07 22:58:28 +01:00
qWarning ( " CheckSignature: File and keyring should be in same folder! " ) ;
2010-12-06 22:25:20 +01:00
return false ;
}
2010-12-07 22:58:28 +01:00
2010-11-28 22:18:07 +01:00
QProcess process ;
process . setProcessChannelMode ( QProcess : : MergedChannels ) ;
process . setReadChannel ( QProcess : : StandardOutput ) ;
2010-12-06 22:25:20 +01:00
process . setWorkingDirectory ( QFileInfo ( file ) . absolutePath ( ) ) ;
2010-11-28 22:18:07 +01:00
QEventLoop loop ;
connect ( & process , SIGNAL ( error ( QProcess : : ProcessError ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( readyRead ( ) ) , & loop , SLOT ( quit ( ) ) ) ;
2010-12-07 22:58:28 +01:00
process . start ( m_binaryGnuPG , QStringList ( ) < < " --homedir " < < " . " < < " --keyring " < < QFileInfo ( m_binaryKeys ) . fileName ( ) < < QFileInfo ( signature ) . fileName ( ) < < QFileInfo ( file ) . fileName ( ) ) ;
2010-11-28 22:18:07 +01:00
if ( ! process . waitForStarted ( ) )
{
return false ;
}
while ( process . state ( ) = = QProcess : : Running )
{
loop . exec ( ) ;
while ( process . canReadLine ( ) )
{
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QString : : fromLatin1 ( process . readLine ( ) ) . simplified ( ) ) ;
2010-11-28 22:18:07 +01:00
}
}
2010-11-29 20:36:27 +01:00
m_logFile - > append ( QString ( ) . sprintf ( " Exited with code %d " , process . exitCode ( ) ) ) ;
2010-11-28 22:18:07 +01:00
return ( process . exitCode ( ) = = 0 ) ;
}
bool UpdateDialog : : parseVersionInfo ( const QString & file , UpdateInfo * updateInfo )
{
QRegExp value ( " ^( \\ w+) = ( . + ) $ " ) ;
QRegExp section ( " ^ \\ [(.+) \ \ ] $ " ) ;
2011-03-25 15:18:13 +01:00
QDate updateInfoDate ;
2011-02-12 22:17:42 +01:00
updateInfo - > resetInfo ( ) ;
2010-11-28 22:18:07 +01:00
QFile data ( file ) ;
if ( ! data . open ( QIODevice : : ReadOnly ) )
{
qWarning ( " Cannot open update info file for reading! " ) ;
return false ;
}
2011-03-25 15:18:13 +01:00
bool inHeader = false ;
2010-11-28 22:18:07 +01:00
bool inSection = false ;
while ( ! data . atEnd ( ) )
{
QString line = QString : : fromLatin1 ( data . readLine ( ) ) . trimmed ( ) ;
if ( section . indexIn ( line ) > = 0 )
{
2011-02-12 22:17:42 +01:00
m_logFile - > append ( QString ( " Sec: [%1] " ) . arg ( section . cap ( 1 ) ) ) ;
2010-11-28 22:18:07 +01:00
inSection = ( section . cap ( 1 ) . compare ( section_id , Qt : : CaseInsensitive ) = = 0 ) ;
2011-03-25 15:18:13 +01:00
inHeader = ( section . cap ( 1 ) . compare ( header_id , Qt : : CaseInsensitive ) = = 0 ) ;
2010-11-28 22:18:07 +01:00
continue ;
}
2011-03-25 15:18:13 +01:00
if ( inSection & & ( value . indexIn ( line ) > = 0 ) )
2010-11-28 22:18:07 +01:00
{
2011-02-12 22:17:42 +01:00
m_logFile - > append ( QString ( " Val: '%1' ==> '%2 " ) . arg ( value . cap ( 1 ) , value . cap ( 2 ) ) ) ;
2010-11-28 22:18:07 +01:00
if ( value . cap ( 1 ) . compare ( " BuildNo " , Qt : : CaseInsensitive ) = = 0 )
{
bool ok = false ;
unsigned int temp = value . cap ( 2 ) . toUInt ( & ok ) ;
if ( ok ) updateInfo - > m_buildNo = temp ;
}
else if ( value . cap ( 1 ) . compare ( " BuildDate " , Qt : : CaseInsensitive ) = = 0 )
{
QDate temp = QDate : : fromString ( value . cap ( 2 ) . trimmed ( ) , Qt : : ISODate ) ;
if ( temp . isValid ( ) ) updateInfo - > m_buildDate = temp ;
}
else if ( value . cap ( 1 ) . compare ( " DownloadSite " , Qt : : CaseInsensitive ) = = 0 )
{
updateInfo - > m_downloadSite = value . cap ( 2 ) . trimmed ( ) ;
}
else if ( value . cap ( 1 ) . compare ( " DownloadAddress " , Qt : : CaseInsensitive ) = = 0 )
{
updateInfo - > m_downloadAddress = value . cap ( 2 ) . trimmed ( ) ;
}
else if ( value . cap ( 1 ) . compare ( " DownloadFilename " , Qt : : CaseInsensitive ) = = 0 )
{
updateInfo - > m_downloadFilename = value . cap ( 2 ) . trimmed ( ) ;
}
else if ( value . cap ( 1 ) . compare ( " DownloadFilecode " , Qt : : CaseInsensitive ) = = 0 )
{
updateInfo - > m_downloadFilecode = value . cap ( 2 ) . trimmed ( ) ;
}
}
2011-03-25 15:18:13 +01:00
if ( inHeader & & ( value . indexIn ( line ) > = 0 ) )
{
m_logFile - > append ( QString ( " Val: '%1' ==> '%2 " ) . arg ( value . cap ( 1 ) , value . cap ( 2 ) ) ) ;
if ( value . cap ( 1 ) . compare ( " TimestampCreated " , Qt : : CaseInsensitive ) = = 0 )
{
QDate temp = QDate : : fromString ( value . cap ( 2 ) . trimmed ( ) , Qt : : ISODate ) ;
if ( temp . isValid ( ) ) updateInfoDate = temp ;
}
}
2010-11-28 22:18:07 +01:00
}
2011-03-25 15:18:13 +01:00
if ( ! updateInfoDate . isValid ( ) )
{
updateInfo - > resetInfo ( ) ;
m_logFile - > append ( " WARNING: Version info timestamp is missing! " ) ;
return false ;
}
else if ( updateInfoDate . addMonths ( VERSION_INFO_EXPIRES_MONTHS ) < QDate : : currentDate ( ) )
{
updateInfo - > resetInfo ( ) ;
m_logFile - > append ( QString : : fromLatin1 ( " WARNING: This version info has expired at %1! " ) . arg ( updateInfoDate . addMonths ( VERSION_INFO_EXPIRES_MONTHS ) . toString ( Qt : : ISODate ) ) ) ;
return false ;
}
else if ( QDate : : currentDate ( ) < updateInfoDate )
{
m_logFile - > append ( " Version info is from the future, take care! " ) ;
qWarning ( " Version info is from the future, take care! " ) ;
}
2010-11-28 22:18:07 +01:00
bool complete = true ;
if ( ! ( updateInfo - > m_buildNo > 0 ) ) complete = false ;
if ( ! ( updateInfo - > m_buildDate . year ( ) > = 2010 ) ) complete = false ;
if ( updateInfo - > m_downloadSite . isEmpty ( ) ) complete = false ;
if ( updateInfo - > m_downloadAddress . isEmpty ( ) ) complete = false ;
if ( updateInfo - > m_downloadFilename . isEmpty ( ) ) complete = false ;
if ( updateInfo - > m_downloadFilecode . isEmpty ( ) ) complete = false ;
2011-02-12 22:17:42 +01:00
if ( ! complete )
{
m_logFile - > append ( " WARNING: Version info is incomplete! " ) ;
}
2010-11-28 22:18:07 +01:00
return complete ;
}
void UpdateDialog : : linkActivated ( const QString & link )
{
QDesktopServices : : openUrl ( QUrl ( link ) ) ;
}
void UpdateDialog : : applyUpdate ( void )
{
installButton - > setEnabled ( false ) ;
closeButton - > setEnabled ( false ) ;
retryButton - > setEnabled ( false ) ;
if ( m_updateInfo )
{
2011-05-01 01:46:57 +02:00
statusLabel - > setText ( tr ( " Update is being downloaded, please be patient... " ) ) ;
2011-03-25 15:18:13 +01:00
frameAnimation - > show ( ) ;
if ( hintLabel - > isVisible ( ) ) hintLabel - > hide ( ) ;
if ( hintIcon - > isVisible ( ) ) hintIcon - > hide ( ) ;
int oldMax = progressBar - > maximum ( ) ;
int oldMin = progressBar - > minimum ( ) ;
2011-03-28 04:23:57 +02:00
progressBar - > setRange ( 0 , 0 ) ;
2010-11-28 22:18:07 +01:00
QApplication : : processEvents ( ) ;
QProcess process ;
QStringList args ;
QEventLoop loop ;
connect ( & process , SIGNAL ( error ( QProcess : : ProcessError ) ) , & loop , SLOT ( quit ( ) ) ) ;
connect ( & process , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) , & loop , SLOT ( quit ( ) ) ) ;
args < < QString ( " /Location=%1 " ) . arg ( m_updateInfo - > m_downloadAddress ) ;
args < < QString ( " /Filename=%1 " ) . arg ( m_updateInfo - > m_downloadFilename ) ;
args < < QString ( " /TicketID=%1 " ) . arg ( m_updateInfo - > m_downloadFilecode ) ;
2011-01-25 00:11:28 +01:00
args < < QString ( " /ToFolder=%1 " ) . arg ( QDir : : toNativeSeparators ( QDir ( QApplication : : applicationDirPath ( ) ) . canonicalPath ( ) ) ) ;
args < < QString ( " /ToExFile=%1.exe " ) . arg ( QFileInfo ( QFileInfo ( QApplication : : applicationFilePath ( ) ) . canonicalFilePath ( ) ) . completeBaseName ( ) ) ;
2010-11-28 22:18:07 +01:00
args < < QString ( " /AppTitle=LameXP (Build #%1) " ) . arg ( QString : : number ( m_updateInfo - > m_buildNo ) ) ;
QApplication : : setOverrideCursor ( Qt : : WaitCursor ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarIndeterminateState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/transmit_blue.png " ) ) ;
2010-11-28 22:18:07 +01:00
process . start ( m_binaryUpdater , args ) ;
loop . exec ( ) ;
QApplication : : restoreOverrideCursor ( ) ;
2011-02-25 13:40:45 +01:00
2011-03-25 15:18:13 +01:00
hintLabel - > show ( ) ;
hintIcon - > show ( ) ;
progressBar - > setRange ( oldMin , oldMax ) ;
progressBar - > setValue ( oldMax ) ;
frameAnimation - > hide ( ) ;
2010-11-28 22:18:07 +01:00
if ( process . exitCode ( ) = = 0 )
{
2011-05-01 01:46:57 +02:00
statusLabel - > setText ( tr ( " Update ready to install. Applicaion will quit... " ) ) ;
2011-02-18 00:53:36 +01:00
m_updateReadyToInstall = true ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarNoState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , NULL ) ;
2010-11-29 20:36:27 +01:00
accept ( ) ;
2010-11-28 22:18:07 +01:00
}
else
{
2011-05-01 01:46:57 +02:00
statusLabel - > setText ( tr ( " Update failed. Please try again or download manually! " ) ) ;
2011-02-25 13:40:45 +01:00
WinSevenTaskbar : : setTaskbarState ( this - > parentWidget ( ) , WinSevenTaskbar : : WinSevenTaskbarErrorState ) ;
WinSevenTaskbar : : setOverlayIcon ( this - > parentWidget ( ) , & QIcon ( " :/icons/exclamation.png " ) ) ;
WinSevenTaskbar : : setTaskbarProgress ( this - > parentWidget ( ) , 100 , 100 ) ;
2010-11-28 22:18:07 +01:00
}
}
installButton - > setEnabled ( true ) ;
closeButton - > setEnabled ( true ) ;
}
2010-11-29 20:36:27 +01:00
void UpdateDialog : : logButtonClicked ( void )
{
LogViewDialog * logView = new LogViewDialog ( this ) ;
logView - > exec ( * m_logFile ) ;
LAMEXP_DELETE ( logView ) ;
}
2011-02-25 13:40:45 +01:00
void UpdateDialog : : progressBarValueChanged ( int value )
{
WinSevenTaskbar : : setTaskbarProgress ( this - > parentWidget ( ) , value , progressBar - > maximum ( ) ) ;
}