1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2013 LoRd_MuldeR <MuldeR2@GMX.de>
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version, but always including the *additional*
9 // restrictions defined in the "License.txt" file.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this program; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
26 #include <QApplication>
28 #include <QReadWriteLock>
29 #include <QReadLocker>
30 #include <QWriteLocker>
32 #include <QStringList>
33 #include <QTranslator>
37 #include "LockedFile.h"
39 ///////////////////////////////////////////////////////////////////////////////
41 ///////////////////////////////////////////////////////////////////////////////
46 QMap<QString, LockedFile*> *registry;
47 QMap<QString, unsigned int> *versions;
48 QMap<QString, QString> *tags;
56 QMap<QString, QString> *files;
57 QMap<QString, QString> *names;
58 QMap<QString, unsigned int> *sysid;
59 QMap<QString, unsigned int> *cntry;
67 QTranslator *instance;
70 g_lamexp_currentTranslator;
72 ///////////////////////////////////////////////////////////////////////////////
74 ///////////////////////////////////////////////////////////////////////////////
79 void lamexp_register_tool(const QString &toolName, LockedFile *file, unsigned int version, const QString *tag)
81 QWriteLocker writeLock(&g_lamexp_tools.lock);
83 if(!g_lamexp_tools.registry) g_lamexp_tools.registry = new QMap<QString, LockedFile*>();
84 if(!g_lamexp_tools.versions) g_lamexp_tools.versions = new QMap<QString, unsigned int>();
85 if(!g_lamexp_tools.tags) g_lamexp_tools.tags = new QMap<QString, QString>();
87 if(g_lamexp_tools.registry->contains(toolName.toLower()))
89 THROW("lamexp_register_tool: Tool is already registered!");
92 g_lamexp_tools.registry->insert(toolName.toLower(), file);
93 g_lamexp_tools.versions->insert(toolName.toLower(), version);
94 g_lamexp_tools.tags->insert(toolName.toLower(), (tag) ? (*tag) : QString());
100 bool lamexp_check_tool(const QString &toolName)
102 QReadLocker readLock(&g_lamexp_tools.lock);
103 return (g_lamexp_tools.registry) ? g_lamexp_tools.registry->contains(toolName.toLower()) : false;
109 const QString lamexp_lookup_tool(const QString &toolName)
111 QReadLocker readLock(&g_lamexp_tools.lock);
113 if(g_lamexp_tools.registry)
115 if(g_lamexp_tools.registry->contains(toolName.toLower()))
117 return g_lamexp_tools.registry->value(toolName.toLower())->filePath();
131 * Lookup tool version
133 unsigned int lamexp_tool_version(const QString &toolName, QString *tag)
135 QReadLocker readLock(&g_lamexp_tools.lock);
136 if(tag) tag->clear();
138 if(g_lamexp_tools.versions)
140 if(g_lamexp_tools.versions->contains(toolName.toLower()))
144 if(g_lamexp_tools.tags->contains(toolName.toLower())) *tag = g_lamexp_tools.tags->value(toolName.toLower());
146 return g_lamexp_tools.versions->value(toolName.toLower());
160 * Version number to human-readable string
162 const QString lamexp_version2string(const QString &pattern, unsigned int version, const QString &defaultText, const QString *tag)
164 if(version == UINT_MAX)
169 QString result = pattern;
170 int digits = result.count("?", Qt::CaseInsensitive);
178 QString versionStr = QString().sprintf(QString().sprintf("%%0%du", digits).toLatin1().constData(), version);
179 int index = result.indexOf("?", Qt::CaseInsensitive);
181 while(index >= 0 && pos < versionStr.length())
183 result[index] = versionStr[pos++];
184 index = result.indexOf("?", Qt::CaseInsensitive);
189 result.replace(QChar('#'), *tag, Qt::CaseInsensitive);
196 * Free all registered tools (final clean-up)
198 void lamexp_clean_all_tools(void)
200 if(g_lamexp_tools.registry)
202 QStringList keys = g_lamexp_tools.registry->keys();
203 for(int i = 0; i < keys.count(); i++)
205 LockedFile *lf = g_lamexp_tools.registry->take(keys.at(i));
208 g_lamexp_tools.registry->clear();
209 g_lamexp_tools.versions->clear();
210 g_lamexp_tools.tags->clear();
213 LAMEXP_DELETE(g_lamexp_tools.registry);
214 LAMEXP_DELETE(g_lamexp_tools.versions);
215 LAMEXP_DELETE(g_lamexp_tools.tags);
219 * Initialize translations and add default language
221 bool lamexp_translation_init(void)
223 QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
225 if((!g_lamexp_translation.files) && (!g_lamexp_translation.names))
227 g_lamexp_translation.files = new QMap<QString, QString>();
228 g_lamexp_translation.names = new QMap<QString, QString>();
229 g_lamexp_translation.files->insert(LAMEXP_DEFAULT_LANGID, "");
230 g_lamexp_translation.names->insert(LAMEXP_DEFAULT_LANGID, "English");
235 qWarning("[lamexp_translation_init] Error: Already initialized!");
241 * Register a new translation
243 bool lamexp_translation_register(const QString &langId, const QString &qmFile, const QString &langName, unsigned int &systemId, unsigned int &country)
245 QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
247 if(qmFile.isEmpty() || langName.isEmpty() || systemId < 1)
252 if(!g_lamexp_translation.files) g_lamexp_translation.files = new QMap<QString, QString>();
253 if(!g_lamexp_translation.names) g_lamexp_translation.names = new QMap<QString, QString>();
254 if(!g_lamexp_translation.sysid) g_lamexp_translation.sysid = new QMap<QString, unsigned int>();
255 if(!g_lamexp_translation.cntry) g_lamexp_translation.cntry = new QMap<QString, unsigned int>();
257 g_lamexp_translation.files->insert(langId, qmFile);
258 g_lamexp_translation.names->insert(langId, langName);
259 g_lamexp_translation.sysid->insert(langId, systemId);
260 g_lamexp_translation.cntry->insert(langId, country);
266 * Get list of all translations
268 QStringList lamexp_query_translations(void)
270 QReadLocker readLockTranslations(&g_lamexp_translation.lock);
271 return (g_lamexp_translation.files) ? g_lamexp_translation.files->keys() : QStringList();
275 * Get translation name
277 QString lamexp_translation_name(const QString &langId)
279 QReadLocker readLockTranslations(&g_lamexp_translation.lock);
280 return (g_lamexp_translation.names) ? g_lamexp_translation.names->value(langId.toLower(), QString()) : QString();
284 * Get translation system id
286 unsigned int lamexp_translation_sysid(const QString &langId)
288 QReadLocker readLockTranslations(&g_lamexp_translation.lock);
289 return (g_lamexp_translation.sysid) ? g_lamexp_translation.sysid->value(langId.toLower(), 0) : 0;
293 * Get translation script id
295 unsigned int lamexp_translation_country(const QString &langId)
297 QReadLocker readLockTranslations(&g_lamexp_translation.lock);
298 return (g_lamexp_translation.cntry) ? g_lamexp_translation.cntry->value(langId.toLower(), 0) : 0;
302 * Install a new translator
304 bool lamexp_install_translator(const QString &langId)
306 bool success = false;
307 const QString qmFileToPath(":/localization/%1");
309 if(langId.isEmpty() || langId.toLower().compare(LAMEXP_DEFAULT_LANGID) == 0)
311 success = lamexp_install_translator_from_file(qmFileToPath.arg(LAMEXP_DEFAULT_TRANSLATION));
315 QReadLocker readLock(&g_lamexp_translation.lock);
316 QString qmFile = (g_lamexp_translation.files) ? g_lamexp_translation.files->value(langId.toLower(), QString()) : QString();
319 if(!qmFile.isEmpty())
321 success = lamexp_install_translator_from_file(qmFileToPath.arg(qmFile));
325 qWarning("Translation '%s' not available!", langId.toLatin1().constData());
333 * Install a new translator from file
335 bool lamexp_install_translator_from_file(const QString &qmFile)
337 QWriteLocker writeLock(&g_lamexp_currentTranslator.lock);
338 bool success = false;
340 if(!g_lamexp_currentTranslator.instance)
342 g_lamexp_currentTranslator.instance = new QTranslator();
345 if(!qmFile.isEmpty())
347 QString qmPath = QFileInfo(qmFile).canonicalFilePath();
348 QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
349 if(success = g_lamexp_currentTranslator.instance->load(qmPath))
351 QApplication::installTranslator(g_lamexp_currentTranslator.instance);
355 qWarning("Failed to load translation:\n\"%s\"", qmPath.toLatin1().constData());
360 QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
368 * Free all registered translations (final clean-up)
370 void lamexp_clean_all_translations(void)
372 QWriteLocker writeLockTranslator(&g_lamexp_currentTranslator.lock);
374 if(g_lamexp_currentTranslator.instance)
376 QApplication::removeTranslator(g_lamexp_currentTranslator.instance);
377 LAMEXP_DELETE(g_lamexp_currentTranslator.instance);
380 writeLockTranslator.unlock();
381 QWriteLocker writeLockTranslations(&g_lamexp_translation.lock);
383 LAMEXP_DELETE(g_lamexp_translation.files);
384 LAMEXP_DELETE(g_lamexp_translation.names);
385 LAMEXP_DELETE(g_lamexp_translation.cntry);
386 LAMEXP_DELETE(g_lamexp_translation.sysid);
389 ///////////////////////////////////////////////////////////////////////////////
391 ///////////////////////////////////////////////////////////////////////////////
393 extern "C" void _lamexp_global_init_tools(void)
395 LAMEXP_ZERO_MEMORY(g_lamexp_tools);
396 LAMEXP_ZERO_MEMORY(g_lamexp_currentTranslator);
397 LAMEXP_ZERO_MEMORY(g_lamexp_translation);