// External API
//-------------------------------------
-bool BinariesCheckThread::check(SysinfoModel *sysinfo)
+bool BinariesCheckThread::check(const SysinfoModel *const sysinfo, QString *const failedPath)
{
QMutexLocker lock(&m_binLock);
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- connect(&thread, SIGNAL(finished()), &loop, SLOT(quit()));
+ connect(&thread, SIGNAL(finished()), &loop, SLOT(quit()));
connect(&thread, SIGNAL(terminated()), &loop, SLOT(quit()));
thread.start();
QApplication::restoreOverrideCursor();
- if(!thread.wait(1000))
+ if(!thread.wait(5000))
{
qWarning("Binaries checker thread encountered timeout -> probably deadlock!");
thread.terminate();
return false;
}
- return thread.getSuccess();
+ const bool success = thread.getSuccess();
+ if ((!success) && failedPath)
+ {
+ *failedPath = thread.getFailedPath();
+ }
+
+ return success;
}
//-------------------------------------
void BinariesCheckThread::run(void)
{
m_success = m_exception = false;
- checkBinaries1(m_success, m_sysinfo, &m_exception);
+ m_failedPath = QString();
+ checkBinaries1(m_success, m_failedPath, m_sysinfo, &m_exception);
}
-void BinariesCheckThread::checkBinaries1(volatile bool &success, const SysinfoModel *const sysinfo, volatile bool *exception)
+void BinariesCheckThread::checkBinaries1(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo, volatile bool *exception)
{
__try
{
- checkBinaries2(success, sysinfo, exception);
+ checkBinaries2(success, failedPath, sysinfo, exception);
}
__except(1)
{
}
}
-void BinariesCheckThread::checkBinaries2(volatile bool &success, const SysinfoModel *const sysinfo, volatile bool *exception)
+void BinariesCheckThread::checkBinaries2(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo, volatile bool *exception)
{
try
{
- return checkBinaries3(success, sysinfo);
+ return checkBinaries3(success, failedPath, sysinfo);
}
catch(...)
{
}
}
-void BinariesCheckThread::checkBinaries3(volatile bool &success, const SysinfoModel *const sysinfo)
+void BinariesCheckThread::checkBinaries3(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo)
{
success = true;
{
if (!MUtils::OS::is_executable_file(file->fileName()))
{
+ failedPath = file->fileName();
success = false;
qWarning("Required tool does NOT look like a valid Win32/Win64 binary:\n%s\n", MUTILS_UTF8(file->fileName()));
return;
{
if (!MUtils::OS::is_library_file(file->fileName()))
{
+ failedPath = file->fileName();
success = false;
qWarning("Required tool does NOT look like a valid Win32/Win64 library:\n%s\n", MUTILS_UTF8(file->fileName()));
return;
}
else
{
+ failedPath = file->fileName();
success = false;
qWarning("Required tool could not be found or access denied:\n%s\n", MUTILS_UTF8(file->fileName()));
return;
Q_OBJECT
public:
- static bool check(SysinfoModel *sysinfo);
+ static bool check(const SysinfoModel *const sysinfo, QString *const failedPath = NULL);
protected:
BinariesCheckThread(const SysinfoModel *const sysinfo);
~BinariesCheckThread(void);
- int getSuccess(void) { return m_success; }
+ int getSuccess(void) { return m_success; }
bool getException(void) { return m_exception; }
+
+ const QString& getFailedPath(void) { return m_failedPath; }
private slots:
void start(Priority priority = InheritPriority) { QThread::start(priority); }
private:
- volatile bool m_exception;
- volatile bool m_success;
+ volatile bool m_exception, m_success;
+ QString m_failedPath;
const SysinfoModel *const m_sysinfo;
static const size_t MAX_BINARIES = 32;
virtual void run(void);
//Functions
- static void checkBinaries1(volatile bool &success, const SysinfoModel *const sysinfo, volatile bool *exception);
- static void checkBinaries2(volatile bool &success, const SysinfoModel *const sysinfo, volatile bool *exception);
- static void checkBinaries3(volatile bool &success, const SysinfoModel *const sysinfo);
+ static void checkBinaries1(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo, volatile bool *exception);
+ static void checkBinaries2(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo, volatile bool *exception);
+ static void checkBinaries3(volatile bool &success, QString &failedPath, const SysinfoModel *const sysinfo);
};
#include <QFileDialog>
#include <QSystemTrayIcon>
#include <QMovie>
-
+#include <QTextDocument>
#include <ctime>
//Constants
//---------------------------------------
qDebug("[Validating binaries]");
- if(!BinariesCheckThread::check(m_sysinfo.data()))
+ QString failedPath;
+ if(!BinariesCheckThread::check(m_sysinfo.data(), &failedPath))
{
- QMessageBox::critical(this, tr("Invalid File!"), tr("<nobr>At least one tool is missing or is not a valid Win32/Win64 binary.<br>Please re-install the program in order to fix the problem!</nobr>").replace("-", "−"));
- qFatal("At least one tool is missing or is not a valid Win32/Win64 binary!");
+ QMessageBox::critical(this, tr("Invalid File!"), tr("<nobr>At least one tool is missing or is not a valid Win32/Win64 binary:</nobr><br><tt>%1</tt><br><br><nobr>Please re-install the program in order to fix the problem!</nobr>").replace("-", "−").arg(Qt::escape(QDir::toNativeSeparators(failedPath))));
+ qFatal("At least one tool is missing or is not a valid Win32/Win64 binary. Program will exit now!");
}
qDebug(" ");