Turned more global objects into pointers in order to allow late initialization. Also slightly restructured the global locks and added another global lock to guard the IPC struct.
This commit is contained in:
parent
2cb3ec7719
commit
eb88a05341
@ -30,7 +30,7 @@
|
|||||||
#define VER_LAMEXP_MINOR_LO 5
|
#define VER_LAMEXP_MINOR_LO 5
|
||||||
#define VER_LAMEXP_TYPE Beta
|
#define VER_LAMEXP_TYPE Beta
|
||||||
#define VER_LAMEXP_PATCH 4
|
#define VER_LAMEXP_PATCH 4
|
||||||
#define VER_LAMEXP_BUILD 1087
|
#define VER_LAMEXP_BUILD 1089
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Tool versions (minimum expected versions!)
|
// Tool versions (minimum expected versions!)
|
||||||
|
237
src/Global.cpp
237
src/Global.cpp
@ -86,6 +86,8 @@ Q_IMPORT_PLUGIN(QICOPlugin)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LAMEXP_ZERO_MEMORY(X) SecureZeroMemory(&X, sizeof(X))
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// TYPES
|
// TYPES
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -201,8 +203,8 @@ static const unsigned int g_lamexp_toolver_coreaudio = VER_LAMEXP_TOOL_COREAUDIO
|
|||||||
//Special folders
|
//Special folders
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
QString temp;
|
QString *temp;
|
||||||
QString knownFolders[3];
|
QMap<size_t, QString> *knownFolders;
|
||||||
QReadWriteLock lock;
|
QReadWriteLock lock;
|
||||||
}
|
}
|
||||||
g_lamexp_folder;
|
g_lamexp_folder;
|
||||||
@ -210,8 +212,8 @@ g_lamexp_folder;
|
|||||||
//Tools
|
//Tools
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
QMap<QString, LockedFile*> registry;
|
QMap<QString, LockedFile*> *registry;
|
||||||
QMap<QString, unsigned int> versions;
|
QMap<QString, unsigned int> *versions;
|
||||||
QReadWriteLock lock;
|
QReadWriteLock lock;
|
||||||
}
|
}
|
||||||
g_lamexp_tools;
|
g_lamexp_tools;
|
||||||
@ -219,10 +221,10 @@ g_lamexp_tools;
|
|||||||
//Languages
|
//Languages
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
QMap<QString, QString> files;
|
QMap<QString, QString> *files;
|
||||||
QMap<QString, QString> names;
|
QMap<QString, QString> *names;
|
||||||
QMap<QString, unsigned int> sysid;
|
QMap<QString, unsigned int> *sysid;
|
||||||
QMap<QString, unsigned int> cntry;
|
QMap<QString, unsigned int> *cntry;
|
||||||
QReadWriteLock lock;
|
QReadWriteLock lock;
|
||||||
}
|
}
|
||||||
g_lamexp_translation;
|
g_lamexp_translation;
|
||||||
@ -230,11 +232,19 @@ g_lamexp_translation;
|
|||||||
//Translator
|
//Translator
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
QVariant instance;
|
QTranslator *instance;
|
||||||
QReadWriteLock lock;
|
QReadWriteLock lock;
|
||||||
}
|
}
|
||||||
g_lamexp_currentTranslator;
|
g_lamexp_currentTranslator;
|
||||||
|
|
||||||
|
//CLI Arguments
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
QStringList *list;
|
||||||
|
QReadWriteLock lock;
|
||||||
|
}
|
||||||
|
g_lamexp_argv;
|
||||||
|
|
||||||
//Shared memory
|
//Shared memory
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
@ -259,11 +269,9 @@ static struct
|
|||||||
QSystemSemaphore *semaphore_read_mutex;
|
QSystemSemaphore *semaphore_read_mutex;
|
||||||
QSystemSemaphore *semaphore_write;
|
QSystemSemaphore *semaphore_write;
|
||||||
QSystemSemaphore *semaphore_write_mutex;
|
QSystemSemaphore *semaphore_write_mutex;
|
||||||
|
QReadWriteLock lock;
|
||||||
}
|
}
|
||||||
g_lamexp_ipc_ptr =
|
g_lamexp_ipc_ptr;
|
||||||
{
|
|
||||||
NULL, NULL, NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
//Image formats
|
//Image formats
|
||||||
static const char *g_lamexp_imageformats[] = {"bmp", "png", "jpg", "gif", "ico", "xpm", NULL}; //"svg"
|
static const char *g_lamexp_imageformats[] = {"bmp", "png", "jpg", "gif", "ico", "xpm", NULL}; //"svg"
|
||||||
@ -277,14 +285,6 @@ static const DWORD g_main_thread_id = GetCurrentThreadId();
|
|||||||
//Log file
|
//Log file
|
||||||
static FILE *g_lamexp_log_file = NULL;
|
static FILE *g_lamexp_log_file = NULL;
|
||||||
|
|
||||||
//CLI Arguments
|
|
||||||
static struct
|
|
||||||
{
|
|
||||||
QStringList list;
|
|
||||||
QReadWriteLock lock;
|
|
||||||
}
|
|
||||||
g_lamexp_argv;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// GLOBAL FUNCTIONS
|
// GLOBAL FUNCTIONS
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1182,8 +1182,10 @@ bool lamexp_init_qt(int argc, char* argv[])
|
|||||||
|
|
||||||
//Add default translations
|
//Add default translations
|
||||||
QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
|
QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
|
||||||
g_lamexp_translation.files.insert(LAMEXP_DEFAULT_LANGID, "");
|
if(!g_lamexp_translation.files) g_lamexp_translation.files = new QMap<QString, QString>();
|
||||||
g_lamexp_translation.names.insert(LAMEXP_DEFAULT_LANGID, "English");
|
if(!g_lamexp_translation.names) g_lamexp_translation.names = new QMap<QString, QString>();
|
||||||
|
g_lamexp_translation.files->insert(LAMEXP_DEFAULT_LANGID, "");
|
||||||
|
g_lamexp_translation.names->insert(LAMEXP_DEFAULT_LANGID, "English");
|
||||||
writeLockTranslations.unlock();
|
writeLockTranslations.unlock();
|
||||||
|
|
||||||
//Check for process elevation
|
//Check for process elevation
|
||||||
@ -1223,6 +1225,8 @@ bool lamexp_init_qt(int argc, char* argv[])
|
|||||||
*/
|
*/
|
||||||
int lamexp_init_ipc(void)
|
int lamexp_init_ipc(void)
|
||||||
{
|
{
|
||||||
|
QWriteLocker writeLock(&g_lamexp_ipc_ptr.lock);
|
||||||
|
|
||||||
if(g_lamexp_ipc_ptr.sharedmem && g_lamexp_ipc_ptr.semaphore_read && g_lamexp_ipc_ptr.semaphore_write && g_lamexp_ipc_ptr.semaphore_read_mutex && g_lamexp_ipc_ptr.semaphore_write_mutex)
|
if(g_lamexp_ipc_ptr.sharedmem && g_lamexp_ipc_ptr.semaphore_read && g_lamexp_ipc_ptr.semaphore_write && g_lamexp_ipc_ptr.semaphore_read_mutex && g_lamexp_ipc_ptr.semaphore_write_mutex)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -1315,6 +1319,8 @@ int lamexp_init_ipc(void)
|
|||||||
*/
|
*/
|
||||||
void lamexp_ipc_send(unsigned int command, const char* message)
|
void lamexp_ipc_send(unsigned int command, const char* message)
|
||||||
{
|
{
|
||||||
|
QReadLocker readLock(&g_lamexp_ipc_ptr.lock);
|
||||||
|
|
||||||
if(!g_lamexp_ipc_ptr.sharedmem || !g_lamexp_ipc_ptr.semaphore_read || !g_lamexp_ipc_ptr.semaphore_write || !g_lamexp_ipc_ptr.semaphore_read_mutex || !g_lamexp_ipc_ptr.semaphore_write_mutex)
|
if(!g_lamexp_ipc_ptr.sharedmem || !g_lamexp_ipc_ptr.semaphore_read || !g_lamexp_ipc_ptr.semaphore_write || !g_lamexp_ipc_ptr.semaphore_read_mutex || !g_lamexp_ipc_ptr.semaphore_write_mutex)
|
||||||
{
|
{
|
||||||
throw "Shared memory for IPC not initialized yet.";
|
throw "Shared memory for IPC not initialized yet.";
|
||||||
@ -1347,6 +1353,8 @@ void lamexp_ipc_send(unsigned int command, const char* message)
|
|||||||
*/
|
*/
|
||||||
void lamexp_ipc_read(unsigned int *command, char* message, size_t buffSize)
|
void lamexp_ipc_read(unsigned int *command, char* message, size_t buffSize)
|
||||||
{
|
{
|
||||||
|
QReadLocker readLock(&g_lamexp_ipc_ptr.lock);
|
||||||
|
|
||||||
*command = 0;
|
*command = 0;
|
||||||
message[0] = '\0';
|
message[0] = '\0';
|
||||||
|
|
||||||
@ -1416,17 +1424,26 @@ const QString &lamexp_temp_folder2(void)
|
|||||||
QReadLocker readLock(&g_lamexp_folder.lock);
|
QReadLocker readLock(&g_lamexp_folder.lock);
|
||||||
|
|
||||||
//Already initialized?
|
//Already initialized?
|
||||||
if(!g_lamexp_folder.temp.isEmpty())
|
if(g_lamexp_folder.temp)
|
||||||
{
|
{
|
||||||
if(QDir(g_lamexp_folder.temp).exists())
|
if(!g_lamexp_folder.temp->isEmpty())
|
||||||
{
|
{
|
||||||
return g_lamexp_folder.temp;
|
if(QDir(*g_lamexp_folder.temp).exists())
|
||||||
|
{
|
||||||
|
return *g_lamexp_folder.temp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readLock.unlock();
|
readLock.unlock();
|
||||||
QWriteLocker writeLock(&g_lamexp_folder.lock);
|
QWriteLocker writeLock(&g_lamexp_folder.lock);
|
||||||
g_lamexp_folder.temp.clear();
|
|
||||||
|
if(!g_lamexp_folder.temp)
|
||||||
|
{
|
||||||
|
g_lamexp_folder.temp = new QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
g_lamexp_folder.temp->clear();
|
||||||
|
|
||||||
static const char *TEMP_STR = "Temp";
|
static const char *TEMP_STR = "Temp";
|
||||||
const QString WRITE_TEST_DATA = lamexp_rand_str();
|
const QString WRITE_TEST_DATA = lamexp_rand_str();
|
||||||
@ -1444,14 +1461,14 @@ const QString &lamexp_temp_folder2(void)
|
|||||||
{
|
{
|
||||||
if(testFile.write(WRITE_TEST_DATA.toLatin1().constData()) >= strlen(WRITE_TEST_DATA.toLatin1().constData()))
|
if(testFile.write(WRITE_TEST_DATA.toLatin1().constData()) >= strlen(WRITE_TEST_DATA.toLatin1().constData()))
|
||||||
{
|
{
|
||||||
g_lamexp_folder.temp = temp.canonicalPath();
|
(*g_lamexp_folder.temp) = temp.canonicalPath();
|
||||||
}
|
}
|
||||||
testFile.remove();
|
testFile.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!g_lamexp_folder.temp.isEmpty())
|
if(!g_lamexp_folder.temp->isEmpty())
|
||||||
{
|
{
|
||||||
return g_lamexp_folder.temp;
|
return *g_lamexp_folder.temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1479,22 +1496,22 @@ const QString &lamexp_temp_folder2(void)
|
|||||||
{
|
{
|
||||||
if(testFile.write(WRITE_TEST_DATA.toLatin1().constData()) >= strlen(WRITE_TEST_DATA.toLatin1().constData()))
|
if(testFile.write(WRITE_TEST_DATA.toLatin1().constData()) >= strlen(WRITE_TEST_DATA.toLatin1().constData()))
|
||||||
{
|
{
|
||||||
g_lamexp_folder.temp = localAppData.canonicalPath();
|
(*g_lamexp_folder.temp) = localAppData.canonicalPath();
|
||||||
}
|
}
|
||||||
testFile.remove();
|
testFile.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!g_lamexp_folder.temp.isEmpty())
|
if(!g_lamexp_folder.temp->isEmpty())
|
||||||
{
|
{
|
||||||
return g_lamexp_folder.temp;
|
return *g_lamexp_folder.temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Failed to create TEMP folder!
|
//Failed to create TEMP folder!
|
||||||
qFatal("Temporary directory could not be initialized!\n\nFirst attempt:\n%s\n\nSecond attempt:\n%s", temp.canonicalPath().toUtf8().constData(), localAppData.canonicalPath().toUtf8().constData());
|
qFatal("Temporary directory could not be initialized!\n\nFirst attempt:\n%s\n\nSecond attempt:\n%s", temp.canonicalPath().toUtf8().constData(), localAppData.canonicalPath().toUtf8().constData());
|
||||||
return g_lamexp_folder.temp;
|
return *g_lamexp_folder.temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1534,13 +1551,16 @@ void lamexp_register_tool(const QString &toolName, LockedFile *file, unsigned in
|
|||||||
{
|
{
|
||||||
QWriteLocker writeLock(&g_lamexp_tools.lock);
|
QWriteLocker writeLock(&g_lamexp_tools.lock);
|
||||||
|
|
||||||
if(g_lamexp_tools.registry.contains(toolName.toLower()))
|
if(!g_lamexp_tools.registry) g_lamexp_tools.registry = new QMap<QString, LockedFile*>();
|
||||||
|
if(!g_lamexp_tools.versions) g_lamexp_tools.versions = new QMap<QString, unsigned int>();
|
||||||
|
|
||||||
|
if(g_lamexp_tools.registry->contains(toolName.toLower()))
|
||||||
{
|
{
|
||||||
throw "lamexp_register_tool: Tool is already registered!";
|
throw "lamexp_register_tool: Tool is already registered!";
|
||||||
}
|
}
|
||||||
|
|
||||||
g_lamexp_tools.registry.insert(toolName.toLower(), file);
|
g_lamexp_tools.registry->insert(toolName.toLower(), file);
|
||||||
g_lamexp_tools.versions.insert(toolName.toLower(), version);
|
g_lamexp_tools.versions->insert(toolName.toLower(), version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1549,7 +1569,7 @@ void lamexp_register_tool(const QString &toolName, LockedFile *file, unsigned in
|
|||||||
bool lamexp_check_tool(const QString &toolName)
|
bool lamexp_check_tool(const QString &toolName)
|
||||||
{
|
{
|
||||||
QReadLocker readLock(&g_lamexp_tools.lock);
|
QReadLocker readLock(&g_lamexp_tools.lock);
|
||||||
return g_lamexp_tools.registry.contains(toolName.toLower());
|
return (g_lamexp_tools.registry) ? g_lamexp_tools.registry->contains(toolName.toLower()) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1559,9 +1579,16 @@ const QString lamexp_lookup_tool(const QString &toolName)
|
|||||||
{
|
{
|
||||||
QReadLocker readLock(&g_lamexp_tools.lock);
|
QReadLocker readLock(&g_lamexp_tools.lock);
|
||||||
|
|
||||||
if(g_lamexp_tools.registry.contains(toolName.toLower()))
|
if(g_lamexp_tools.registry)
|
||||||
{
|
{
|
||||||
return g_lamexp_tools.registry.value(toolName.toLower())->filePath();
|
if(g_lamexp_tools.registry->contains(toolName.toLower()))
|
||||||
|
{
|
||||||
|
return g_lamexp_tools.registry->value(toolName.toLower())->filePath();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1576,9 +1603,16 @@ unsigned int lamexp_tool_version(const QString &toolName)
|
|||||||
{
|
{
|
||||||
QReadLocker readLock(&g_lamexp_tools.lock);
|
QReadLocker readLock(&g_lamexp_tools.lock);
|
||||||
|
|
||||||
if(g_lamexp_tools.versions.contains(toolName.toLower()))
|
if(g_lamexp_tools.versions)
|
||||||
{
|
{
|
||||||
return g_lamexp_tools.versions.value(toolName.toLower());
|
if(g_lamexp_tools.versions->contains(toolName.toLower()))
|
||||||
|
{
|
||||||
|
return g_lamexp_tools.versions->value(toolName.toLower());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return UINT_MAX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1629,10 +1663,15 @@ bool lamexp_translation_register(const QString &langId, const QString &qmFile, c
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_lamexp_translation.files.insert(langId, qmFile);
|
if(!g_lamexp_translation.files) g_lamexp_translation.files = new QMap<QString, QString>();
|
||||||
g_lamexp_translation.names.insert(langId, langName);
|
if(!g_lamexp_translation.names) g_lamexp_translation.names = new QMap<QString, QString>();
|
||||||
g_lamexp_translation.sysid.insert(langId, systemId);
|
if(!g_lamexp_translation.sysid) g_lamexp_translation.sysid = new QMap<QString, unsigned int>();
|
||||||
g_lamexp_translation.cntry.insert(langId, country);
|
if(!g_lamexp_translation.cntry) g_lamexp_translation.cntry = new QMap<QString, unsigned int>();
|
||||||
|
|
||||||
|
g_lamexp_translation.files->insert(langId, qmFile);
|
||||||
|
g_lamexp_translation.names->insert(langId, langName);
|
||||||
|
g_lamexp_translation.sysid->insert(langId, systemId);
|
||||||
|
g_lamexp_translation.cntry->insert(langId, country);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1642,8 +1681,8 @@ bool lamexp_translation_register(const QString &langId, const QString &qmFile, c
|
|||||||
*/
|
*/
|
||||||
QStringList lamexp_query_translations(void)
|
QStringList lamexp_query_translations(void)
|
||||||
{
|
{
|
||||||
QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
|
QReadLocker readLockTranslations(&g_lamexp_translation.lock);
|
||||||
return g_lamexp_translation.files.keys();
|
return (g_lamexp_translation.files) ? g_lamexp_translation.files->keys() : QStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1651,8 +1690,8 @@ QStringList lamexp_query_translations(void)
|
|||||||
*/
|
*/
|
||||||
QString lamexp_translation_name(const QString &langId)
|
QString lamexp_translation_name(const QString &langId)
|
||||||
{
|
{
|
||||||
QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
|
QReadLocker readLockTranslations(&g_lamexp_translation.lock);
|
||||||
return g_lamexp_translation.names.value(langId.toLower(), QString());
|
return (g_lamexp_translation.names) ? g_lamexp_translation.names->value(langId.toLower(), QString()) : QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1660,8 +1699,8 @@ QString lamexp_translation_name(const QString &langId)
|
|||||||
*/
|
*/
|
||||||
unsigned int lamexp_translation_sysid(const QString &langId)
|
unsigned int lamexp_translation_sysid(const QString &langId)
|
||||||
{
|
{
|
||||||
QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
|
QReadLocker readLockTranslations(&g_lamexp_translation.lock);
|
||||||
return g_lamexp_translation.sysid.value(langId.toLower(), 0);
|
return (g_lamexp_translation.sysid) ? g_lamexp_translation.sysid->value(langId.toLower(), 0) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1669,8 +1708,8 @@ unsigned int lamexp_translation_sysid(const QString &langId)
|
|||||||
*/
|
*/
|
||||||
unsigned int lamexp_translation_country(const QString &langId)
|
unsigned int lamexp_translation_country(const QString &langId)
|
||||||
{
|
{
|
||||||
QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
|
QReadLocker readLockTranslations(&g_lamexp_translation.lock);
|
||||||
return g_lamexp_translation.cntry.value(langId.toLower(), 0);
|
return (g_lamexp_translation.cntry) ? g_lamexp_translation.cntry->value(langId.toLower(), 0) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1687,7 +1726,9 @@ bool lamexp_install_translator(const QString &langId)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
QReadLocker readLock(&g_lamexp_translation.lock);
|
QReadLocker readLock(&g_lamexp_translation.lock);
|
||||||
QString qmFile = g_lamexp_translation.files.value(langId.toLower(), QString());
|
QString qmFile = (g_lamexp_translation.files) ? g_lamexp_translation.files->value(langId.toLower(), QString()) : QString();
|
||||||
|
readLock.unlock();
|
||||||
|
|
||||||
if(!qmFile.isEmpty())
|
if(!qmFile.isEmpty())
|
||||||
{
|
{
|
||||||
success = lamexp_install_translator_from_file(QString(":/localization/%1").arg(qmFile));
|
success = lamexp_install_translator_from_file(QString(":/localization/%1").arg(qmFile));
|
||||||
@ -1709,19 +1750,18 @@ bool lamexp_install_translator_from_file(const QString &qmFile)
|
|||||||
QWriteLocker writeLock(&g_lamexp_currentTranslator.lock);
|
QWriteLocker writeLock(&g_lamexp_currentTranslator.lock);
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
if(!g_lamexp_currentTranslator.instance.isValid())
|
if(!g_lamexp_currentTranslator.instance)
|
||||||
{
|
{
|
||||||
g_lamexp_currentTranslator.instance.setValue<QObject*>(new QTranslator());
|
g_lamexp_currentTranslator.instance = new QTranslator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!qmFile.isEmpty())
|
if(!qmFile.isEmpty())
|
||||||
{
|
{
|
||||||
QString qmPath = QFileInfo(qmFile).canonicalFilePath();
|
QString qmPath = QFileInfo(qmFile).canonicalFilePath();
|
||||||
QTranslator *poTranslator = dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>());
|
QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
|
||||||
QApplication::removeTranslator(poTranslator);
|
if(success = g_lamexp_currentTranslator.instance->load(qmPath))
|
||||||
if(success = poTranslator->load(qmPath))
|
|
||||||
{
|
{
|
||||||
QApplication::installTranslator(poTranslator);
|
QApplication::installTranslator(g_lamexp_currentTranslator.instance);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1730,7 +1770,7 @@ bool lamexp_install_translator_from_file(const QString &qmFile)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QApplication::removeTranslator(dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>()));
|
QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1741,11 +1781,13 @@ const QStringList &lamexp_arguments(void)
|
|||||||
{
|
{
|
||||||
QReadLocker readLock(&g_lamexp_argv.lock);
|
QReadLocker readLock(&g_lamexp_argv.lock);
|
||||||
|
|
||||||
if(g_lamexp_argv.list.isEmpty())
|
if(!g_lamexp_argv.list)
|
||||||
{
|
{
|
||||||
readLock.unlock();
|
readLock.unlock();
|
||||||
QWriteLocker writeLock(&g_lamexp_argv.lock);
|
QWriteLocker writeLock(&g_lamexp_argv.lock);
|
||||||
|
|
||||||
|
g_lamexp_argv.list = new QStringList;
|
||||||
|
|
||||||
int nArgs = 0;
|
int nArgs = 0;
|
||||||
LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
|
LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
|
||||||
|
|
||||||
@ -1753,7 +1795,7 @@ const QStringList &lamexp_arguments(void)
|
|||||||
{
|
{
|
||||||
for(int i = 0; i < nArgs; i++)
|
for(int i = 0; i < nArgs; i++)
|
||||||
{
|
{
|
||||||
g_lamexp_argv.list << WCHAR2QSTR(szArglist[i]);
|
(*g_lamexp_argv.list) << WCHAR2QSTR(szArglist[i]);
|
||||||
}
|
}
|
||||||
LocalFree(szArglist);
|
LocalFree(szArglist);
|
||||||
}
|
}
|
||||||
@ -1763,7 +1805,7 @@ const QStringList &lamexp_arguments(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_lamexp_argv.list;
|
return (*g_lamexp_argv.list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1812,9 +1854,12 @@ QString lamexp_known_folder(lamexp_known_folder_t folder_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Already in cache?
|
//Already in cache?
|
||||||
if(!g_lamexp_folder.knownFolders[folderCacheId].isEmpty())
|
if(g_lamexp_folder.knownFolders)
|
||||||
{
|
{
|
||||||
return g_lamexp_folder.knownFolders[folderCacheId];
|
if(g_lamexp_folder.knownFolders->contains(folderCacheId))
|
||||||
|
{
|
||||||
|
return g_lamexp_folder.knownFolders->value(folderCacheId, QString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readLock.unlock();
|
readLock.unlock();
|
||||||
@ -1875,7 +1920,8 @@ QString lamexp_known_folder(lamexp_known_folder_t folder_id)
|
|||||||
//Update cache
|
//Update cache
|
||||||
if(!folder.isEmpty())
|
if(!folder.isEmpty())
|
||||||
{
|
{
|
||||||
g_lamexp_folder.knownFolders[folderCacheId] = folder;
|
if(!g_lamexp_folder.knownFolders) g_lamexp_folder.knownFolders = new QMap<size_t, QString>();
|
||||||
|
g_lamexp_folder.knownFolders->insert(folderCacheId, folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
return folder;
|
return folder;
|
||||||
@ -2144,6 +2190,15 @@ extern "C"
|
|||||||
FatalAppExit(0, L"Not a debug build. Please unload debugger and try again!");
|
FatalAppExit(0, L"Not a debug build. Please unload debugger and try again!");
|
||||||
TerminateProcess(GetCurrentProcess(), -1);
|
TerminateProcess(GetCurrentProcess(), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Init global structs to NULL *before* constructors are called
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_argv);
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_tools);
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_currentTranslator);
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_translation);
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_folder);
|
||||||
|
LAMEXP_ZERO_MEMORY(g_lamexp_ipc_ptr);
|
||||||
|
|
||||||
return WinMainCRTStartup();
|
return WinMainCRTStartup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2156,43 +2211,47 @@ void lamexp_finalization(void)
|
|||||||
qDebug("lamexp_finalization()");
|
qDebug("lamexp_finalization()");
|
||||||
|
|
||||||
//Free all tools
|
//Free all tools
|
||||||
if(!g_lamexp_tools.registry.isEmpty())
|
if(g_lamexp_tools.registry)
|
||||||
{
|
{
|
||||||
QStringList keys = g_lamexp_tools.registry.keys();
|
QStringList keys = g_lamexp_tools.registry->keys();
|
||||||
for(int i = 0; i < keys.count(); i++)
|
for(int i = 0; i < keys.count(); i++)
|
||||||
{
|
{
|
||||||
LAMEXP_DELETE(g_lamexp_tools.registry[keys.at(i)]);
|
LAMEXP_DELETE((*g_lamexp_tools.registry)[keys.at(i)]);
|
||||||
}
|
}
|
||||||
g_lamexp_tools.registry.clear();
|
LAMEXP_DELETE(g_lamexp_tools.registry);
|
||||||
g_lamexp_tools.versions.clear();
|
LAMEXP_DELETE(g_lamexp_tools.versions);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Delete temporary files
|
//Delete temporary files
|
||||||
if(!g_lamexp_folder.temp.isEmpty())
|
if(g_lamexp_folder.temp)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 100; i++)
|
if(!g_lamexp_folder.temp->isEmpty())
|
||||||
{
|
{
|
||||||
if(lamexp_clean_folder(g_lamexp_folder.temp))
|
for(int i = 0; i < 100; i++)
|
||||||
{
|
{
|
||||||
break;
|
if(lamexp_clean_folder(*g_lamexp_folder.temp))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Sleep(125);
|
||||||
}
|
}
|
||||||
Sleep(125);
|
|
||||||
}
|
}
|
||||||
g_lamexp_folder.temp.clear();
|
LAMEXP_DELETE(g_lamexp_folder.temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Clear folder cache
|
||||||
|
LAMEXP_DELETE(g_lamexp_folder.knownFolders);
|
||||||
|
|
||||||
//Clear languages
|
//Clear languages
|
||||||
if(g_lamexp_currentTranslator.instance.isValid())
|
if(g_lamexp_currentTranslator.instance)
|
||||||
{
|
{
|
||||||
QTranslator *poTranslator = dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>());
|
QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
|
||||||
g_lamexp_currentTranslator.instance.clear();
|
LAMEXP_DELETE(g_lamexp_currentTranslator.instance);
|
||||||
QApplication::removeTranslator(poTranslator);
|
|
||||||
LAMEXP_DELETE(poTranslator);
|
|
||||||
}
|
}
|
||||||
g_lamexp_translation.files.clear();
|
LAMEXP_DELETE(g_lamexp_translation.files);
|
||||||
g_lamexp_translation.names.clear();
|
LAMEXP_DELETE(g_lamexp_translation.names);
|
||||||
g_lamexp_translation.cntry.clear();
|
LAMEXP_DELETE(g_lamexp_translation.cntry);
|
||||||
g_lamexp_translation.sysid.clear();
|
LAMEXP_DELETE(g_lamexp_translation.sysid);
|
||||||
|
|
||||||
//Destroy Qt application object
|
//Destroy Qt application object
|
||||||
QApplication *application = dynamic_cast<QApplication*>(QApplication::instance());
|
QApplication *application = dynamic_cast<QApplication*>(QApplication::instance());
|
||||||
@ -2229,7 +2288,7 @@ void lamexp_finalization(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Free CLI Arguments
|
//Free CLI Arguments
|
||||||
g_lamexp_argv.list.clear();
|
LAMEXP_DELETE(g_lamexp_argv.list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user