///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2014 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
#include "Global.h"
+//LameXP includes
+#include "LockedFile.h"
+
//Qt includes
#include <QApplication>
-#include <QMap>
+#include <QHash>
#include <QReadWriteLock>
-#include <QReadLocker>
-#include <QWriteLocker>
#include <QString>
#include <QStringList>
-#include <QTranslator>
#include <QFileInfo>
+#include <QPair>
-//LameXP includes
-#include "LockedFile.h"
+//MUtils
+#include <MUtils/Global.h>
+#include <MUtils/Exception.h>
+
+//CRT
+#include <stdint.h>
///////////////////////////////////////////////////////////////////////////////
// GLOBAL VARS
///////////////////////////////////////////////////////////////////////////////
-//Tools
-static struct
-{
- QMap<QString, LockedFile*> *registry;
- QMap<QString, unsigned int> *versions;
- QMap<QString, QString> *tags;
- QReadWriteLock lock;
-}
-g_lamexp_tools;
+//Typedef
+typedef QPair<quint32,QString> tool_info_t;
+typedef QPair<LockedFile*, tool_info_t> tool_data_t;
+typedef QHash<QString, tool_data_t> tool_hash_t;
-//Supported languages
-static struct
-{
- QMap<QString, QString> *files;
- QMap<QString, QString> *names;
- QMap<QString, unsigned int> *sysid;
- QMap<QString, unsigned int> *cntry;
- QReadWriteLock lock;
-}
-g_lamexp_translation;
+//Tool registry
+static QScopedPointer<tool_hash_t> g_lamexp_tools_data;
+static QReadWriteLock g_lamexp_tools_lock;
-//Translator
-static struct
-{
- QTranslator *instance;
- QReadWriteLock lock;
-}
-g_lamexp_currentTranslator;
+//Null String
+static const QString g_null_string;
+
+//UINT_MAX
+static const quint32 g_max_uint32 = UINT32_MAX;
+
+//Helper Macro
+#define MAKE_ENTRY(LOCK_FILE,VER,TAG) \
+ qMakePair((LOCK_FILE),qMakePair((VER),(TAG)))
///////////////////////////////////////////////////////////////////////////////
// GLOBAL FUNCTIONS
///////////////////////////////////////////////////////////////////////////////
/*
- * Register tool
- */
-void lamexp_register_tool(const QString &toolName, LockedFile *file, unsigned int version, const QString *tag)
-{
- QWriteLocker writeLock(&g_lamexp_tools.lock);
-
- 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.tags) g_lamexp_tools.tags = new QMap<QString, QString>();
-
- 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.tags->insert(toolName.toLower(), (tag) ? (*tag) : QString());
-}
-
-/*
- * Check for tool
- */
-bool lamexp_check_tool(const QString &toolName)
-{
- QReadLocker readLock(&g_lamexp_tools.lock);
- return (g_lamexp_tools.registry) ? g_lamexp_tools.registry->contains(toolName.toLower()) : false;
-}
-
-/*
- * Lookup tool path
- */
-const QString lamexp_lookup_tool(const QString &toolName)
-{
- QReadLocker readLock(&g_lamexp_tools.lock);
-
- if(g_lamexp_tools.registry)
- {
- if(g_lamexp_tools.registry->contains(toolName.toLower()))
- {
- return g_lamexp_tools.registry->value(toolName.toLower())->filePath();
- }
- else
- {
- return QString();
- }
- }
- else
- {
- return QString();
- }
-}
-
-/*
- * Lookup tool version
+ * Clean-up *all* registered tools
*/
-unsigned int lamexp_tool_version(const QString &toolName, QString *tag)
+static void lamexp_tools_clean_up(void)
{
- QReadLocker readLock(&g_lamexp_tools.lock);
- if(tag) tag->clear();
+ QWriteLocker writeLock(&g_lamexp_tools_lock);
- if(g_lamexp_tools.versions)
+ if(!g_lamexp_tools_data.isNull())
{
- if(g_lamexp_tools.versions->contains(toolName.toLower()))
- {
- if(tag)
- {
- if(g_lamexp_tools.tags->contains(toolName.toLower())) *tag = g_lamexp_tools.tags->value(toolName.toLower());
- }
- return g_lamexp_tools.versions->value(toolName.toLower());
- }
- else
+ const QStringList keys = g_lamexp_tools_data->keys();
+ for(QStringList::ConstIterator iter = keys.constBegin(); iter != keys.constEnd(); iter++)
{
- return UINT_MAX;
+ tool_data_t currentTool = (*g_lamexp_tools_data)[*iter];
+ MUTILS_DELETE(currentTool.first);
}
- }
- else
- {
- return UINT_MAX;
+ g_lamexp_tools_data->clear();
}
}
/*
- * Version number to human-readable string
+ * Register tool
*/
-const QString lamexp_version2string(const QString &pattern, unsigned int version, const QString &defaultText, const QString *tag)
+void lamexp_tools_register(const QString &toolName, LockedFile *const file, const quint32 &version, const QString &tag)
{
- if(version == UINT_MAX)
- {
- return defaultText;
- }
+ QWriteLocker writeLock(&g_lamexp_tools_lock);
- QString result = pattern;
- int digits = result.count("?", 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);
-
- while(index >= 0 && pos < versionStr.length())
+ if(g_lamexp_tools_data.isNull())
{
- result[index] = versionStr[pos++];
- index = result.indexOf("?", Qt::CaseInsensitive);
+ g_lamexp_tools_data.reset(new tool_hash_t());
+ atexit(lamexp_tools_clean_up);
}
- if(tag)
+ const QString key = toolName.simplified().toLower();
+ if(g_lamexp_tools_data->contains(key))
{
- result.replace(QChar('#'), *tag, Qt::CaseInsensitive);
+ MUTILS_THROW("lamexp_register_tool: Tool is already registered!");
}
- return result;
-}
-
-/*
- * Initialize translations and add default language
- */
-bool lamexp_translation_init(void)
-{
- QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
-
- if((!g_lamexp_translation.files) && (!g_lamexp_translation.names))
- {
- g_lamexp_translation.files = new QMap<QString, QString>();
- 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");
- return true;
- }
- else
- {
- qWarning("[lamexp_translation_init] Error: Already initialized!");
- return false;
- }
+ g_lamexp_tools_data->insert(key, MAKE_ENTRY(file, version, tag));
}
/*
- * Register a new translation
+ * Check for tool
*/
-bool lamexp_translation_register(const QString &langId, const QString &qmFile, const QString &langName, unsigned int &systemId, unsigned int &country)
+bool lamexp_tools_check(const QString &toolName)
{
- QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
+ QReadLocker readLock(&g_lamexp_tools_lock);
- if(qmFile.isEmpty() || langName.isEmpty() || systemId < 1)
+ if(!g_lamexp_tools_data.isNull())
{
- return false;
+ const QString key = toolName.simplified().toLower();
+ return g_lamexp_tools_data->contains(key);
}
- 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;
-}
-
-/*
- * Get list of all translations
- */
-QStringList lamexp_query_translations(void)
-{
- QReadLocker readLockTranslations(&g_lamexp_translation.lock);
- return (g_lamexp_translation.files) ? g_lamexp_translation.files->keys() : QStringList();
-}
-
-/*
- * Get translation name
- */
-QString lamexp_translation_name(const QString &langId)
-{
- QReadLocker readLockTranslations(&g_lamexp_translation.lock);
- return (g_lamexp_translation.names) ? g_lamexp_translation.names->value(langId.toLower(), QString()) : QString();
-}
-
-/*
- * Get translation system id
- */
-unsigned int lamexp_translation_sysid(const QString &langId)
-{
- QReadLocker readLockTranslations(&g_lamexp_translation.lock);
- return (g_lamexp_translation.sysid) ? g_lamexp_translation.sysid->value(langId.toLower(), 0) : 0;
-}
-
-/*
- * Get translation script id
- */
-unsigned int lamexp_translation_country(const QString &langId)
-{
- QReadLocker readLockTranslations(&g_lamexp_translation.lock);
- return (g_lamexp_translation.cntry) ? g_lamexp_translation.cntry->value(langId.toLower(), 0) : 0;
+ return false;
}
/*
- * Install a new translator
+ * Lookup tool path
*/
-bool lamexp_install_translator(const QString &langId)
+const QString &lamexp_tools_lookup(const QString &toolName)
{
- bool success = false;
- const QString qmFileToPath(":/localization/%1");
+ QReadLocker readLock(&g_lamexp_tools_lock);
- if(langId.isEmpty() || langId.toLower().compare(LAMEXP_DEFAULT_LANGID) == 0)
- {
- success = lamexp_install_translator_from_file(qmFileToPath.arg(LAMEXP_DEFAULT_TRANSLATION));
- }
- else
+ if(!g_lamexp_tools_data.isNull())
{
- QReadLocker readLock(&g_lamexp_translation.lock);
- 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(qmFileToPath.arg(qmFile));
- }
- else
+ const QString key = toolName.simplified().toLower();
+ if(g_lamexp_tools_data->contains(key))
{
- qWarning("Translation '%s' not available!", langId.toLatin1().constData());
+ return (*g_lamexp_tools_data)[key].first->filePath();
}
}
- return success;
+ return g_null_string;
}
/*
- * Install a new translator from file
+ * Lookup tool version
*/
-bool lamexp_install_translator_from_file(const QString &qmFile)
+const quint32 &lamexp_tools_version(const QString &toolName, QString *const tagOut)
{
- QWriteLocker writeLock(&g_lamexp_currentTranslator.lock);
- bool success = false;
-
- if(!g_lamexp_currentTranslator.instance)
- {
- g_lamexp_currentTranslator.instance = new QTranslator();
- }
+ QReadLocker readLock(&g_lamexp_tools_lock);
- if(!qmFile.isEmpty())
+ if(!g_lamexp_tools_data.isNull())
{
- QString qmPath = QFileInfo(qmFile).canonicalFilePath();
- QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
- if(success = g_lamexp_currentTranslator.instance->load(qmPath))
+ const QString key = toolName.simplified().toLower();
+ if(g_lamexp_tools_data->contains(key))
{
- QApplication::installTranslator(g_lamexp_currentTranslator.instance);
- }
- else
- {
- qWarning("Failed to load translation:\n\"%s\"", qmPath.toLatin1().constData());
+ const tool_info_t &info = (*g_lamexp_tools_data)[key].second;
+ if(tagOut)
+ {
+ *tagOut = info.second;
+ }
+ return info.first;
}
}
- else
- {
- QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
- success = true;
- }
-
- return success;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// INITIALIZATION
-///////////////////////////////////////////////////////////////////////////////
-
-extern "C" void _lamexp_global_init_tools(void)
-{
- LAMEXP_ZERO_MEMORY(g_lamexp_tools);
- LAMEXP_ZERO_MEMORY(g_lamexp_currentTranslator);
- LAMEXP_ZERO_MEMORY(g_lamexp_translation);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// FINALIZATION
-///////////////////////////////////////////////////////////////////////////////
-
-extern "C" void _lamexp_global_free_tools(void)
-{
- //Free *all* registered translations
- if(g_lamexp_currentTranslator.instance)
- {
- QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
- LAMEXP_DELETE(g_lamexp_currentTranslator.instance);
- }
- LAMEXP_DELETE(g_lamexp_translation.files);
- LAMEXP_DELETE(g_lamexp_translation.names);
- LAMEXP_DELETE(g_lamexp_translation.cntry);
- LAMEXP_DELETE(g_lamexp_translation.sysid);
- //Free *all* registered tools
- if(g_lamexp_tools.registry)
+ if(tagOut)
{
- QStringList keys = g_lamexp_tools.registry->keys();
- for(int i = 0; i < keys.count(); i++)
- {
- LockedFile *lf = g_lamexp_tools.registry->take(keys.at(i));
- LAMEXP_DELETE(lf);
- }
- g_lamexp_tools.registry->clear();
- g_lamexp_tools.versions->clear();
- g_lamexp_tools.tags->clear();
+ tagOut->clear();
}
- LAMEXP_DELETE(g_lamexp_tools.registry);
- LAMEXP_DELETE(g_lamexp_tools.versions);
- LAMEXP_DELETE(g_lamexp_tools.tags);
-
+ return g_max_uint32;
}