From cf4421f7508d1c411bcfbfb2272e76433618f4a6 Mon Sep 17 00:00:00 2001 From: "sung-su.kim" Date: Wed, 14 Aug 2013 09:12:04 +0900 Subject: [PATCH] [Release] wrt-installer_0.1.116 Change-Id: I8e91e72a14343b728ec8a6504233c1d936d89a47 --- CMakeLists.txt | 1 - etc/CMakeLists.txt | 4 -- etc/DESCRIPTION | 1 - etc/wrt_preinstall_widgets.sh | 79 -------------------------- packaging/wrt-installer.spec | 11 +--- packaging/wrt-preinstall-widgets.service | 11 ---- src/CMakeLists.txt | 1 + src/configuration_parser/widget_parser.cpp | 66 +++++++++++++++++++++ src/jobs/widget_install/task_certify_level.cpp | 35 +++++++++++- src/jobs/widget_install/task_certify_level.h | 2 + src/jobs/widget_install/task_database.cpp | 66 +++++++++++++++++++++ src/jobs/widget_install/task_database.h | 2 + src/jobs/widget_install/task_remove_backup.cpp | 19 +++++++ src/jobs/widget_install/task_remove_backup.h | 1 + src/jobs/widget_install/task_widget_config.cpp | 44 +++----------- src/pkg-manager/backendlib.cpp | 59 +++++++++---------- 16 files changed, 230 insertions(+), 172 deletions(-) delete mode 100644 etc/CMakeLists.txt delete mode 100644 etc/DESCRIPTION delete mode 100755 etc/wrt_preinstall_widgets.sh delete mode 100644 packaging/wrt-preinstall-widgets.service diff --git a/CMakeLists.txt b/CMakeLists.txt index 666256f..22515de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,6 @@ SET(TARGET_BACKEND_LIB "wgt") ############################# subdirectories ################################## ADD_SUBDIRECTORY(src) -ADD_SUBDIRECTORY(etc) ADD_SUBDIRECTORY(configuration) IF(WITH_TESTS) diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt deleted file mode 100644 index 14f19c6..0000000 --- a/etc/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -SET(ETC_DIR ${PROJECT_SOURCE_DIR}/etc) - -INSTALL(PROGRAMS ${ETC_DIR}/wrt_preinstall_widgets.sh DESTINATION /usr/bin/) - diff --git a/etc/DESCRIPTION b/etc/DESCRIPTION deleted file mode 100644 index bf6eac9..0000000 --- a/etc/DESCRIPTION +++ /dev/null @@ -1 +0,0 @@ -This directory contain confiration scripts, config files, certificates and all other data that don't fit to other directories. diff --git a/etc/wrt_preinstall_widgets.sh b/etc/wrt_preinstall_widgets.sh deleted file mode 100755 index 996d6a3..0000000 --- a/etc/wrt_preinstall_widgets.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -_working_dir="/opt/usr/media/Downloads/.preinstallWidgets" -_widget_temp="/opt/share/widget/*" - -#Reinstall widget during booting -_temp_widget_path="/opt/share/widget/temp_info" - -install_widgets() { - _wgt_list=`find $_working_dir -name '*.wgt'` - install_failed=0 - for list in $_wgt_list - do - echo "Install $list" - return_string=`wrt-installer -i $list 2>&1 | grep -v plugin` - if [ "$return_string" != "${return_string/successful/}" ]; then - echo "$list widget installation success" - rm -rf $list - else - echo "$list widget installaiton failed" - install_failed=1 - fi - done - - if [ $install_failed -ne 1 ];then - echo "preinstall success" - rm -rf $_working_dir - fi -} - -restore_widget() { -#Remove temporary directory during widget installation -for file in $_widget_temp; do - if [[ -d $file && ${file#*temp_[0-9]*} != $file ]]; then - rm -rf $file - fi -done - -FILE_LIST=`ls $_temp_widget_path` - -if [ -n "$FILE_LIST" ]; then - echo "There are widgets to need reinstall." - for widget in $FILE_LIST; do - FILE_NAME=$_temp_widget_path/$widget - line=`cat $FILE_NAME` - echo "----------------------------------------------------------------" - echo "UnInstalling widget : $line ..." - return_string=`wrt-installer -up $line 2>&1 | grep -v plugin` - echo "Result $return_string" - done -else - echo "There is no reinstall widget." -fi -} - -#Plugin installation is temporary code for window SDK -/usr/bin/wrt-installer -p - -RECOVER_WIDGETS=`ls $_temp_widget_path` -if [ -n "$RECOVER_WIDGETS" ]; then - echo "Start Recover" - restore_widget -fi - -install_widgets diff --git a/packaging/wrt-installer.spec b/packaging/wrt-installer.spec index 1cf31d6..a719f9d 100644 --- a/packaging/wrt-installer.spec +++ b/packaging/wrt-installer.spec @@ -1,13 +1,12 @@ #git:framework/web/wrt-installer Name: wrt-installer Summary: Installer for tizen Webruntime -Version: 0.1.114 +Version: 0.1.116 Release: 1 Group: Development/Libraries License: Apache License, Version 2.0 URL: N/A Source0: %{name}-%{version}.tar.gz -Source1: wrt-preinstall-widgets.service BuildRequires: cmake BuildRequires: edje-tools BuildRequires: pkgconfig(appsvc) @@ -20,6 +19,7 @@ BuildRequires: pkgconfig(dpl-utils-efl) BuildRequires: pkgconfig(dpl-wrt-dao-ro) BuildRequires: pkgconfig(dpl-wrt-dao-rw) BuildRequires: pkgconfig(wrt-commons-i18n-dao-ro) +BuildRequires: pkgconfig(wrt-commons-widget-interface-dao) BuildRequires: pkgconfig(security-install) BuildRequires: pkgconfig(ecore-x) BuildRequires: pkgconfig(xmlsec1) @@ -80,10 +80,6 @@ mkdir -p %{buildroot}/usr/share/license cp LICENSE %{buildroot}/usr/share/license/%{name} %make_install -mkdir -p %{buildroot}%{_libdir}/systemd/system/tizen-runtime.target.wants -install -m 644 %{SOURCE1} %{buildroot}%{_libdir}/systemd/system/wrt-preinstall-widgets.service -ln -s ../wrt-preinstall-widgets.service %{buildroot}%{_libdir}/systemd/system/tizen-runtime.target.wants/wrt-preinstall-widgets.service - %clean rm -rf %{buildroot} @@ -114,11 +110,8 @@ mkdir -p /opt/share/icons/default/small %files %manifest wrt-installer.manifest %attr(755,root,root) %{_bindir}/wrt-installer -%attr(775,root,root) %{_bindir}/wrt_preinstall_widgets.sh /usr/etc/package-manager/backendlib/libwgt.so %attr(644,root,root) /usr/etc/wrt-installer/*.xsd -%{_libdir}/systemd/system/tizen-runtime.target.wants/wrt-preinstall-widgets.service -%{_libdir}/systemd/system/wrt-preinstall-widgets.service %{_datadir}/license/%{name} %if %{with_tests} %attr(755,root,root) %{_bindir}/wrt-installer-tests-* diff --git a/packaging/wrt-preinstall-widgets.service b/packaging/wrt-preinstall-widgets.service deleted file mode 100644 index 0fe2781..0000000 --- a/packaging/wrt-preinstall-widgets.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=WRT Preinstall Widgets -After=tizen-runtime.target -Requires=tizen-runtime.target - -[Service] -Type=forking -ExecStart=/usr/bin/wrt_preinstall_widgets.sh - -[Install] -WantedBy=tizen-runtime.target diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6192474..cb7e367 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -121,6 +121,7 @@ PKG_CHECK_MODULES(INSTALLER_STATIC_DEP dpl-wrt-dao-rw wrt-commons-custom-handler-dao-rw wrt-commons-security-origin-dao + wrt-commons-widget-interface-dao wrt-plugins-types pkgmgr-installer pkgmgr-parser diff --git a/src/configuration_parser/widget_parser.cpp b/src/configuration_parser/widget_parser.cpp index bb4547e..f4135b8 100644 --- a/src/configuration_parser/widget_parser.cpp +++ b/src/configuration_parser/widget_parser.cpp @@ -1071,6 +1071,64 @@ class AppControlParser : public ElementParser ConfigParserData::AppControlInfo& m_data; }; + struct DispositionParser : public ElementParser + { + public: + virtual ActionFunc GetElementParser(const DPL::String& /*ns*/, + const DPL::String& /*name*/) + { + return &IgnoringParser::Create; + } + + virtual void Accept(const Text& /*text*/) + {} + + virtual void Accept(const Element& /*element*/) + {} + + virtual void Accept(const XmlAttribute& attribute) + { + if (attribute.name == L"name") { + if (attribute.value.size() > 0) { + m_value = attribute.value; + NormalizeString(m_value); + } + } + } + + virtual void Verify() + { + if (m_value.IsNull() || *m_value == L"") { + return; + } + + DPL::String windowString(L"window"); + DPL::String inlineString(L"inline"); + + if (*m_value == L"window") { + m_data.m_disposition = + ConfigParserData::AppControlInfo::Disposition::WINDOW; + } else if (*m_value == L"inline") { + m_data.m_disposition = + ConfigParserData::AppControlInfo::Disposition::INLINE; + } else { + LogDebug("Ignoring dispostion value " << + DPL::ToUTF8String(*m_value)); + } + } + + DispositionParser(ConfigParserData::AppControlInfo& data) : + ElementParser(), + m_properNamespace(false), + m_data(data) + {} + + private: + bool m_properNamespace; + DPL::OptionalString m_value; + ConfigParserData::AppControlInfo& m_data; + }; + virtual ActionFunc GetElementParser(const DPL::String& /*ns*/, const DPL::String& name) { @@ -1083,6 +1141,9 @@ class AppControlParser : public ElementParser return DPL::MakeDelegate(this, &AppControlParser::OnUriElement); } else if (name == L"mime") { return DPL::MakeDelegate(this, &AppControlParser::OnMimeElement); + } else if (name == L"disposition") { + return DPL::MakeDelegate(this, + &AppControlParser::OnDispositionElement); } else { return &IgnoringParser::Create; //ignore unknown according to w3c } @@ -1138,6 +1199,11 @@ class AppControlParser : public ElementParser return ElementParserPtr(new MimeParser(m_appControl)); } + ElementParserPtr OnDispositionElement() + { + return ElementParserPtr(new DispositionParser(m_appControl)); + } + AppControlParser(ConfigParserData& data) : ElementParser(), m_data(data), diff --git a/src/jobs/widget_install/task_certify_level.cpp b/src/jobs/widget_install/task_certify_level.cpp index 1c5c77c..1a2b442 100644 --- a/src/jobs/widget_install/task_certify_level.cpp +++ b/src/jobs/widget_install/task_certify_level.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ /* - * @file task_certify.cpp + * @file task_certify_level.cpp * @author Jihoon Chung (jihoon.chung@samgsung.com) * @version * @brief @@ -61,7 +61,7 @@ TaskCertifyLevel::TaskCertifyLevel(InstallerContext &inCont) : void TaskCertifyLevel::stepCertifyLevel() { LogDebug("================ Step: <> ENTER ==============="); - if (!checkSettingLevel(getCertifyLevel())) { + if (!checkConfigurationLevel(getCertifyLevel())) { ThrowMsg(Exceptions::PrivilegeLevelViolation, "setting level violate"); } LogDebug("================ Step: <> DONE ================"); @@ -169,6 +169,18 @@ TaskCertifyLevel::Level TaskCertifyLevel::getCertifyLevel() return level; } +bool TaskCertifyLevel::checkConfigurationLevel( + TaskCertifyLevel::Level level) +{ + if (!checkSettingLevel(level)) { + return false; + } + if (!checkAppcontrolHasDisposition(level)) { + return false; + } + return true; +} + bool TaskCertifyLevel::checkSettingLevel( TaskCertifyLevel::Level level) { @@ -192,6 +204,25 @@ bool TaskCertifyLevel::checkSettingLevel( return true; } +bool TaskCertifyLevel::checkAppcontrolHasDisposition( + TaskCertifyLevel::Level level) +{ + // tizen:disposition -> platform + FOREACH(it, m_contextData.widgetConfig.configInfo.appControlList) { + if (ConfigParserData::AppControlInfo::Disposition::UNDEFINE != + it->m_disposition) + { + if (level < Level::PLATFORM) { + LogError("\"tizen:disposition\" needs \"" << + enumToString(Level::PLATFORM) << + "\" level"); + return false; + } + } + } + return true; +} + std::string TaskCertifyLevel::enumToString( TaskCertifyLevel::Level level) { diff --git a/src/jobs/widget_install/task_certify_level.h b/src/jobs/widget_install/task_certify_level.h index d340cb0..ddad9e9 100644 --- a/src/jobs/widget_install/task_certify_level.h +++ b/src/jobs/widget_install/task_certify_level.h @@ -64,7 +64,9 @@ class TaskCertifyLevel : void getSignatureFiles(const std::string& path, ValidationCore::SignatureFileInfoSet& file); Level getCertifyLevel(); + bool checkConfigurationLevel(Level level); bool checkSettingLevel(Level level); + bool checkAppcontrolHasDisposition(Level level); std::string enumToString(Level level); Level certTypeToLevel(ValidationCore::CertStoreId::Type type); diff --git a/src/jobs/widget_install/task_database.cpp b/src/jobs/widget_install/task_database.cpp index 49020fc..90ac7c9 100644 --- a/src/jobs/widget_install/task_database.cpp +++ b/src/jobs/widget_install/task_database.cpp @@ -22,6 +22,7 @@ * update */ #include +#include #include #include #include @@ -35,6 +36,8 @@ #include #include #include +#include +#include #include #include #include @@ -59,12 +62,14 @@ TaskDatabase::TaskDatabase(InstallerContext& context) : AddStep(&TaskDatabase::StepWrtDBInsert); AddStep(&TaskDatabase::StepAceDBInsert); AddStep(&TaskDatabase::StepSecurityOriginDBInsert); + AddStep(&TaskDatabase::StepWidgetInterfaceDBInsert); AddStep(&TaskDatabase::StepRemoveExternalFiles); AddStep(&TaskDatabase::StepLiveboxDBInsert); AddStep(&TaskDatabase::EndStep); AddAbortStep(&TaskDatabase::StepAbortDBInsert); AddAbortStep(&TaskDatabase::StepAbortAceDBInsert); + AddAbortStep(&TaskDatabase::StepAbortWidgetInterfaceDBInsert); } void TaskDatabase::StepWrtDBInsert() @@ -180,6 +185,41 @@ void TaskDatabase::StepSecurityOriginDBInsert() } } +void TaskDatabase::StepWidgetInterfaceDBInsert() +{ + LogDebug("Create Widget Interface database"); + using namespace WidgetInterfaceDB; + using namespace WrtDB; + + DbWidgetHandle handle = + WidgetDAOReadOnly::getHandle(m_context.widgetConfig.tzAppid); + + // backup database + if (m_context.isUpdateMode) { + std::string dbPath = WidgetInterfaceDAO::databaseFileName(handle); + std::string backupDbPath = dbPath; + backupDbPath += GlobalConfig::GetBackupDatabaseSuffix(); + LogDebug("\"" << dbPath << "\" to \"" << backupDbPath << "\""); + if (0 != std::rename(dbPath.c_str(), backupDbPath.c_str())) { + LogError("widget interface database backup failed"); + ThrowMsg(Exceptions::UpdateFailed, + "widget interface database backup failed"); + } + } + + Try + { + // automatically create widget interface database + WidgetInterfaceDAO dao(handle); + } + Catch(WidgetInterfaceDAO::Exception::DatabaseError) + { + LogError("widget interface database create failed"); + ThrowMsg(Exceptions::UpdateFailed, + "widget interface database create failed"); + } +} + void TaskDatabase::StepRegisterExternalFiles() { WrtDB::ExternalLocationList externalLocationsUpdate = @@ -282,6 +322,32 @@ void TaskDatabase::StepAbortAceDBInsert() LogDebug("Ace data inserted"); } +void TaskDatabase::StepAbortWidgetInterfaceDBInsert() +{ + LogDebug("[DB Update Task] Widget interface Aborting..."); + using namespace WidgetInterfaceDB; + using namespace WrtDB; + + DbWidgetHandle handle = + WidgetDAOReadOnly::getHandle(m_context.widgetConfig.tzAppid); + std::string dbPath = WidgetInterfaceDAO::databaseFileName(handle); + + // remove database + if (remove(dbPath.c_str()) != 0) { + LogWarning("Fail to remove"); + } + + // rollback database + if (m_context.isUpdateMode) { + std::string backupDbPath = dbPath; + backupDbPath += GlobalConfig::GetBackupDatabaseSuffix(); + LogDebug("\"" << dbPath << "\" to \"" << backupDbPath << "\""); + if (0 != std::rename(backupDbPath.c_str(), dbPath.c_str())) { + LogWarning("Fail to rollback"); + } + } +} + void TaskDatabase::StepLiveboxDBInsert() { if (m_context.widgetConfig.configInfo.m_livebox.size() <= 0) { diff --git a/src/jobs/widget_install/task_database.h b/src/jobs/widget_install/task_database.h index 79d19f5..1291c36 100644 --- a/src/jobs/widget_install/task_database.h +++ b/src/jobs/widget_install/task_database.h @@ -49,11 +49,13 @@ class TaskDatabase : void StepWrtDBInsert(); void StepAceDBInsert(); void StepSecurityOriginDBInsert(); + void StepWidgetInterfaceDBInsert(); void StepRemoveExternalFiles(); void StepLiveboxDBInsert(); void StepAbortDBInsert(); void StepAbortAceDBInsert(); + void StepAbortWidgetInterfaceDBInsert(); void StartStep(); void EndStep(); diff --git a/src/jobs/widget_install/task_remove_backup.cpp b/src/jobs/widget_install/task_remove_backup.cpp index 3a69e6c..e424ceb 100644 --- a/src/jobs/widget_install/task_remove_backup.cpp +++ b/src/jobs/widget_install/task_remove_backup.cpp @@ -33,6 +33,7 @@ #include #include #include +#include using namespace WrtDB; @@ -48,6 +49,7 @@ TaskRemoveBackupFiles::TaskRemoveBackupFiles(InstallerContext& context) : AddStep(&TaskRemoveBackupFiles::StepRemoveBackupFiles); } AddStep(&TaskRemoveBackupFiles::StepDeleteBackupDB); + AddStep(&TaskRemoveBackupFiles::StepDeleteBackupWidgetInterfaceDB); AddStep(&TaskRemoveBackupFiles::EndStep); } @@ -88,6 +90,23 @@ void TaskRemoveBackupFiles::StepDeleteBackupDB() } } +void TaskRemoveBackupFiles::StepDeleteBackupWidgetInterfaceDB() +{ + LogDebug("StepDeleteBackupWidgetInterfaceDB"); + using namespace WidgetInterfaceDB; + using namespace WrtDB; + + DbWidgetHandle handle = + WidgetDAOReadOnly::getHandle(m_context.widgetConfig.tzAppid); + std::string backupDbPath = WidgetInterfaceDAO::databaseFileName(handle); + backupDbPath += GlobalConfig::GetBackupDatabaseSuffix(); + + // remove backup database + if (remove(backupDbPath.c_str()) != 0) { + LogWarning("Fail to remove"); + } +} + void TaskRemoveBackupFiles::StartStep() { LogDebug("--------- : START ----------"); diff --git a/src/jobs/widget_install/task_remove_backup.h b/src/jobs/widget_install/task_remove_backup.h index 9c12794..1dcdf5b 100644 --- a/src/jobs/widget_install/task_remove_backup.h +++ b/src/jobs/widget_install/task_remove_backup.h @@ -36,6 +36,7 @@ class TaskRemoveBackupFiles : void StepRemoveBackupFiles(); void StepDeleteBackupDB(); + void StepDeleteBackupWidgetInterfaceDB(); void StartStep(); void EndStep(); diff --git a/src/jobs/widget_install/task_widget_config.cpp b/src/jobs/widget_install/task_widget_config.cpp index ed59d54..221fd1c 100644 --- a/src/jobs/widget_install/task_widget_config.cpp +++ b/src/jobs/widget_install/task_widget_config.cpp @@ -367,44 +367,16 @@ void TaskWidgetConfig::ProcessAppControlInfo() LogDebug("ProcessAppControlInfo"); using namespace WrtDB; - WrtDB::ConfigParserData::AppControlInfo::Disposition disposition = - WrtDB::ConfigParserData::AppControlInfo::Disposition::WINDOW; - FOREACH(it, m_installContext.widgetConfig.configInfo.settingsList) { - if (!strcmp(DPL::ToUTF8String(it->m_name).c_str(), "nodisplay") && - !strcmp(DPL::ToUTF8String(it->m_value).c_str(), "true")) + // In case of dispostion is inline, set the seperate execute + int index = 1; + // 0 index is reserved by default execute + FOREACH(it, m_installContext.widgetConfig.configInfo.appControlList) { + if (it->m_disposition == + ConfigParserData::AppControlInfo::Disposition::INLINE) { - disposition = - WrtDB::ConfigParserData::AppControlInfo::Disposition::INLINE; - } - } - - std::map srcMap; - int index = 0; - // index = 0 is reserved for start file - FOREACH(startFileIt, m_installContext.widgetConfig.localizationData.startFiles) - { - if (!startFileIt->propertiesForLocales.empty()) { - std::string src = DPL::ToUTF8String(startFileIt->path); - if (srcMap.find(src) == srcMap.end()) { - LogDebug("Insert [" << src << "," << index << "]"); - srcMap.insert(std::pair(src, index++)); - } - } - } - - FOREACH(appControlIt, m_installContext.widgetConfig.configInfo.appControlList) - { - appControlIt->m_disposition = disposition; - std::string src = DPL::ToUTF8String(appControlIt->m_src); - LogDebug("src = [" << src << "]"); - std::map::iterator findIt = srcMap.find(src); - if (findIt == srcMap.end()) { - LogDebug("Insert [" << src << "," << index << "]"); - srcMap.insert(std::pair(src, index)); - appControlIt->m_index = index++; + it->m_index = index++; } else { - LogDebug("Exist [" << src << "," << findIt->second << "]"); - appControlIt->m_index = findIt->second; + it->m_index = 0; } } } diff --git a/src/pkg-manager/backendlib.cpp b/src/pkg-manager/backendlib.cpp index ceca1ba..7995119 100644 --- a/src/pkg-manager/backendlib.cpp +++ b/src/pkg-manager/backendlib.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -46,6 +45,7 @@ #include #include #include +#include #include "root_parser.h" #include "widget_parser.h" #include "parser_runner.h" @@ -388,43 +388,44 @@ int getWidgetDetailInfoFromPackage(const char* pkgPath, DPL::Optional name; DPL::Optional desc; - DPL::OptionalString defaultLocale = configInfo.defaultlocale; + LanguageTags tags = LanguageTagsProviderSingleton::Instance().getLanguageTags(); - char* language = vconf_get_str(VCONFKEY_LANGSET); + auto toLowerCase = [](const DPL::String & r) + { + DPL::String result; + std::transform(r.begin(), r.end(), std::inserter(result, result.begin()), ::tolower); + return result; + }; - DPL::String inLocaleString = DPL::FromUTF8String(language); - DPL::String locString = inLocaleString.substr( - 0, inLocaleString.find_first_of(L".")); - std::replace(locString.begin(), locString.end(), '_', '-'); + if (!!configInfo.defaultlocale) + { + Locale & dl = *configInfo.defaultlocale; + configInfo.defaultlocale = toLowerCase(dl); + } - FOREACH(localizedData, configInfo.localizedDataSet) + bool found = false; + FOREACH(tag, tags) { - Locale i = localizedData->first; - std::transform( locString.begin(), - locString.end(), - locString.begin(), - ::tolower ); - std::transform( i.begin(), i.end(), i.begin(), ::tolower ); - std::size_t found = locString.find(i); - std::size_t found2 = i.find(locString); - - if (!!defaultLocale) { - if (defaultLocale == i) { + *tag = toLowerCase(*tag); + FOREACH(localizedData, configInfo.localizedDataSet) + { + Locale i = localizedData->first; + i = toLowerCase(i); + + if (!!configInfo.defaultlocale && *configInfo.defaultlocale == i) + { name = localizedData->second.name; desc = localizedData->second.description; + } + if (*tag == i) + { + name = localizedData->second.name; + desc = localizedData->second.description; + found = true; break; } - } else if (found != std::string::npos - || found2 != std::string::npos) { - name = localizedData->second.name; - desc = localizedData->second.description; - break; - } - else { - name = localizedData->second.name; - desc = localizedData->second.description; - continue; } + if(found) break; } if( !name.IsNull()) { -- 2.7.4