Implement update reminder + added options to disable the update reminder and/or the sound effects + improved installer

This commit is contained in:
LoRd_MuldeR 2010-11-29 20:36:27 +01:00
parent 00a05d44c2
commit 53a1bf6e38
14 changed files with 278 additions and 70 deletions

View File

@ -1,13 +1,38 @@
; ///////////////////////////////////////////////////////////////////////////////
; // LameXP - Audio Encoder Front-End
; // Copyright (C) 2004-2010 LoRd_MuldeR <MuldeR2@GMX.de>
; //
; // 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
; ///////////////////////////////////////////////////////////////////////////////
RequestExecutionLevel user
BrandingText `Date created: ${LAMEXP_DATE}`
ShowInstDetails show
!define ZIP2EXE_NAME `LameXP v${LAMEXP_VERSION} ${LAMEXP_SUFFIX} [Build #${LAMEXP_BUILD}]` !define ZIP2EXE_NAME `LameXP v${LAMEXP_VERSION} ${LAMEXP_SUFFIX} [Build #${LAMEXP_BUILD}]`
!define ZIP2EXE_OUTFILE `${LAMEXP_OUTPUT_FILE}` !define ZIP2EXE_OUTFILE `${LAMEXP_OUTPUT_FILE}`
!define ZIP2EXE_COMPRESSOR_LZMA !define ZIP2EXE_COMPRESSOR_LZMA
!define ZIP2EXE_COMPRESSOR_SOLID !define ZIP2EXE_COMPRESSOR_SOLID
!define ZIP2EXE_INSTALLDIR `$PROGRAMFILES\${ZIP2EXE_NAME}` !define ZIP2EXE_INSTALLDIR `$PROGRAMFILES\${ZIP2EXE_NAME}`
RequestExecutionLevel user !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
BrandingText `Date created: ${LAMEXP_DATE}` !define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
ShowInstDetails show !define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CheckForUpdate !define MUI_PAGE_CUSTOMFUNCTION_SHOW CheckForUpdate
!include `UAC.nsh` !include `UAC.nsh`
@ -23,10 +48,10 @@ Function .onInit
${IfThen} $1 = 1 ${|} Quit ${|} ${IfThen} $1 = 1 ${|} Quit ${|}
${IfThen} $3 <> 0 ${|} ${Break} ${|} ${IfThen} $3 <> 0 ${|} ${Break} ${|}
${If} $1 = 3 ${If} $1 = 3
MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "This installer requires admin access, please try again!" /SD IDNO IDOK UAC_TryAgain IDNO 0 MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This installer requires admin access, please try again!" /SD IDCANCEL IDOK UAC_TryAgain
${EndIf} ${EndIf}
${Case} 1223 ${Case} 1223
MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "This installer requires admin privileges, please try again!" /SD IDNO IDOK UAC_TryAgain IDNO 0 MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This installer requires admin privileges, please try again!" /SD IDCANCEL IDOK UAC_TryAgain
Quit Quit
${Case} 1062 ${Case} 1062
MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!" MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!"

View File

@ -1133,8 +1133,16 @@
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="menuStyle"/> <addaction name="menuStyle"/>
</widget> </widget>
<widget class="QMenu" name="menuTools">
<property name="title">
<string>Tools</string>
</property>
<addaction name="actionDisableUpdateReminder"/>
<addaction name="actionDisableSounds"/>
</widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
<addaction name="menuView"/> <addaction name="menuView"/>
<addaction name="menuTools"/>
<addaction name="menuHelp"/> <addaction name="menuHelp"/>
</widget> </widget>
<action name="actionAbout"> <action name="actionAbout">
@ -1286,6 +1294,22 @@
<string>Windows XP (&quot;Luna&quot;)</string> <string>Windows XP (&quot;Luna&quot;)</string>
</property> </property>
</action> </action>
<action name="actionDisableUpdateReminder">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Disable Update Reminder</string>
</property>
</action>
<action name="actionDisableSounds">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Disable Sound Effects</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="../res/Icons.qrc"/> <include location="../res/Icons.qrc"/>
@ -1361,6 +1385,12 @@
<include location="../res/Images.qrc"/> <include location="../res/Images.qrc"/>
<include location="../res/Icons.qrc"/> <include location="../res/Icons.qrc"/>
<include location="../res/Images.qrc"/> <include location="../res/Images.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Images.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Images.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Images.qrc"/>
</resources> </resources>
<connections> <connections>
<connection> <connection>

