#endif
#endif
+#define LAMEXP_ZERO_MEMORY(X) SecureZeroMemory(&X, sizeof(X))
+
///////////////////////////////////////////////////////////////////////////////
// TYPES
///////////////////////////////////////////////////////////////////////////////
//Special folders
static struct
{
- QString temp;
- QString knownFolders[3];
+ QString *temp;
+ QMap<size_t, QString> *knownFolders;
QReadWriteLock lock;
}
g_lamexp_folder;
//Tools
static struct
{
- QMap<QString, LockedFile*> registry;
- QMap<QString, unsigned int> versions;
+ QMap<QString, LockedFile*> *registry;
+ QMap<QString, unsigned int> *versions;
QReadWriteLock lock;
}
g_lamexp_tools;
//Languages
static struct
{
- QMap<QString, QString> files;
- QMap<QString, QString> names;
- QMap<QString, unsigned int> sysid;
- QMap<QString, unsigned int> cntry;
+ QMap<QString, QString> *files;
+ QMap<QString, QString> *names;
+ QMap<QString, unsigned int> *sysid;
+ QMap<QString, unsigned int> *cntry;
QReadWriteLock lock;
}
g_lamexp_translation;
//Translator
static struct
{
- QVariant instance;
+ QTranslator *instance;
QReadWriteLock lock;
}
g_lamexp_currentTranslator;
+//CLI Arguments
+static struct
+{
+ QStringList *list;
+ QReadWriteLock lock;
+}
+g_lamexp_argv;
+
//Shared memory
static const struct
{
QSystemSemaphore *semaphore_read_mutex;
QSystemSemaphore *semaphore_write;
QSystemSemaphore *semaphore_write_mutex;
+ QReadWriteLock lock;
}
-g_lamexp_ipc_ptr =
-{
- NULL, NULL, NULL
-};
+g_lamexp_ipc_ptr;
//Image formats
static const char *g_lamexp_imageformats[] = {"bmp", "png", "jpg", "gif", "ico", "xpm", NULL}; //"svg"
//Log file
static FILE *g_lamexp_log_file = NULL;
-//CLI Arguments
-static struct
-{
- QStringList list;
- QReadWriteLock lock;
-}
-g_lamexp_argv;
-
///////////////////////////////////////////////////////////////////////////////
// GLOBAL FUNCTIONS
///////////////////////////////////////////////////////////////////////////////
//Add default translations
QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
- g_lamexp_translation.files.insert(LAMEXP_DEFAULT_LANGID, "");
- g_lamexp_translation.names.insert(LAMEXP_DEFAULT_LANGID, "English");
+ if(!g_lamexp_translation.files) g_lamexp_translation.files = new QMap<QString, QString>();
+ 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();
//Check for process elevation
*/
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)
{
return 0;
*/
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)
{
throw "Shared memory for IPC not initialized yet.";
*/
void lamexp_ipc_read(unsigned int *command, char* message, size_t buffSize)
{
+ QReadLocker readLock(&g_lamexp_ipc_ptr.lock);
+
*command = 0;
message[0] = '\0';
QReadLocker readLock(&g_lamexp_folder.lock);
//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();
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";
const QString WRITE_TEST_DATA = lamexp_rand_str();
{
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();
}
}
- if(!g_lamexp_folder.temp.isEmpty())
+ if(!g_lamexp_folder.temp->isEmpty())
{
- return g_lamexp_folder.temp;
+ return *g_lamexp_folder.temp;
}
}
{
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();
}
}
}
}
- 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!
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;
}
/*
{
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!";
}
- g_lamexp_tools.registry.insert(toolName.toLower(), file);
- g_lamexp_tools.versions.insert(toolName.toLower(), version);
+ g_lamexp_tools.registry->insert(toolName.toLower(), file);
+ g_lamexp_tools.versions->insert(toolName.toLower(), version);
}
/*
bool lamexp_check_tool(const QString &toolName)
{
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;
}
/*
{
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
{
{
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
{
return false;
}
- 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);
+ if(!g_lamexp_translation.files) g_lamexp_translation.files = new QMap<QString, QString>();
+ if(!g_lamexp_translation.names) g_lamexp_translation.names = new QMap<QString, QString>();
+ if(!g_lamexp_translation.sysid) g_lamexp_translation.sysid = new QMap<QString, unsigned int>();
+ 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;
}
*/
QStringList lamexp_query_translations(void)
{
- QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
- return g_lamexp_translation.files.keys();
+ QReadLocker readLockTranslations(&g_lamexp_translation.lock);
+ return (g_lamexp_translation.files) ? g_lamexp_translation.files->keys() : QStringList();
}
/*
*/
QString lamexp_translation_name(const QString &langId)
{
- QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
- return g_lamexp_translation.names.value(langId.toLower(), QString());
+ QReadLocker readLockTranslations(&g_lamexp_translation.lock);
+ return (g_lamexp_translation.names) ? g_lamexp_translation.names->value(langId.toLower(), QString()) : QString();
}
/*
*/
unsigned int lamexp_translation_sysid(const QString &langId)
{
- QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
- return g_lamexp_translation.sysid.value(langId.toLower(), 0);
+ QReadLocker readLockTranslations(&g_lamexp_translation.lock);
+ return (g_lamexp_translation.sysid) ? g_lamexp_translation.sysid->value(langId.toLower(), 0) : 0;
}
/*
*/
unsigned int lamexp_translation_country(const QString &langId)
{
- QReadLocker writeLockTranslations(&g_lamexp_translation.lock);
- return g_lamexp_translation.cntry.value(langId.toLower(), 0);
+ QReadLocker readLockTranslations(&g_lamexp_translation.lock);
+ return (g_lamexp_translation.cntry) ? g_lamexp_translation.cntry->value(langId.toLower(), 0) : 0;
}
/*
else
{
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())
{
success = lamexp_install_translator_from_file(QString(":/localization/%1").arg(qmFile));
QWriteLocker writeLock(&g_lamexp_currentTranslator.lock);
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())
{
QString qmPath = QFileInfo(qmFile).canonicalFilePath();
- QTranslator *poTranslator = dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>());
- QApplication::removeTranslator(poTranslator);
- if(success = poTranslator->load(qmPath))
+ QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
+ if(success = g_lamexp_currentTranslator.instance->load(qmPath))
{
- QApplication::installTranslator(poTranslator);
+ QApplication::installTranslator(g_lamexp_currentTranslator.instance);
}
else
{
}
else
{
- QApplication::removeTranslator(dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>()));
+ QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
success = true;
}
const QStringList &lamexp_arguments(void)
{
QReadLocker readLock(&g_lamexp_argv.lock);
-
- if(g_lamexp_argv.list.isEmpty())
+
+ if(!g_lamexp_argv.list)
{
readLock.unlock();
QWriteLocker writeLock(&g_lamexp_argv.lock);
+ g_lamexp_argv.list = new QStringList;
+
int nArgs = 0;
LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
{
for(int i = 0; i < nArgs; i++)
{
- g_lamexp_argv.list << WCHAR2QSTR(szArglist[i]);
+ (*g_lamexp_argv.list) << WCHAR2QSTR(szArglist[i]);
}
LocalFree(szArglist);
}
}
}
- return g_lamexp_argv.list;
+ return (*g_lamexp_argv.list);
}
/*
}
//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();
//Update cache
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;
FatalAppExit(0, L"Not a debug build. Please unload debugger and try again!");
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();
}
}
qDebug("lamexp_finalization()");
//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++)
{
- LAMEXP_DELETE(g_lamexp_tools.registry[keys.at(i)]);
+ LAMEXP_DELETE((*g_lamexp_tools.registry)[keys.at(i)]);
}
- g_lamexp_tools.registry.clear();
- g_lamexp_tools.versions.clear();
+ LAMEXP_DELETE(g_lamexp_tools.registry);
+ LAMEXP_DELETE(g_lamexp_tools.versions);
}
//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
- if(g_lamexp_currentTranslator.instance.isValid())
+ if(g_lamexp_currentTranslator.instance)
{
- QTranslator *poTranslator = dynamic_cast<QTranslator*>(g_lamexp_currentTranslator.instance.value<QObject*>());
- g_lamexp_currentTranslator.instance.clear();
- QApplication::removeTranslator(poTranslator);
- LAMEXP_DELETE(poTranslator);
+ QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
+ LAMEXP_DELETE(g_lamexp_currentTranslator.instance);
}
- g_lamexp_translation.files.clear();
- g_lamexp_translation.names.clear();
- g_lamexp_translation.cntry.clear();
- g_lamexp_translation.sysid.clear();
+ LAMEXP_DELETE(g_lamexp_translation.files);
+ LAMEXP_DELETE(g_lamexp_translation.names);
+ LAMEXP_DELETE(g_lamexp_translation.cntry);
+ LAMEXP_DELETE(g_lamexp_translation.sysid);
//Destroy Qt application object
QApplication *application = dynamic_cast<QApplication*>(QApplication::instance());
}
//Free CLI Arguments
- g_lamexp_argv.list.clear();
+ LAMEXP_DELETE(g_lamexp_argv.list);
}
/*