OSDN Git Service

Moved translation support into MUtilities library + make clean-up of temporary files...
[lamexp/LameXP.git] / src / Global_Tools.cpp
index 0b4dee7..377cf7d 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // 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;
 }