View File

@ -13,6 +13,10 @@
<property name="windowTitle"> <property name="windowTitle">
<string>LameXP Update Manager</string> <string>LameXP Update Manager</string>
</property> </property>
<property name="windowIcon">
<iconset resource="../res/Icons.qrc">
<normaloff>:/icons/transmit_blue.png</normaloff>:/icons/transmit_blue.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
@ -335,6 +339,23 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="logButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Show Log</string>
</property>
<property name="icon">
<iconset resource="../res/Icons.qrc">
<normaloff>:/icons/application_view_list.png</normaloff>:/icons/application_view_list.png</iconset>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer_6"> <spacer name="horizontalSpacer_6">
<property name="orientation"> <property name="orientation">
@ -484,6 +505,8 @@
<include location="../res/Images.qrc"/> <include location="../res/Images.qrc"/>
<include location="../res/Images.qrc"/> <include location="../res/Images.qrc"/>
<include location="../res/Images.qrc"/> <include location="../res/Images.qrc"/>
<include location="../res/Images.qrc"/>
<include location="../res/Images.qrc"/>
</resources> </resources>
<connections> <connections>
<connection> <connection>

View File

@ -25,7 +25,7 @@
#define VER_LAMEXP_MAJOR 4 #define VER_LAMEXP_MAJOR 4
#define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_HI 0
#define VER_LAMEXP_MINOR_LO 0 #define VER_LAMEXP_MINOR_LO 0
#define VER_LAMEXP_BUILD 99 #define VER_LAMEXP_BUILD 103
#define VER_LAMEXP_SUFFIX TechPreview #define VER_LAMEXP_SUFFIX TechPreview
/* /*

View File

@ -23,6 +23,7 @@
#include "Global.h" #include "Global.h"
#include "Resource.h" #include "Resource.h"
#include "Model_Settings.h"
//Qt includes //Qt includes
#include <QDate> #include <QDate>
@ -46,8 +47,10 @@ const char *AboutDialog::neroAacUrl = "http://www.nero.com/eng/technologies-aac-
// Constructor // Constructor
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
AboutDialog::AboutDialog(QWidget *parent, bool firstStart) AboutDialog::AboutDialog(SettingsModel *settings, QWidget *parent, bool firstStart)
: QMessageBox(parent) :
QMessageBox(parent),
m_settings(settings)
{ {
QString aboutText; QString aboutText;
@ -125,7 +128,10 @@ AboutDialog::~AboutDialog(void)
int AboutDialog::exec() int AboutDialog::exec()
{ {
if(m_settings->soundsEnabled())
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE_ABOUT), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE_ABOUT), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC);
}
switch(QMessageBox::exec()) switch(QMessageBox::exec())
{ {

View File

@ -20,14 +20,17 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#pragma once #pragma once
#include <QMessageBox> #include <QMessageBox>
class SettingsModel;
class AboutDialog : public QMessageBox class AboutDialog : public QMessageBox
{ {
Q_OBJECT Q_OBJECT
public: public:
AboutDialog(QWidget *parent = 0, bool firstStart = false); AboutDialog(SettingsModel *settings, QWidget *parent = 0, bool firstStart = false);
~AboutDialog(void); ~AboutDialog(void);
static const char *neroAacUrl; static const char *neroAacUrl;
@ -44,4 +47,5 @@ protected:
private: private:
bool m_firstShow; bool m_firstShow;
SettingsModel *m_settings;
}; };

View File

@ -240,6 +240,12 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
connect(m_styleActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(styleActionActivated(QAction*))); connect(m_styleActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(styleActionActivated(QAction*)));
styleActionActivated(NULL); styleActionActivated(NULL);
//Activate tools menu actions
actionDisableUpdateReminder->setChecked(!m_settings->autoUpdateEnabled());
actionDisableSounds->setChecked(!m_settings->soundsEnabled());
connect(actionDisableUpdateReminder, SIGNAL(triggered(bool)), this, SLOT(disableUpdateReminderActionTriggered(bool)));
connect(actionDisableSounds, SIGNAL(triggered(bool)), this, SLOT(disableSoundsActionTriggered(bool)));
//Activate help menu actions //Activate help menu actions
connect(actionCheckUpdates, SIGNAL(triggered()), this, SLOT(checkUpdatesActionActivated())); connect(actionCheckUpdates, SIGNAL(triggered()), this, SLOT(checkUpdatesActionActivated()));
connect(actionVisitHomepage, SIGNAL(triggered()), this, SLOT(visitHomepageActionActivated())); connect(actionVisitHomepage, SIGNAL(triggered()), this, SLOT(visitHomepageActionActivated()));
@ -435,13 +441,14 @@ void MainWindow::windowShown(void)
{ {
QStringList arguments = QApplication::arguments(); QStringList arguments = QApplication::arguments();
//Check license
if(m_settings->licenseAccepted() <= 0) if(m_settings->licenseAccepted() <= 0)
{ {
int iAccepted = -1; int iAccepted = -1;
if(m_settings->licenseAccepted() == 0) if(m_settings->licenseAccepted() == 0)
{ {
AboutDialog *about = new AboutDialog(this, true); AboutDialog *about = new AboutDialog(m_settings, this, true);
iAccepted = about->exec(); iAccepted = about->exec();
LAMEXP_DELETE(about); LAMEXP_DELETE(about);
} }
@ -457,6 +464,48 @@ void MainWindow::windowShown(void)
m_settings->licenseAccepted(1); m_settings->licenseAccepted(1);
} }
//Check for expiration
if(lamexp_version_demo())
{
QDate expireDate = lamexp_version_date().addDays(14);
if(QDate::currentDate() >= expireDate)
{
qWarning("Binary has expired !!!");
if(QMessageBox::warning(this, "LameXP - Expired", QString("This demo (pre-release) version of LameXP has expired at %1.\nLameXP is free software and release versions won't expire.").arg(expireDate.toString(Qt::ISODate)), "Check for Updates", "Exit Program") == 0)
{
checkUpdatesActionActivated();
}
QApplication::quit();
return;
}
}
//Update reminder
if(QDate::currentDate() >= lamexp_version_date().addYears(1))
{
qWarning("Binary is more than a year old, time to update!");
if(QMessageBox::warning(this, "Urgent Update", "Your version of LameXP is more than a year old. Time for an update!", "Check for Updates", "Exit Program") == 0)
{
checkUpdatesActionActivated();
}
else
{
QApplication::quit();
return;
}
}
else if(m_settings->autoUpdateEnabled())
{
QDate lastUpdateCheck = QDate::fromString(m_settings->autoUpdateLastCheck(), Qt::ISODate);
if(!lastUpdateCheck.isValid() || QDate::currentDate() >= lastUpdateCheck.addDays(14))
{
if(QMessageBox::information(this, "Update Reminer", "Your last update check was more than 14 days ago. Check for updates now?", "Check for Updates", "Defer") == 0)
{
checkUpdatesActionActivated();
}
}
}
//Check for AAC support //Check for AAC support
if(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe")) if(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe"))
{ {
@ -504,7 +553,7 @@ void MainWindow::windowShown(void)
void MainWindow::aboutButtonClicked(void) void MainWindow::aboutButtonClicked(void)
{ {
ABORT_IF_BUSY; ABORT_IF_BUSY;
AboutDialog *aboutBox = new AboutDialog(this); AboutDialog *aboutBox = new AboutDialog(m_settings, this);
aboutBox->exec(); aboutBox->exec();
LAMEXP_DELETE(aboutBox); LAMEXP_DELETE(aboutBox);
} }
@ -855,36 +904,15 @@ void MainWindow::checkUpdatesActionActivated(void)
{ {
ABORT_IF_BUSY; ABORT_IF_BUSY;
UpdateDialog *updateDialog = new UpdateDialog(this); UpdateDialog *updateDialog = new UpdateDialog(m_settings, this);
updateDialog->exec(); updateDialog->exec();
if(updateDialog->getSuccess())
{
m_settings->autoUpdateLastCheck(QDate::currentDate().toString(Qt::ISODate));
}
LAMEXP_DELETE(updateDialog); LAMEXP_DELETE(updateDialog);
//m_banner->show("Checking for updates, please be patient...");
//
//for(int i = 0; i < 300; i++)
//{
// QApplication::processEvents();
// Sleep(5);
//}
//
//QNetworkAccessManager networkMgr;
//QNetworkReply *reply = networkMgr.get(QNetworkRequest(QUrl( "http://mulder.dummwiedeutsch.de/update.ver")));
//QEventLoop loop;
//connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
//connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
//connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
//while(!reply->isFinished())
//{
// loop.exec(QEventLoop::ExcludeUserInputEvents);
// QByteArray buffer = reply->readAll();
// qDebug("%s", buffer.constData());
//}
//m_banner->close();
//
//QMessageBox::information(this, "Update Check", "Your version of LameXP is still up-to-date. There are no updates available.\nPlease remember to check for updates at regular intervals!");
} }
/* /*
@ -1247,3 +1275,55 @@ void MainWindow::findFileContextActionTriggered(void)
QProcess::execute("explorer.exe", QStringList() << "/select," << QDir::toNativeSeparators(m_fileListModel->getFile(index).filePath())); QProcess::execute("explorer.exe", QStringList() << "/select," << QDir::toNativeSeparators(m_fileListModel->getFile(index).filePath()));
} }
} }
/*
* Disable update reminder action
*/
void MainWindow::disableUpdateReminderActionTriggered(bool checked)
{
if(checked)
{
if(QMessageBox::Yes == QMessageBox::question(this, "Disable Update Reminder", "Do you really want to disable the update reminder?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
{
QMessageBox::information(this, "Update Reminder", "The update reminder has been disabled.<br>Please remember to check for updates at regular intervals!");
m_settings->autoUpdateEnabled(false);
}
else
{
m_settings->autoUpdateEnabled(true);
}
}
else
{
QMessageBox::information(this, "Update Reminder", "The update reminder has been re-enabled.");
m_settings->autoUpdateEnabled(true);
}
actionDisableUpdateReminder->setChecked(!m_settings->autoUpdateEnabled());
}
/*
* Disable sound effects action
*/
void MainWindow::disableSoundsActionTriggered(bool checked)
{
if(checked)
{
if(QMessageBox::Yes == QMessageBox::question(this, "Disable Sound Effects", "Do you really want to disable all sound effects?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
{
QMessageBox::information(this, "Sound Effects", "All sound effects have been disabled.");
m_settings->soundsEnabled(false);
}
else
{
m_settings->soundsEnabled(true);
}
}
else
{
QMessageBox::information(this, "Sound Effects", "The sound effects have been re-enabled.");
m_settings->soundsEnabled(true);
}
actionDisableSounds->setChecked(!m_settings->soundsEnabled());
}

View File

@ -83,6 +83,8 @@ private slots:
void sourceFilesContextMenu(const QPoint &pos); void sourceFilesContextMenu(const QPoint &pos);
void previewContextActionTriggered(void); void previewContextActionTriggered(void);
void findFileContextActionTriggered(void); void findFileContextActionTriggered(void);
void disableUpdateReminderActionTriggered(bool checked);
void disableSoundsActionTriggered(bool checked);
protected: protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);

View File

@ -269,7 +269,7 @@ void ProcessingDialog::doneEncoding(void)
{ {
label_progress->setText((m_succeededFiles > 0) ? QString("Process was aborted by the user after %1 file(s)!").arg(QString::number(m_succeededFiles)) : "Process was aborted prematurely by the user!"); label_progress->setText((m_succeededFiles > 0) ? QString("Process was aborted by the user after %1 file(s)!").arg(QString::number(m_succeededFiles)) : "Process was aborted prematurely by the user!");
QApplication::processEvents(); QApplication::processEvents();
PlaySound(MAKEINTRESOURCE(IDR_WAVE_ABORTED), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC); if(m_settings->soundsEnabled()) PlaySound(MAKEINTRESOURCE(IDR_WAVE_ABORTED), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC);
} }
else else
{ {
@ -277,13 +277,13 @@ void ProcessingDialog::doneEncoding(void)
{ {
label_progress->setText(QString("Error: %1 of %2 files failed. Double-click failed items for detailed information!").arg(QString::number(m_failedFiles), QString::number(m_failedFiles + m_succeededFiles))); label_progress->setText(QString("Error: %1 of %2 files failed. Double-click failed items for detailed information!").arg(QString::number(m_failedFiles), QString::number(m_failedFiles + m_succeededFiles)));
QApplication::processEvents(); QApplication::processEvents();
PlaySound(MAKEINTRESOURCE(IDR_WAVE_ERROR), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC); if(m_settings->soundsEnabled()) PlaySound(MAKEINTRESOURCE(IDR_WAVE_ERROR), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC);
} }
else else
{ {
label_progress->setText("Alle files completed successfully."); label_progress->setText("Alle files completed successfully.");
QApplication::processEvents(); QApplication::processEvents();
PlaySound(MAKEINTRESOURCE(IDR_WAVE_SUCCESS), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC); if(m_settings->soundsEnabled()) PlaySound(MAKEINTRESOURCE(IDR_WAVE_SUCCESS), GetModuleHandle(NULL), SND_RESOURCE | SND_SYNC);
} }
} }

View File

@ -23,6 +23,8 @@
#include "Global.h" #include "Global.h"
#include "Resource.h" #include "Resource.h"
#include "Dialog_LogView.h"
#include "Model_Settings.h"
#include <QClipboard> #include <QClipboard>
#include <QFileDialog> #include <QFileDialog>
@ -79,14 +81,17 @@ public:
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
UpdateDialog::UpdateDialog(QWidget *parent) UpdateDialog::UpdateDialog(SettingsModel *settings, QWidget *parent)
: :
QDialog(parent), QDialog(parent),
m_binaryWGet(lamexp_lookup_tool("wget.exe")), m_binaryWGet(lamexp_lookup_tool("wget.exe")),
m_binaryGnuPG(lamexp_lookup_tool("gpgv.exe")), m_binaryGnuPG(lamexp_lookup_tool("gpgv.exe")),
m_binaryUpdater(lamexp_lookup_tool("wupdate.exe")), m_binaryUpdater(lamexp_lookup_tool("wupdate.exe")),
m_binaryKeys(lamexp_lookup_tool("gpgv.gpg")), m_binaryKeys(lamexp_lookup_tool("gpgv.gpg")),
m_updateInfo(NULL) m_updateInfo(NULL),
m_settings(settings),
m_logFile(new QStringList()),
m_success(false)
{ {
if(m_binaryWGet.isEmpty() || m_binaryGnuPG.isEmpty() || m_binaryUpdater.isEmpty() || m_binaryKeys.isEmpty()) if(m_binaryWGet.isEmpty() || m_binaryGnuPG.isEmpty() || m_binaryUpdater.isEmpty() || m_binaryKeys.isEmpty())
{ {
@ -105,11 +110,13 @@ UpdateDialog::UpdateDialog(QWidget *parent)
connect(retryButton, SIGNAL(clicked()), this, SLOT(checkForUpdates())); connect(retryButton, SIGNAL(clicked()), this, SLOT(checkForUpdates()));
connect(installButton, SIGNAL(clicked()), this, SLOT(applyUpdate())); connect(installButton, SIGNAL(clicked()), this, SLOT(applyUpdate()));
connect(infoLabel, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString))); connect(infoLabel, SIGNAL(linkActivated(QString)), this, SLOT(linkActivated(QString)));
connect(logButton, SIGNAL(clicked()), this, SLOT(logButtonClicked()));
} }
UpdateDialog::~UpdateDialog(void) UpdateDialog::~UpdateDialog(void)
{ {
LAMEXP_DELETE(m_updateInfo); LAMEXP_DELETE(m_updateInfo);
LAMEXP_DELETE(m_logFile);
} }
void UpdateDialog::showEvent(QShowEvent *event) void UpdateDialog::showEvent(QShowEvent *event)
@ -124,7 +131,9 @@ void UpdateDialog::showEvent(QShowEvent *event)
installButton->setEnabled(false); installButton->setEnabled(false);
closeButton->setEnabled(false); closeButton->setEnabled(false);
retryButton->setEnabled(false); retryButton->setEnabled(false);
logButton->setEnabled(false);
retryButton->hide(); retryButton->hide();
logButton->hide();
infoLabel->hide(); infoLabel->hide();
for(int i = 0; mirrors[i]; i++) for(int i = 0; mirrors[i]; i++)
@ -157,11 +166,15 @@ void UpdateDialog::checkForUpdates(void)
installButton->setEnabled(false); installButton->setEnabled(false);
closeButton->setEnabled(false); closeButton->setEnabled(false);
retryButton->setEnabled(false); retryButton->setEnabled(false);
logButton->setEnabled(false);
if(infoLabel->isVisible()) infoLabel->hide(); if(infoLabel->isVisible()) infoLabel->hide();
QApplication::processEvents(); QApplication::processEvents();
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
m_logFile->clear();
m_logFile->append("Checking for updates online...");
for(int i = 0; mirrors[i]; i++) for(int i = 0; mirrors[i]; i++)
{ {
progressBar->setValue(i+1); progressBar->setValue(i+1);
@ -177,12 +190,14 @@ void UpdateDialog::checkForUpdates(void)
if(!success) if(!success)
{ {
if(!retryButton->isVisible()) retryButton->show(); if(!retryButton->isVisible()) retryButton->show();
if(!logButton->isVisible()) logButton->show();
closeButton->setEnabled(true); closeButton->setEnabled(true);
retryButton->setEnabled(true); retryButton->setEnabled(true);
statusLabel->setText("Failed to fetch update information. Check internet connection!"); logButton->setEnabled(true);
statusLabel->setText("Failed to fetch update information. Check your internet connection!");
progressBar->setValue(progressBar->maximum()); progressBar->setValue(progressBar->maximum());
LAMEXP_DELETE(m_updateInfo); LAMEXP_DELETE(m_updateInfo);
PlaySound(MAKEINTRESOURCE(IDR_WAVE_ERROR), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC); if(m_settings->soundsEnabled()) PlaySound(MAKEINTRESOURCE(IDR_WAVE_ERROR), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC);
return; return;
} }
@ -210,39 +225,43 @@ void UpdateDialog::checkForUpdates(void)
closeButton->setEnabled(true); closeButton->setEnabled(true);
if(retryButton->isVisible()) retryButton->hide(); if(retryButton->isVisible()) retryButton->hide();
if(logButton->isVisible()) logButton->hide();
progressBar->setValue(progressBar->maximum()); progressBar->setValue(progressBar->maximum());
m_success = true;
} }
bool UpdateDialog::tryUpdateMirror(UpdateInfo *updateInfo, const QString &url) bool UpdateDialog::tryUpdateMirror(UpdateInfo *updateInfo, const QString &url)
{ {
bool success = false; bool success = false;
m_logFile->append(QStringList() << "" << "Trying mirror:" << url);
QUuid uuid = QUuid::createUuid(); QUuid uuid = QUuid::createUuid();
QString outFileVersionInfo = QString("%1/%2.ver").arg(QDir::tempPath(), uuid.toString()); QString outFileVersionInfo = QString("%1/%2.ver").arg(QDir::tempPath(), uuid.toString());
QString outFileSignature = QString("%1/%2.sig").arg(QDir::tempPath(), uuid.toString()); QString outFileSignature = QString("%1/%2.sig").arg(QDir::tempPath(), uuid.toString());
qDebug("\nDownloading update info:"); m_logFile->append(QStringList() << "" << "Downloading update info:");
bool ok1 = getFile(QString("%1%2").arg(url,mirror_url_postfix), outFileVersionInfo); bool ok1 = getFile(QString("%1%2").arg(url,mirror_url_postfix), outFileVersionInfo);
qDebug("\nDownloading signature file:"); m_logFile->append(QStringList() << "" << "Downloading signature:");
bool ok2 = getFile(QString("%1%2.sig").arg(url,mirror_url_postfix), outFileSignature); bool ok2 = getFile(QString("%1%2.sig").arg(url,mirror_url_postfix), outFileSignature);
if(ok1 && ok2) if(ok1 && ok2)
{ {
qDebug("\nDownload okay, checking signature:"); m_logFile->append(QStringList() << "" << "Download okay, checking signature:");
if(checkSignature(outFileVersionInfo, outFileSignature)) if(checkSignature(outFileVersionInfo, outFileSignature))
{ {
qDebug("\nSignature okay, parsing info:"); m_logFile->append(QStringList() << "" << "Signature okay, parsing info:");
success = parseVersionInfo(outFileVersionInfo, updateInfo); success = parseVersionInfo(outFileVersionInfo, updateInfo);
} }
else else
{ {
qDebug("\nBad signature, take care!"); m_logFile->append(QStringList() << "" << "Bad signature, take care!");
} }
} }
else else
{ {
qDebug("\nDownload has failed!"); m_logFile->append(QStringList() << "" << "Download has failed!");
} }
QFile::remove(outFileVersionInfo); QFile::remove(outFileVersionInfo);
@ -286,11 +305,11 @@ bool UpdateDialog::getFile(const QString &url, const QString &outFile)
loop.exec(); loop.exec();
while(process.canReadLine()) while(process.canReadLine())
{ {
qDebug("WGet: %s", QString::fromLatin1(process.readLine()).simplified().toLatin1().constData()); m_logFile->append(QString::fromLatin1(process.readLine()).simplified());
} }
} }
qDebug("WGet: Exited with code %d", process.exitCode()); m_logFile->append(QString().sprintf("Exited with code %d", process.exitCode()));
return (process.exitCode() == 0) && output.exists() && output.isFile(); return (process.exitCode() == 0) && output.exists() && output.isFile();
} }
@ -317,11 +336,11 @@ bool UpdateDialog::checkSignature(const QString &file, const QString &signature)
loop.exec(); loop.exec();
while(process.canReadLine()) while(process.canReadLine())
{ {
qDebug("GnuPG: %s", QString::fromLatin1(process.readLine()).simplified().toLatin1().constData()); m_logFile->append(QString::fromLatin1(process.readLine()).simplified());
} }
} }
qDebug("GnuPG: Exited with code %d", process.exitCode()); m_logFile->append(QString().sprintf("Exited with code %d", process.exitCode()));
return (process.exitCode() == 0); return (process.exitCode() == 0);
} }
@ -345,13 +364,13 @@ bool UpdateDialog::parseVersionInfo(const QString &file, UpdateInfo *updateInfo)
QString line = QString::fromLatin1(data.readLine()).trimmed(); QString line = QString::fromLatin1(data.readLine()).trimmed();
if(section.indexIn(line) >= 0) if(section.indexIn(line) >= 0)
{ {
qDebug("Section: '%s'", section.cap(1).toLatin1().constData()); m_logFile->append(QString("[%1]").arg(section.cap(1)));
inSection = (section.cap(1).compare(section_id, Qt::CaseInsensitive) == 0); inSection = (section.cap(1).compare(section_id, Qt::CaseInsensitive) == 0);
continue; continue;
} }
if(inSection && value.indexIn(line) >= 0) if(inSection && value.indexIn(line) >= 0)
{ {
qDebug("Value: '%s' ==> '%s'", value.cap(1).toLatin1().constData(), value.cap(2).toLatin1().constData()); m_logFile->append(QString("'%1' ==> '%2").arg(value.cap(1), value.cap(2)));
if(value.cap(1).compare("BuildNo", Qt::CaseInsensitive) == 0) if(value.cap(1).compare("BuildNo", Qt::CaseInsensitive) == 0)
{ {
bool ok = false; bool ok = false;
@ -432,6 +451,7 @@ void UpdateDialog::applyUpdate(void)
{ {
statusLabel->setText("Update ready to install. Applicaion will quit..."); statusLabel->setText("Update ready to install. Applicaion will quit...");
QApplication::quit(); QApplication::quit();
accept();
} }
else else
{ {
@ -442,3 +462,10 @@ void UpdateDialog::applyUpdate(void)
installButton->setEnabled(true); installButton->setEnabled(true);
closeButton->setEnabled(true); closeButton->setEnabled(true);
} }
void UpdateDialog::logButtonClicked(void)
{
LogViewDialog *logView = new LogViewDialog(this);
logView->exec(*m_logFile);
LAMEXP_DELETE(logView);
}

View File

@ -26,20 +26,24 @@
#include <QDialog> #include <QDialog>
class UpdateInfo; class UpdateInfo;
class SettingsModel;
class UpdateDialog : public QDialog, private Ui::UpdateDialog class UpdateDialog : public QDialog, private Ui::UpdateDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
UpdateDialog(QWidget *parent = 0); UpdateDialog(SettingsModel *settings, QWidget *parent = 0);
~UpdateDialog(void); ~UpdateDialog(void);
bool getSuccess(void) { return m_success; }
private slots: private slots:
void updateInit(void); void updateInit(void);
void checkForUpdates(void); void checkForUpdates(void);
void linkActivated(const QString &link); void linkActivated(const QString &link);
void applyUpdate(void); void applyUpdate(void);
void logButtonClicked(void);
protected: protected:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
@ -52,9 +56,13 @@ private:
bool parseVersionInfo(const QString &file, UpdateInfo *updateInfo); bool parseVersionInfo(const QString &file, UpdateInfo *updateInfo);
UpdateInfo *m_updateInfo; UpdateInfo *m_updateInfo;
QStringList *m_logFile;
SettingsModel *m_settings;
const QString m_binaryWGet; const QString m_binaryWGet;
const QString m_binaryGnuPG; const QString m_binaryGnuPG;
const QString m_binaryUpdater; const QString m_binaryUpdater;
const QString m_binaryKeys; const QString m_binaryKeys;
bool m_success;
}; };

View File

@ -80,12 +80,6 @@ int lamexp_main(int argc, char* argv[])
{ {
QDate expireDate = lamexp_version_date().addDays(14); QDate expireDate = lamexp_version_date().addDays(14);
qWarning(QString("Note: This demo (pre-release) version of LameXP will expire at %1.\n").arg(expireDate.toString(Qt::ISODate)).toLatin1().constData()); qWarning(QString("Note: This demo (pre-release) version of LameXP will expire at %1.\n").arg(expireDate.toString(Qt::ISODate)).toLatin1().constData());
if(QDate::currentDate() >= expireDate)
{
qWarning("Binary has expired !!!");
QMessageBox::warning(NULL, "LameXP - Expired", QString("This demo (pre-release) version of LameXP has expired at %1.\nLameXP is free software and release versions won't expire.").arg(expireDate.toString()), "Exit Program");
return 0;
}
} }
//Check for multiple instances of LameXP //Check for multiple instances of LameXP

View File

@ -38,8 +38,11 @@ static const char *g_settingsId_compressionRCMode = "Compression/RCMode";
static const char *g_settingsId_compressionBitrate = "Compression/Bitrate"; static const char *g_settingsId_compressionBitrate = "Compression/Bitrate";
static const char *g_settingsId_outputDir = "OutputDirectory/SelectedPath"; static const char *g_settingsId_outputDir = "OutputDirectory/SelectedPath";
static const char *g_settingsId_outputToSourceDir = "OutputDirectory/OutputToSourceFolder"; static const char *g_settingsId_outputToSourceDir = "OutputDirectory/OutputToSourceFolder";
static const char *g_settingsId_writeMetaTags = "WriteMetaTags"; static const char *g_settingsId_writeMetaTags = "Flags/WriteMetaTags";
static const char *g_settingsId_createPlaylist = "AutoCreatePlaylist"; static const char *g_settingsId_createPlaylist = "Flags/AutoCreatePlaylist";
static const char *g_settingsId_autoUpdateLastCheck = "AutoUpdate/LastCheck";
static const char *g_settingsId_autoUpdateEnabled = "AutoUpdate/Enabled";
static const char *g_settingsId_soundsEnabled = "Flags/EnableSounds";
//Macros //Macros
#define MAKE_OPTION1(OPT,DEF) \ #define MAKE_OPTION1(OPT,DEF) \
@ -116,3 +119,6 @@ MAKE_OPTION2(outputDir, QString())
MAKE_OPTION3(outputToSourceDir, false) MAKE_OPTION3(outputToSourceDir, false)
MAKE_OPTION3(writeMetaTags, true) MAKE_OPTION3(writeMetaTags, true)
MAKE_OPTION3(createPlaylist, true) MAKE_OPTION3(createPlaylist, true)
MAKE_OPTION2(autoUpdateLastCheck, "Never")
MAKE_OPTION3(autoUpdateEnabled, true)
MAKE_OPTION3(soundsEnabled, true)

View File

@ -71,6 +71,9 @@ public:
MAKE_OPTION_DEC3(outputToSourceDir); MAKE_OPTION_DEC3(outputToSourceDir);
MAKE_OPTION_DEC3(writeMetaTags); MAKE_OPTION_DEC3(writeMetaTags);
MAKE_OPTION_DEC3(createPlaylist); MAKE_OPTION_DEC3(createPlaylist);
MAKE_OPTION_DEC2(autoUpdateLastCheck);
MAKE_OPTION_DEC3(autoUpdateEnabled);
MAKE_OPTION_DEC3(soundsEnabled);
//Misc //Misc
void validate(void); void validate(void);