Fix a bug about setting i18n 02/279802/1
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 18 Aug 2022 05:22:37 +0000 (05:22 +0000)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 18 Aug 2022 05:22:37 +0000 (05:22 +0000)
The std::set is not implemented using stack. The languages value MUST be
stored in the added order. This patch uses std::vector instead of
std::set to add languages.

Change-Id: I576761541c61b85b0de7ad6a850ecf23d01a6276
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
tizen-cpp/app-core-cpp/app_core_base.cc

index cb89bce..e4e6e86 100644 (file)
@@ -36,6 +36,7 @@
 #include <unistd.h>
 #include <vconf.h>
 
+#include <algorithm>
 #include <cstring>
 #include <list>
 #include <map>
@@ -43,6 +44,7 @@
 #include <set>
 #include <sstream>
 #include <utility>
+#include <vector>
 
 #include "app-core-cpp/app_core_base.hh"
 #include "common/glib_private.hh"
@@ -152,10 +154,10 @@ class AppCoreBase::Impl {
   void UpdateRegion();
   std::list<std::string> SplitLanguage(const std::string& lang);
   std::string GetLanguage(std::string lang);
-  void AppendDefaultLangs(std::set<std::string>& lang_set);
+  void AppendDefaultLangs(std::vector<std::string>& lang_set);
   std::string GetStringBefore(const char* str, const char* delim);
   std::map<std::string, std::set<std::string>> GetLangTable();
-  void AppendLangs(const std::string& lang, std::set<std::string>& lang_set,
+  void AppendLangs(const std::string& lang, std::vector<std::string>& lang_set,
       std::map<std::string, std::set<std::string>>& table);
   void ChangeLang();
   void OnFreezerSignal();
@@ -891,8 +893,10 @@ std::list<std::string> AppCoreBase::Impl::SplitLanguage(
   return li;
 }
 
-void AppCoreBase::Impl::AppendDefaultLangs(std::set<std::string>& lang_set) {
-  lang_set.insert({"en_US", "en_GB", "en"});
+void AppCoreBase::Impl::AppendDefaultLangs(std::vector<std::string>& langs) {
+  langs.push_back("en_US");
+  langs.push_back("en_GB");
+  langs.push_back("en");
 }
 
 std::string AppCoreBase::Impl::GetStringBefore(const char* cstr,
@@ -940,17 +944,17 @@ std::map<std::string, std::set<std::string>> AppCoreBase::Impl::GetLangTable() {
 }
 
 void AppCoreBase::Impl::AppendLangs(const std::string& lang,
-    std::set<std::string>& lang_set,
+    std::vector<std::string>& langs,
     std::map<std::string, std::set<std::string>>& table) {
   if (lang.empty())
     return;
 
-  lang_set.insert(lang);
+  langs.push_back(lang);
   std::string extract_lang = GetStringBefore(lang.c_str(), ".");
   if (extract_lang.empty())
     return;
 
-  if (lang_set.find(extract_lang) != lang_set.end())
+  if (std::find(langs.begin(), langs.end(), extract_lang) != langs.end())
     return;
 
   std::string parent_lang = GetStringBefore(extract_lang.c_str(), "_");
@@ -962,21 +966,30 @@ void AppCoreBase::Impl::AppendLangs(const std::string& lang,
 
   auto it = table[parent_lang].find(extract_lang);
   if (it != table[parent_lang].end()) {
-    lang_set.insert(move(*it));
+    std::string value = *it;
+    if (std::find(langs.begin(), langs.end(), value) == langs.end())
+      langs.push_back(std::move(value));
+
     table[parent_lang].erase(it);
     return;
   }
 
   it = table[parent_lang].find(parent_lang);
   if (it != table[parent_lang].end()) {
-    lang_set.insert(move(*it));
+    std::string value = *it;
+    if (std::find(langs.begin(), langs.end(), value) == langs.end())
+      langs.push_back(std::move(value));
+
     table[parent_lang].erase(parent_lang);
     return;
   }
 
   if (!table[parent_lang].empty()) {
     auto i = table[parent_lang].begin();
-    lang_set.insert(move(*i));
+    std::string value = *i;
+    if (std::find(langs.begin(), langs.end(), value) == langs.end())
+      langs.push_back(std::move(value));
+
     table[parent_lang].erase(i);
   }
 }
@@ -990,17 +1003,17 @@ std::string AppCoreBase::Impl::GetLanguage(std::string lang) {
   if (table.empty())
     return "";
 
-  std::set<std::string> lang_set {};
+  std::vector<std::string> langs;
   for (auto& i : l)
-    AppendLangs(i, lang_set, table);
+    AppendLangs(i, langs, table);
 
-  AppendDefaultLangs(lang_set);
+  AppendDefaultLangs(langs);
   std::string ret;
-  for (auto& i : lang_set) {
+  for (auto& i : langs) {
     if (ret.empty())
       ret = i;
     else
-      ret = i + ":" + ret;
+      ret += ":" + i;
   }
 
   return ret;