Change lang info to be stored in a singleton manager 40/112340/2
authorJi-hoon Lee <dalton.lee@samsung.com>
Thu, 26 Jan 2017 05:05:33 +0000 (14:05 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Wed, 1 Feb 2017 02:20:53 +0000 (11:20 +0900)
To avoid initialization order fiasco problem, changed
the lang info to be stored in a singleton manager,
which is guaranteed to be created before using it.

Change-Id: Ief36694ecfad46ccf53d9e475f54280f2cc6af99

src/sdk/ise_lang_table.cpp
src/sdk/ise_lang_table.h
src/sdk/sdk.cpp

index b6b746b..4183e57 100644 (file)
@@ -19,7 +19,6 @@
 #undef LOG_TAG
 #define LOG_TAG "ISE_DEFAULT"
 #include <sclcommon.h> // scl structures need
-#include <libxml/parser.h>
 #include <vector>
 #include <string>
 #include <assert.h>
@@ -38,26 +37,13 @@ using namespace scl;
 #define LANG_TABLE_XML_PATH LAYOUTDIR"/mobile/ise_lang_table.xml"
 #endif
 
-typedef struct Keyboard_UUID {
-    std::string name;
-    std::string uuid;
-} Keyboard_UUID;
-
-static std::vector<Keyboard_UUID> vec_keyboard_uuid;
-
-class Ise_Lang {
-    public:
-        Ise_Lang();
-        ~Ise_Lang();
-        SDK_ISE_LANG_TABLE m_table[MAX_LANG_TABLE_SIZE];
-        int m_size;
-    private:
-        void parsing_languages();
-        void parsing_lang_table(const xmlNodePtr);
-        void parsing_keyboard_uuid_table(const xmlNodePtr);
-};
-
-Ise_Lang::~Ise_Lang() {
+ISELangTableMgr::ISELangTableMgr() {
+    memset(m_table, 0x00, sizeof(ISE_LANG_TABLE) * MAX_LANG_TABLE_SIZE);
+    m_size = 0;
+    parse_languages();
+}
+
+ISELangTableMgr::~ISELangTableMgr() {
     for (int i = 0; i < m_size; ++i) {
         if (m_table[i].language)
             free(m_table[i].language);
@@ -142,13 +128,8 @@ get_prop_bool(
     return bret;
 }
 
-Ise_Lang::Ise_Lang() {
-    memset(m_table, 0x00, sizeof(SDK_ISE_LANG_TABLE) * MAX_LANG_TABLE_SIZE);
-    parsing_languages();
-}
-
 void
-Ise_Lang::parsing_languages() {
+ISELangTableMgr::parse_languages() {
     xmlDocPtr doc;
     xmlNodePtr cur_node;
 
@@ -178,9 +159,9 @@ Ise_Lang::parsing_languages() {
             cur_node = cur_node->next;
             continue;
         } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"keyboard_uuid_table")) {
-            parsing_keyboard_uuid_table(cur_node);
+            parse_keyboard_uuid_table(cur_node);
         } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"language_table")) {
-            parsing_lang_table(cur_node);
+            parse_lang_table(cur_node);
         }
         cur_node = cur_node->next;
     }
@@ -189,7 +170,7 @@ Ise_Lang::parsing_languages() {
 }
 
 void
-Ise_Lang::parsing_keyboard_uuid_table(const xmlNodePtr p_node) {
+ISELangTableMgr::parse_keyboard_uuid_table(const xmlNodePtr p_node) {
     assert(p_node != NULL);
     if (0 != xmlStrcmp(p_node->name, (const xmlChar *)"keyboard_uuid_table")) {
         LOGD("parsing-keyboard_uuid_table error.\n");
@@ -203,7 +184,7 @@ Ise_Lang::parsing_keyboard_uuid_table(const xmlNodePtr p_node) {
             rec.name = get_prop_str(cur_node, "name");
             rec.uuid = get_prop_str(cur_node, "uuid");
             if (!rec.name.empty() && !rec.uuid.empty()) {
-                vec_keyboard_uuid.push_back(rec);
+                m_vec_keyboard_uuid.push_back(rec);
             }
         }
         cur_node = cur_node->next;
@@ -237,7 +218,7 @@ get_str(std::string str) {
 }
 
 void
-Ise_Lang::parsing_lang_table(const xmlNodePtr p_node) {
+ISELangTableMgr::parse_lang_table(const xmlNodePtr p_node) {
     assert(p_node != NULL);
 
     if (0 != xmlStrcmp(p_node->name, (const xmlChar *)"language_table")) {
@@ -270,7 +251,7 @@ Ise_Lang::parsing_lang_table(const xmlNodePtr p_node) {
                 m_table[m_size].main_keyboard_name = (sclchar *)strdup("abc");
             }
 
-            std::string uuid = find_uuid(vec_keyboard_uuid, get_prop_str(cur_node, "keyboard_ise_uuid"));
+            std::string uuid = find_uuid(m_vec_keyboard_uuid, get_prop_str(cur_node, "keyboard_ise_uuid"));
             m_table[m_size].keyboard_ise_uuid = get_str(uuid);
             xmlChar* country_code_URL = xmlGetProp(cur_node, (const xmlChar*)"country_code_URL");
             m_table[m_size].country_code_URL = (sclchar*)country_code_URL;
@@ -288,12 +269,21 @@ Ise_Lang::parsing_lang_table(const xmlNodePtr p_node) {
     }
 }
 
-static Ise_Lang ise_lang;
+ISELangTableMgr*
+ISELangTableMgr::get_instance()
+{
+    static ISELangTableMgr instance;
+    return &instance;
+}
 
-SDK_ISE_LANG_TABLE* get_lang_table() {
-    return ise_lang.m_table;
+ISE_LANG_TABLE*
+ISELangTableMgr::get_lang_table()
+{
+    return m_table;
 }
 
-int get_lang_table_size() {
-    return ise_lang.m_size;
+int
+ISELangTableMgr::get_lang_table_size()
+{
+    return m_size;
 }
index 8069327..3f60536 100644 (file)
 #define __ISE_LANG_TABLE_H
 #define MAX_LANG_TABLE_SIZE 128
 
-typedef struct SDK_ISE_LANG_TABLE {
-    SDK_ISE_LANG_TABLE() {
+#include <libxml/parser.h>
+
+typedef struct ISE_LANG_TABLE {
+    ISE_LANG_TABLE() {
         language = NULL;
         language_name = NULL;
         language_name_abbr = NULL;
@@ -76,9 +78,32 @@ typedef struct SDK_ISE_LANG_TABLE {
     bool is_latin_language;
     /* If this language accepts caps mode, try to handle AutoCapitalization option */
     bool accepts_caps_mode;
-}SDK_ISE_LANG_TABLE;
+}ISE_LANG_TABLE;
+
+typedef struct Keyboard_UUID {
+    std::string name;
+    std::string uuid;
+} Keyboard_UUID;
+
+class ISELangTableMgr {
+private:
+    ISELangTableMgr();
+
+protected:
+    ISE_LANG_TABLE m_table[MAX_LANG_TABLE_SIZE];
+    int m_size;
+
+    std::vector<Keyboard_UUID> m_vec_keyboard_uuid;
+
+    void parse_languages();
+    void parse_lang_table(const xmlNodePtr);
+    void parse_keyboard_uuid_table(const xmlNodePtr);
+public:
+    ~ISELangTableMgr();
+    static ISELangTableMgr* get_instance();
 
+    ISE_LANG_TABLE* get_lang_table();
+    int get_lang_table_size();
+};
 
-SDK_ISE_LANG_TABLE* get_lang_table();
-int get_lang_table_size();
 #endif
index a278561..d39e853 100644 (file)
@@ -56,28 +56,34 @@ public :
         /* Our CSDKISE instance will handle the following input modes... */
         sclint loop;
 
-        for (loop = 0;loop < get_lang_table_size();loop++) {
-            INPUT_MODE_INFO input_mode_QTY;
-            input_mode_QTY.name = get_lang_table()[loop].inputmode_QTY;
-            input_mode_QTY.display_name = get_lang_table()[loop].inputmode_QTY_name;
-            LANGUAGE_INFO language;
-            language.name = get_lang_table()[loop].language;
-            language.display_name = get_lang_table()[loop].language_name;
-            if (get_lang_table()[loop].locale_string) {
-                language.locale_string = get_lang_table()[loop].locale_string;
+        ISE_LANG_TABLE *table = NULL;
+        ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+        if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+
+        if (lang_table_mgr && table)  {
+            for (loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
+                INPUT_MODE_INFO input_mode_QTY;
+                input_mode_QTY.name = table[loop].inputmode_QTY;
+                input_mode_QTY.display_name = table[loop].inputmode_QTY_name;
+                LANGUAGE_INFO language;
+                language.name = table[loop].language;
+                language.display_name = table[loop].language_name;
+                if (table[loop].locale_string) {
+                    language.locale_string = table[loop].locale_string;
+                }
+                language.callback = this;
+                language.input_modes.push_back(input_mode_QTY);
+                language.priority = LANGAUGE_PRIORITY_DEFAULT;
+                language.resource_file = MAIN_ENTRY_XML_PATH;
+                language.is_latin_language = table[loop].is_latin_language;
+                language.accepts_caps_mode = table[loop].accepts_caps_mode;
+
+                /* These variable should be read from stored setting values */
+                language.enabled = FALSE;
+                language.selected_input_mode = input_mode_QTY.name;
+
+                _language_manager.add_language(language);
             }
-            language.callback = this;
-            language.input_modes.push_back(input_mode_QTY);
-            language.priority = LANGAUGE_PRIORITY_DEFAULT;
-            language.resource_file = MAIN_ENTRY_XML_PATH;
-            language.is_latin_language = get_lang_table()[loop].is_latin_language;
-            language.accepts_caps_mode = get_lang_table()[loop].accepts_caps_mode;
-
-            /* These variable should be read from stored setting values */
-            language.enabled = FALSE;
-            language.selected_input_mode = input_mode_QTY.name;
-
-            _language_manager.add_language(language);
         }
     }
     SCLEventReturnType on_event_key_clicked(SclUIEventDesc event_desc);
@@ -371,16 +377,19 @@ sclboolean CSDKISE::on_language_selected(const sclchar *language, const sclchar
     const char *url_postfixes[] = {".co.uk", ".or.uk", ".ac.uk", ".go.uk"};
     const char *replace_target = "uk";
 
-    if (language) {
+    ISE_LANG_TABLE *table = NULL;
+    ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+    if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+    if (lang_table_mgr && table && language) {
         LOGD("language : %s\n", language);
         sclint loop;
-        for (loop = 0;loop < get_lang_table_size();loop++) {
-            if (strcmp(language, get_lang_table()[loop].language) == 0) {
+        for (loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
+            if (strcmp(language, table[loop].language) == 0) {
                 if (g_ui) {
-                    if (get_lang_table()[loop].keyboard_ise_uuid) {
-                        g_core.set_keyboard_ise_by_uuid(get_lang_table()[loop].keyboard_ise_uuid);
-                        g_core.send_imengine_event(-1, get_lang_table()[loop].keyboard_ise_uuid,
-                            get_lang_table()[loop].language_command, get_lang_table()[loop].language_code);
+                    if (table[loop].keyboard_ise_uuid) {
+                        g_core.set_keyboard_ise_by_uuid(table[loop].keyboard_ise_uuid);
+                        g_core.send_imengine_event(-1, table[loop].keyboard_ise_uuid,
+                            table[loop].language_command, table[loop].language_code);
                         flush_imengine(language);
                     }
 
@@ -413,7 +422,7 @@ sclboolean CSDKISE::on_language_selected(const sclchar *language, const sclchar
                         std::string::size_type offset = postfix.find(replace_target, 0);
 
                         if (offset != postfix.npos) {
-                            postfix.replace(offset, strlen(replace_target), get_lang_table()[loop].country_code_URL);
+                            postfix.replace(offset, strlen(replace_target), table[loop].country_code_URL);
                         }
 
                         g_ui->set_string_substitution(url_postfixes[inner_loop], postfix.c_str());
@@ -421,19 +430,19 @@ sclboolean CSDKISE::on_language_selected(const sclchar *language, const sclchar
 
 #ifdef _WEARABLE
                     /* Replace LANGUAGE_STRING with language name abbreviation */
-                    g_ui->set_string_substitution(LANGUAGE_STRING, get_lang_table()[loop].language_name_abbr);
+                    g_ui->set_string_substitution(LANGUAGE_STRING, table[loop].language_name_abbr);
 #else
                     if (g_keyboard_state.layout == ISE_LAYOUT_STYLE_EMAIL || g_keyboard_state.layout == ISE_LAYOUT_STYLE_URL) {
                         /* Replace LANGUAGE_STRING with language name abbreviation */
-                        g_ui->set_string_substitution(LANGUAGE_STRING, get_lang_table()[loop].language_name_abbr);
+                        g_ui->set_string_substitution(LANGUAGE_STRING, table[loop].language_name_abbr);
                     } else {
                         /* Replace LANGUAGE_STRING with localized language name */
-                        g_ui->set_string_substitution(LANGUAGE_STRING, get_lang_table()[loop].language_name);
+                        g_ui->set_string_substitution(LANGUAGE_STRING, table[loop].language_name);
                     }
 #endif
                     /* Change main_keyboard_name with localized language name */
-                    if (get_lang_table()[loop].main_keyboard_name) {
-                        g_ui->set_string_substitution(PLACEHOLDER_MAIN_KEYBOARD_NAME, get_lang_table()[loop].main_keyboard_name);
+                    if (table[loop].main_keyboard_name) {
+                        g_ui->set_string_substitution(PLACEHOLDER_MAIN_KEYBOARD_NAME, table[loop].main_keyboard_name);
                     }
 
                     /* Now we update the whole screen */
@@ -456,10 +465,14 @@ sclboolean CSDKISE::on_language_unselected(const sclchar *language, const sclcha
 {
     sclboolean ret = FALSE;
 
-    if (language) {
+    ISE_LANG_TABLE *table = NULL;
+    ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+    if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+
+    if (language && lang_table_mgr && table) {
         sclint loop;
-        for (loop = 0;loop < get_lang_table_size();loop++) {
-            if (strcmp(language, get_lang_table()[loop].language) == 0) {
+        for (loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
+            if (strcmp(language, table[loop].language) == 0) {
                 flush_imengine(language);
                 ret = TRUE;
             }
@@ -473,10 +486,14 @@ sclboolean CSDKISE::reset_language(const sclchar *language)
 {
     sclboolean ret = FALSE;
 
-    if (language) {
+    ISE_LANG_TABLE *table = NULL;
+    ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+    if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+
+    if (language && lang_table_mgr && table) {
         sclint loop;
-        for (loop = 0; loop < get_lang_table_size(); loop++) {
-            if (strcmp(language, get_lang_table()[loop].language) == 0) {
+        for (loop = 0; loop < lang_table_mgr->get_lang_table_size(); loop++) {
+            if (strcmp(language, table[loop].language) == 0) {
                 flush_imengine(language);
                 ret = TRUE;
             }
@@ -490,10 +507,16 @@ static inline int get_lang_id(const sclchar* language)
 {
     if (language == NULL) return -1;
 
-    for (int loop = 0;loop < get_lang_table_size();loop++) {
-        if (strcmp(language, get_lang_table()[loop].language) == 0) {
-            if (get_lang_table()[loop].keyboard_ise_uuid) {
-                return loop;
+    ISE_LANG_TABLE *table = NULL;
+    ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+    if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+
+    if (language && lang_table_mgr && table) {
+        for (int loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
+            if (strcmp(language, table[loop].language) == 0) {
+                if (table[loop].keyboard_ise_uuid) {
+                    return loop;
+                }
             }
         }
     }
@@ -504,26 +527,32 @@ sclboolean CSDKISE::flush_imengine(const sclchar *language)
 {
     bool bRet = false;
 
-    if (g_keyboard_state.prev_modifier == KEY_MODIFIER_MULTITAP_START ||
-        g_keyboard_state.prev_modifier == KEY_MODIFIER_MULTITAP_REPEAT) {
-        ise_update_preedit_string("");
-    }
-    g_keyboard_state.multitap_value = "";
-    g_keyboard_state.prev_modifier = KEY_MODIFIER_NONE;
-
-    int lang_id = get_lang_id(language);
-    if (lang_id != -1) {
-        if (get_lang_table()[lang_id].flush_code != 0) {
-            g_core.send_imengine_event(-1, get_lang_table()[lang_id].keyboard_ise_uuid,
-                    get_lang_table()[lang_id].flush_command, get_lang_table()[lang_id].flush_code);
-            bRet = true;
-        } else {
-            g_core.reset_keyboard_ise();
-            bRet = true;
+    ISE_LANG_TABLE *table = NULL;
+    ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
+    if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
+
+    if (language && lang_table_mgr && table) {
+        if (g_keyboard_state.prev_modifier == KEY_MODIFIER_MULTITAP_START ||
+            g_keyboard_state.prev_modifier == KEY_MODIFIER_MULTITAP_REPEAT) {
+            ise_update_preedit_string("");
+        }
+        g_keyboard_state.multitap_value = "";
+        g_keyboard_state.prev_modifier = KEY_MODIFIER_NONE;
+
+        int lang_id = get_lang_id(language);
+        if (lang_id != -1) {
+            if (table[lang_id].flush_code != 0) {
+                g_core.send_imengine_event(-1, table[lang_id].keyboard_ise_uuid,
+                        table[lang_id].flush_command, table[lang_id].flush_code);
+                bRet = true;
+            } else {
+                g_core.reset_keyboard_ise();
+                bRet = true;
+            }
+        }
+        if (strcmp(_language_manager.get_current_language(), "Korean") == 0) {
+            process_korean_automata(false, SIPKEY_ERROR, true);
         }
-    }
-    if (strcmp(_language_manager.get_current_language(), "Korean") == 0) {
-        process_korean_automata(false, SIPKEY_ERROR, true);
     }
 
     return bRet;