-/LameXP_*.user
-/LameXP_*.opensdf
-/LameXP_*.sdf
-/LameXP_*.suo
-/LameXP_*.ncb
-/LameXP_*.sln.docstates
+*.user
+*.opensdf
+*.sdf
+*.suo
+*.ncb
+*.docstates
+*.db
+*.old
+*.bak
+*.rar
+*.zip
/bin
-etc/Deployment/*.exe
-etc/Deployment/_postproc.bat
-etc/Deployment/buildenv.txt
-etc/Prerequisites/qt4_static/lib
-etc/Prerequisites/qt4_static/plugins
-etc/Prerequisites/qt4_static/bin
-etc/Prerequisites/*.old
-etc/Translation/*.ts.bak
+/etc/Addins
+/etc/Deployment/_postproc.bat
+/etc/Deployment/buildenv.txt
+/etc/Prerequisites/qt4_static/lib
+/etc/Prerequisites/qt4_static/plugins
+/etc/Prerequisites/qt4_static/bin
+/etc/Prerequisites/qt4_dll
+/etc/Prerequisites/keccak/ipch
+/etc/Prerequisites/keccak/obj
+/etc/Prerequisites/z_old
/ipch
/obj
-/src/Config.h.bak
-/tmp/MOC_*.cpp
-/tmp/QRC_*.cpp
-/tmp/UIC_*.h
-/gui/*.ui.bak*
-*.db
+/out
+/res/tools/old
+/tmp/*.cpp
+/tmp/*.h
#define VER_LAMEXP_MINOR_LO 1
#define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 1
-#define VER_LAMEXP_BUILD 1560
+#define VER_LAMEXP_BUILD 1562
#define VER_LAMEXP_CONFG 1558
///////////////////////////////////////////////////////////////////////////////
bool lamexp_enable_close_button(const QWidget *win, const bool bEnable = true);
bool lamexp_exec_shell(const QWidget *win, const QString &url, const bool explore = false);
bool lamexp_exec_shell(const QWidget *win, const QString &url, const QString ¶meters, const QString &directory, const bool explore = false);
-void lamexp_fatal_exit(const wchar_t* exitMessage, const wchar_t* errorBoxMessage = NULL);
+void lamexp_fatal_exit(const char* const errorMessage);
void lamexp_finalization(void);
unsigned __int64 lamexp_free_diskspace(const QString &path, bool *ok = NULL);
void lamexp_free_window_icon(lamexp_icon_t *icon);
throw std::runtime_error(_error_msg); \
} \
while(0)
+#define PRINT_ERROR(X, ...) do \
+{ \
+ fflush(stdout); \
+ fprintf(stderr, (X), __VA_ARGS__); \
+ fflush(stderr); \
+} \
+while(0)
//Memory check
#if LAMEXP_DEBUG
}
QString result = pattern;
- int digits = result.count("?", Qt::CaseInsensitive);
+ const int digits = result.count(QChar(L'?'), Qt::CaseInsensitive);
if(digits < 1)
{
return result;
}
- int pos = 0;
- QString versionStr = QString().sprintf(QString().sprintf("%%0%du", digits).toLatin1().constData(), version);
- int index = result.indexOf("?", Qt::CaseInsensitive);
+ int pos = 0, index = -1;
+ const QString versionStr = QString().sprintf("%0*u", digits, version);
+ Q_ASSERT(versionStr.length() == digits);
- while(index >= 0 && pos < versionStr.length())
+ while((index = result.indexOf(QChar(L'?'), Qt::CaseInsensitive)) >= 0)
{
result[index] = versionStr[pos++];
- index = result.indexOf("?", Qt::CaseInsensitive);
}
if(tag)
{
- result.replace(QChar('#'), *tag, Qt::CaseInsensitive);
+ if((index = result.indexOf(QChar(L'#'), Qt::CaseInsensitive)) >= 0)
+ {
+ result.remove(index, 1).insert(index, (*tag));
+ }
}
return result;
#include <QLibraryInfo>
#include <QMap>
#include <QMessageBox>
-#include <QMutex>
#include <QPlastiqueStyle>
#include <QProcess>
#include <QReadWriteLock>
typedef HRESULT (WINAPI *SHGetFolderPath_t)(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);
///////////////////////////////////////////////////////////////////////////////
+// CRITICAL SECTION
+///////////////////////////////////////////////////////////////////////////////
+
+/*
+ * wrapper for native Win32 critical sections
+ */
+class CriticalSection
+{
+public:
+ inline CriticalSection(void)
+ {
+ InitializeCriticalSection(&m_win32criticalSection);
+ }
+
+ inline ~CriticalSection(void)
+ {
+ DeleteCriticalSection(&m_win32criticalSection);
+ }
+
+ inline void enter(void)
+ {
+ EnterCriticalSection(&m_win32criticalSection);
+ }
+
+ inline bool tryEnter(void)
+ {
+ return TryEnterCriticalSection(&m_win32criticalSection);
+ }
+
+ inline void leave(void)
+ {
+ LeaveCriticalSection(&m_win32criticalSection);
+ }
+
+protected:
+ CRITICAL_SECTION m_win32criticalSection;
+};
+
+/*
+ * RAII-style critical section locker
+ */
+class CSLocker
+{
+public:
+ inline CSLocker(CriticalSection &criticalSection)
+ :
+ m_locked(false),
+ m_criticalSection(criticalSection)
+ {
+ m_criticalSection.enter();
+ m_locked = true;
+ }
+
+ inline ~CSLocker(void)
+ {
+ forceUnlock();
+ }
+
+ inline void forceUnlock(void)
+ {
+ if(m_locked)
+ {
+ m_criticalSection.leave();
+ m_locked = false;
+ }
+ }
+protected:
+ volatile bool m_locked;
+ CriticalSection &m_criticalSection;
+};
+
+///////////////////////////////////////////////////////////////////////////////
// GLOBAL VARS
///////////////////////////////////////////////////////////////////////////////
//Console attached flag
static bool g_lamexp_console_attached = false;
+//Fatal exit flags
+static volatile bool g_lamexp_fatal_flag = true;
+static CriticalSection g_lamexp_fatal_lock;
+
+//Global locks
+static CriticalSection g_lamexp_message_lock;
+
//Special folders
static struct
{
//Image formats
static const char *g_lamexp_imageformats[] = {"bmp", "png", "jpg", "gif", "ico", "xpm", NULL}; //"svg"
-//Global locks
-static QMutex g_lamexp_message_mutex;
-
//Main thread ID
static const DWORD g_main_thread_id = GetCurrentThreadId();
return;
}
- QMutexLocker lock(&g_lamexp_message_mutex);
+ CSLocker lock(g_lamexp_message_lock);
if(g_lamexp_log_file)
{
if((type == QtCriticalMsg) || (type == QtFatalMsg))
{
- lock.unlock();
- lamexp_fatal_exit(L"The application has encountered a critical error and will exit now!", QWCHAR(QString::fromUtf8(msg)));
+ lock.forceUnlock();
+ lamexp_fatal_exit(msg);
}
}
*/
static void lamexp_invalid_param_handler(const wchar_t* exp, const wchar_t* fun, const wchar_t* fil, unsigned int, uintptr_t)
{
- lamexp_fatal_exit(L"Invalid parameter handler invoked, application will exit!");
+ lamexp_fatal_exit("Invalid parameter handler invoked, application will exit!");
}
/*
static void lamexp_signal_handler(int signal_num)
{
signal(signal_num, lamexp_signal_handler);
- lamexp_fatal_exit(L"Signal handler invoked, application will exit!");
+ lamexp_fatal_exit("Signal handler invoked, application will exit!");
}
/*
*/
static LONG WINAPI lamexp_exception_handler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
- lamexp_fatal_exit(L"Unhandeled exception handler invoked, application will exit!");
+ lamexp_fatal_exit("Unhandeled exception handler invoked, application will exit!");
return LONG_MAX;
}
{
if(lamexp_check_for_debugger())
{
- lamexp_fatal_exit(L"Not a debug build. Please unload debugger and try again!");
+ lamexp_fatal_exit("Not a debug build. Please unload debugger and try again!");
return 666;
}
lamexp_sleep(100);
{
if(lamexp_check_for_debugger())
{
- lamexp_fatal_exit(L"Not a debug build. Please unload debugger and try again!");
+ lamexp_fatal_exit("Not a debug build. Please unload debugger and try again!");
}
const uintptr_t h = _beginthreadex(NULL, 0, lamexp_debug_thread_proc, NULL, 0, NULL);
return (HANDLE)(h^0xdeadbeef);
{
if((!(LAMEXP_DEBUG)) && lamexp_check_for_debugger())
{
- lamexp_fatal_exit(L"Not a debug build. Please unload debugger and try again!");
+ lamexp_fatal_exit("Not a debug build. Please unload debugger and try again!");
}
switch(reinterpret_cast<MSG*>(message)->message)
}
/*
+ * Fatal application exit - helper
+ */
+static DWORD WINAPI lamexp_fatal_exit_helper(LPVOID lpParameter)
+{
+ MessageBoxA(NULL, ((LPCSTR) lpParameter), "LameXP - Guru Meditation", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_TOPMOST | MB_SETFOREGROUND);
+ return 0;
+}
+
+/*
* Fatal application exit
*/
-#pragma intrinsic(_InterlockedExchange)
-void lamexp_fatal_exit(const wchar_t* exitMessage, const wchar_t* errorBoxMessage)
+void lamexp_fatal_exit(const char* const errorMessage)
{
- static volatile long bFatalFlag = 0L;
+ g_lamexp_fatal_lock.enter();
+
+ if(!g_lamexp_fatal_flag)
+ {
+ return; /*prevent recursive invocation*/
+ }
- if(_InterlockedExchange(&bFatalFlag, 1L) == 0L)
+ g_lamexp_fatal_flag = false;
+
+ if(g_main_thread_id != GetCurrentThreadId())
{
- if(GetCurrentThreadId() != g_main_thread_id)
- {
- HANDLE mainThread = OpenThread(THREAD_TERMINATE, FALSE, g_main_thread_id);
- if(mainThread) TerminateThread(mainThread, ULONG_MAX);
- }
-
- if(errorBoxMessage)
+ if(HANDLE hThreadMain = OpenThread(THREAD_SUSPEND_RESUME, FALSE, g_main_thread_id))
{
- MessageBoxW(NULL, errorBoxMessage, L"LameXP - GURU MEDITATION", MB_ICONERROR | MB_TOPMOST | MB_TASKMODAL);
+ SuspendThread(hThreadMain); /*stop main thread*/
}
+ }
- for(;;)
- {
- FatalAppExit(0, exitMessage);
- TerminateProcess(GetCurrentProcess(), -1);
- }
+ if(HANDLE hThread = CreateThread(NULL, 0, lamexp_fatal_exit_helper, (LPVOID) errorMessage, 0, NULL))
+ {
+ WaitForSingleObject(hThread, INFINITE);
}
- TerminateThread(GetCurrentThread(), -1);
- Sleep(INFINITE);
+ for(;;)
+ {
+ TerminateProcess(GetCurrentProcess(), 666);
+ }
}
/*
{
if((!LAMEXP_DEBUG) && lamexp_check_for_debugger())
{
- lamexp_fatal_exit(L"Not a debug build. Please unload debugger and try again!");
+ lamexp_fatal_exit("Not a debug build. Please unload debugger and try again!");
}
//Zero *before* constructors are called
volatile size_t retVal = 0xA199B5AF;
if(g_lamexp_entry_check_flag != 0x8761F64D)
{
- lamexp_fatal_exit(L"Application initialization has failed, take care!");
+ lamexp_fatal_exit("Application initialization has failed, take care!");
}
return retVal;
}
{
if(g_lamexp_entry_check_flag != 0x789E09B2)
{
- lamexp_fatal_exit(L"Application initialization has failed, take care!");
+ lamexp_fatal_exit("Application initialization has failed, take care!");
}
//Call global initialization functions
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
return iResult;
}
}
__except(1)
{
- fflush(stdout);
- fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnhandeled structured exception error!\n");
- lamexp_fatal_exit(L"Unhandeled structured exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnhandeled structured exception error!\n");
+ lamexp_fatal_exit("Unhandeled structured exception error, application will exit!");
}
}
}
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
while(m_semaphore.available()) m_semaphore.tryAcquire();
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
qDebug("Update checker thread completed.");
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
while(m_semaphore.available()) m_semaphore.tryAcquire();
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
}
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
}
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
}
}
catch(const std::exception &error)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
catch(...)
{
- fflush(stdout); fflush(stderr);
- fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
- lamexp_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+ PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+ lamexp_fatal_exit("Unhandeled C++ exception error, application will exit!");
}
while(m_semaphore.available()) m_semaphore.tryAcquire();