Remove fallback routines and memory leak.
authorHokwon Song <hokwon.song@samsung.com>
Mon, 27 May 2013 07:20:56 +0000 (16:20 +0900)
committerHokwon Song <hokwon.song@samsung.com>
Mon, 27 May 2013 07:22:51 +0000 (16:22 +0900)
Change-Id: I72187a3bccf4836719bc7be06c89b34b82e0bfae
Signed-off-by: Hokwon Song <hokwon.song@samsung.com>
src/locales/FLclLocaleManager.cpp
src/locales/FLcl_LocaleManagerImpl.cpp
src/locales/inc/FLcl_LocaleManagerImpl.h

index 0482744..8b16c78 100644 (file)
@@ -78,7 +78,6 @@ IList*
 LocaleManager::GetAvailableLanguagesN(void) const
 {
        ClearLastResult();
-       
        return _LocaleManagerImpl::GetAvailableLanguagesN();
 }
 
index 52c4aa6..a6eb7cb 100644 (file)
@@ -41,240 +41,23 @@ using namespace Tizen::Base::Utility;
 using namespace Tizen::Base::Collection;
 using namespace Tizen::Io;
 
+struct FreeXmlDoc
+{
+       void operator ()(xmlDoc* p)
+       {
+               if (p != null)
+               {
+                       xmlFreeDoc(p);
+               }
+       }
+};
+
 namespace Tizen { namespace Locales
 {
 static const char* LANGUAGE_LIST_FILE_PATH ="/opt/data/setting/langlist.xml";
 static const char* TIMEZONE_LIST_FILE_PATH = "/opt/data/setting/tzlist.ini";
 static const char* CLOCALE_LIST_FILE_PATH = "/opt/usr/etc/clocale.list";
 
-static const int TIMEZONE_MAX = 224;
-static const char* TimeZoneList[TIMEZONE_MAX] =
-{
-       "Africa/Abidjan",
-       "Africa/Accra",
-       "Africa/Addis_Ababa",
-       "Africa/Algiers",
-       "Africa/Asmara",
-       "Africa/Bamako",
-       "Africa/Bangui",
-       "Africa/Bissau",
-       "Africa/Cairo",
-       "Africa/Casablanca",
-       "Africa/Conakry",
-       "Africa/Dakar",
-       "Africa/Dar_es_Salaam",
-       "Africa/Djibouti",
-       "Africa/Douala",
-       "Africa/Freetown",
-       "Africa/Gaborone",
-       "Africa/Harare",
-       "Africa/Johannesburg",
-       "Africa/Kampala",
-       "Africa/Khartoum",
-       "Africa/Kinshasa",
-       "Africa/Lagos",
-       "Africa/Luanda",
-       "Africa/Lubumbashi",
-       "Africa/Lusaka",
-       "Africa/Malabo",
-       "Africa/Maputo",
-       "Africa/Mogadishu",
-       "Africa/Monrovia",
-       "Africa/Nairobi",
-       "Africa/Ndjamena",
-       "Africa/Niamey",
-       "Africa/Nouakchott",
-       "Africa/Ouagadougou",
-       "Africa/Tripoli",
-       "Africa/Tunis",
-       "America/Anchorage",
-       "America/Antigua",
-       "America/Argentina/Buenos_Aires",
-       "America/Asuncion",
-       "America/Barbados",
-       "America/Belize",
-       "America/Bogota",
-       "America/Caracas",
-       "America/Cayenne",
-       "America/Chicago",
-       "America/Costa_Rica",
-       "America/Denver",
-       "America/Detroit",
-       "America/El_Salvador",
-       "America/Godthab",
-       "America/Guadeloupe",
-       "America/Guatemala",
-       "America/Guayaquil",
-       "America/Guyana",
-       "America/Halifax",
-       "America/Havana",
-       "America/Indiana/Indianapolis",
-       "America/Jamaica",
-       "America/Kentucky/Louisville",
-       "America/La_Paz",
-       "America/Lima",
-       "America/Los_Angeles",
-       "America/Managua",
-       "America/Marigot",
-       "America/Martinique",
-       "America/Mazatlan",
-       "America/Mexico_City",
-       "America/Montevideo",
-       "America/Montreal",
-       "America/New_York",
-       "America/Nome",
-       "America/Panama",
-       "America/Paramaribo",
-       "America/Phoenix",
-       "America/Port-au-Prince",
-       "America/Puerto_Rico",
-       "America/Recife",
-       "America/Regina",
-       "America/Santiago",
-       "America/Santo_Domingo",
-       "America/Sao_Paulo",
-       "America/St_Johns",
-       "America/St_Thomas",
-       "America/Tegucigalpa",
-       "America/Tijuana",
-       "America/Toronto",
-       "America/Tortola",
-       "America/Vancouver",
-       "America/Winnipeg",
-       "Asia/Aden",
-       "Asia/Almaty",
-       "Asia/Amman",
-       "Asia/Anadyr",
-       "Asia/Ashgabat",
-       "Asia/Baghdad",
-       "Asia/Bahrain",
-       "Asia/Baku",
-       "Asia/Bangkok",
-       "Asia/Beirut",
-       "Asia/Bishkek",
-       "Asia/Colombo",
-       "Asia/Damascus",
-       "Asia/Dhaka",
-       "Asia/Dubai",
-       "Asia/Dushanbe",
-       "Asia/Ho_Chi_Minh",
-       "Asia/Hong_Kong",
-       "Asia/Hovd",
-       "Asia/Irkutsk",
-       "Asia/Istanbul",
-       "Asia/Jakarta",
-       "Asia/Jayapura",
-       "Asia/Jerusalem",
-       "Asia/Kabul",
-       "Asia/Kamchatka",
-       "Asia/Karachi",
-       "Asia/Kathmandu",
-       "Asia/Kolkata",
-       "Asia/Krasnoyarsk",
-       "Asia/Kuala_Lumpur",
-       "Asia/Kuwait",
-       "Asia/Macau",
-       "Asia/Magadan",
-       "Asia/Makassar",
-       "Asia/Manila",
-       "Asia/Muscat",
-       "Asia/Novokuznetsk",
-       "Asia/Novosibirsk",
-       "Asia/Omsk",
-       "Asia/Phnom_Penh",
-       "Asia/Pyongyang",
-       "Asia/Qatar",
-       "Asia/Rangoon",
-       "Asia/Riyadh",
-       "Asia/Sakhalin",
-       "Asia/Seoul",
-       "Asia/Shanghai",
-       "Asia/Singapore",
-       "Asia/Taipei",
-       "Asia/Tashkent",
-       "Asia/Tbilisi",
-       "Asia/Tehran",
-       "Asia/Tokyo",
-       "Asia/Ulan_Bator",
-       "Asia/Vladivostok",
-       "Asia/Yakutsk",
-       "Asia/Yekaterinburg",
-       "Asia/Yerevan",
-       "Atlantic/Azores",
-       "Atlantic/Canary",
-       "Atlantic/Reykjavik",
-       "Atlantic/South_Georgia",
-       "Australia/Adelaide",
-       "Australia/Brisbane",
-       "Australia/Canberra",
-       "Australia/Darwin",
-       "Australia/Hobart",
-       "Australia/Melbourne",
-       "Australia/Perth",
-       "Australia/Sydney",
-       "CST6CDT",
-       "EST5EDT",
-       "Europe/Amsterdam",
-       "Europe/Athens",
-       "Europe/Belgrade",
-       "Europe/Berlin",
-       "Europe/Bratislava",
-       "Europe/Brussels",
-       "Europe/Bucharest",
-       "Europe/Budapest",
-       "Europe/Chisinau",
-       "Europe/Copenhagen",
-       "Europe/Dublin",
-       "Europe/Helsinki",
-       "Europe/Istanbul",
-       "Europe/Kaliningrad",
-       "Europe/Kiev",
-       "Europe/Lisbon",
-       "Europe/Ljubljana",
-       "Europe/London",
-       "Europe/Luxembourg",
-       "Europe/Madrid",
-       "Europe/Malta",
-       "Europe/Minsk",
-       "Europe/Moscow",
-       "Europe/Paris",
-       "Europe/Podgorica",
-       "Europe/Prague",
-       "Europe/Riga",
-       "Europe/Rome",
-       "Europe/Samara",
-       "Europe/San_Marino",
-       "Europe/Skopje",
-       "Europe/Sofia",
-       "Europe/Stockholm",
-       "Europe/Tallinn",
-       "Europe/Vaduz",
-       "Europe/Vienna",
-       "Europe/Vilnius",
-       "Europe/Volgograd",
-       "Europe/Warsaw",
-       "Europe/Zagreb",
-       "Europe/Zurich",
-       "Indian/Antananarivo",
-       "Indian/Chagos",
-       "Indian/Maldives",
-       "Indian/Mauritius",
-       "Indian/Reunion",
-       "MST7MDT",
-       "Pacific/Auckland",
-       "Pacific/Easter",
-       "Pacific/Fiji",
-       "Pacific/Galapagos",
-       "Pacific/Guam",
-       "Pacific/Honolulu",
-       "Pacific/Midway",
-       "Pacific/Noumea",
-       "Pacific/Pago_Pago",
-       "Pacific/Tahiti",
-       "Pacific/Tarawa",
-       "Pacific/Tongatapu",
-       "PST8PDT"
-};
 
 Locale
 _LocaleManagerImpl::GetSystemLocale(void)
@@ -403,18 +186,16 @@ _LocaleManagerImpl::GetSelectedLanguage(void)
 IList*
 _LocaleManagerImpl::GetAvailableLanguagesN(void)
 {
-       xmlDocPtr doc = null;
-       xmlNodePtr cur = null;
+       std::unique_ptr<ArrayList> pAvailableLanguageList(new (std::nothrow) ArrayList(SingleObjectDeleter));
+       SysTryReturn(NID_LCL, pAvailableLanguageList, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
 
-       std::unique_ptr<ArrayList, AllElementsDeleter> pAvailableLanguageList(new (std::nothrow) ArrayList());
-       SysTryCatch(NID_LCL, pAvailableLanguageList, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       doc = xmlParseFile(LANGUAGE_LIST_FILE_PATH);
-       SysTryCatch(NID_LCL, doc != null, , E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] It is failed to get the langlist from the resource.");
+       xmlNodePtr cur = null;
+       std::unique_ptr< xmlDoc, FreeXmlDoc > pDoc(xmlParseFile(LANGUAGE_LIST_FILE_PATH));
+       SysTryReturn(NID_LCL, pDoc != null, null, E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] It is failed to get the langlist from the resource.");
 
-       cur = xmlDocGetRootElement(doc);
-       SysTryCatch(NID_LCL, cur != null, , E_EMPTY_BODY, "[E_EMPTY_BODY] It is empty document.");
-       SysTryCatch(NID_LCL, xmlStrcmp(cur->name, (const xmlChar *) "langlist") == 0, , E_INVALID_CONTENT, "[E_INVALID_CONTENT] The document is wrong type");
+       cur = xmlDocGetRootElement(pDoc.get());
+       SysTryReturn(NID_LCL, cur != null, null, E_EMPTY_BODY, "[E_EMPTY_BODY] It is empty document.");
+       SysTryReturn(NID_LCL, xmlStrcmp(cur->name, (const xmlChar *) "langlist") == 0, null, E_INVALID_CONTENT, "[E_INVALID_CONTENT] The document is wrong type");
 
        cur = cur->xmlChildrenNode;
 
@@ -424,70 +205,66 @@ _LocaleManagerImpl::GetAvailableLanguagesN(void)
        {
                if (cur_node->type == XML_ELEMENT_NODE)
                {
-                       char* pLocId = (char*)xmlGetProp(cur_node, (const xmlChar *)"id");
-                       Locale loc = _LocaleImpl(pLocId).GetOspLocale();
+                       std::unique_ptr < char > pLocId((char*)xmlGetProp(cur_node, (const xmlChar *)"id"));
+                       Locale loc = _LocaleImpl(pLocId.get()).GetOspLocale();
                        std::unique_ptr<String> pLanguageLocaleID(new (std::nothrow) String(loc.GetLanguageCodeString()));
-                       SysTryCatch(NID_LCL, pLanguageLocaleID, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed",GetErrorMessage(E_OUT_OF_MEMORY));
+                       SysTryReturn(NID_LCL, pLanguageLocaleID, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed",GetErrorMessage(E_OUT_OF_MEMORY));
 
                        result r = pAvailableLanguageList->Add(pLanguageLocaleID.get());
-                       SysTryCatch(NID_LCL, r == E_SUCCESS, null, E_SYSTEM,
+                       SysTryReturn(NID_LCL, r == E_SUCCESS, null, E_SYSTEM,
                                        "[%s] It is failed to add a locale string [%ls].", GetErrorMessage(E_SYSTEM), pLanguageLocaleID->GetPointer());
                        pLanguageLocaleID.release();
                }
        }
 
        SetLastResult(E_SUCCESS);
-
-       if (doc)
-       {
-               xmlFreeDoc(doc);
-       }
-
        return pAvailableLanguageList.release();
-
-CATCH:
-       if (doc)
-       {
-               xmlFreeDoc(doc);
-       }
-       SysLog(NID_LCL, "It is calling fallback api.");
-       return GetAvailableLanguagesFallbackN();
 }
 
 
 IList*
-_LocaleManagerImpl::GetAvailableLanguagesFallbackN(void)
+_LocaleManagerImpl::GetAvailableLanguageLocalesN(void)
 {
-       std::unique_ptr<IList, AllElementsDeleter> pLocaleList (GetAvailableLocalesN());
-       std::unique_ptr<HashMap> pLanguageMap(new (std::nothrow) HashMap());
+       std::unique_ptr<ArrayList> pAvailableLanguageList(new (std::nothrow) ArrayList(SingleObjectDeleter));
+       SysTryReturn(NID_LCL, pAvailableLanguageList, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
 
-       SysTryReturn(NID_LCL, pLanguageMap, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
+       xmlNodePtr cur = null;
+       std::unique_ptr< xmlDoc, FreeXmlDoc > pDoc(xmlParseFile(LANGUAGE_LIST_FILE_PATH));
+       SysTryReturn(NID_LCL, pDoc != null, null, E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] It is failed to get the langlist from the resource.");
 
-       pLanguageMap->Construct();
+       cur = xmlDocGetRootElement(pDoc.get());
+       SysTryReturn(NID_LCL, cur != null, null, E_EMPTY_BODY, "[E_EMPTY_BODY] It is empty document.");
+       SysTryReturn(NID_LCL, xmlStrcmp(cur->name, (const xmlChar *) "langlist") == 0, null, E_INVALID_CONTENT, "[E_INVALID_CONTENT] The document is wrong type");
 
-       for (int i = 0; i < pLocaleList->GetCount() ; i++)
-       {
-               Locale* pLocale = (Locale*)pLocaleList->GetAt(i);
-               std::unique_ptr<String> pLanguageCode(new (std::nothrow) String(pLocale->GetLanguageCodeString()));
-               SysTryReturn(NID_LCL, pLanguageCode, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
+       cur = cur->xmlChildrenNode;
 
-               if (!pLanguageMap->ContainsKey(*pLanguageCode))
-               {
-                       std::unique_ptr<String> pDummyValue(new (std::nothrow) String());
-                       SysTryReturn(NID_LCL, pDummyValue, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
+       pAvailableLanguageList->Construct();
 
-                       result r = pLanguageMap->Add(*(pLanguageCode.get()), *(pDummyValue.get()));
-                       SysTryReturn(NID_LCL, !IsFailed(r), null, E_SYSTEM, "It is failed to make a language list.");
-                       pLanguageCode.release();
-                       pDummyValue.release();
+       for (xmlNodePtr cur_node = cur; cur_node; cur_node = cur_node->next)
+       {
+               if (cur_node->type == XML_ELEMENT_NODE)
+               {
+                       std::unique_ptr< char > pLocId((char*)xmlGetProp(cur_node, (const xmlChar *)"id"));
+                       Locale loc = _LocaleImpl(pLocId.get()).GetOspLocale();
+                       if (_LocaleImpl::IsSupported(loc))
+                       {
+                               std::unique_ptr< Locale > pLocale(new (std::nothrow) Locale(loc));
+                               SysTryReturn(NID_LCL, pLocale, null, E_OUT_OF_MEMORY,
+                                       "[%s] Memory allocation failed",GetErrorMessage(E_OUT_OF_MEMORY));
+
+                               if (!pAvailableLanguageList->Contains(*(pLocale.get())))
+                               {
+                                       result r = pAvailableLanguageList->Add(*(pLocale.get()));
+                                       SysTryReturn(NID_LCL, r == E_SUCCESS, null, E_SYSTEM,
+                                               "[%s] It is failed to add a locale string [%s].", GetErrorMessage(E_SYSTEM), pLocId.get());
+                                       pLocale.release();
+                               }
+                       }
                }
        }
 
-       IList* pAvailableLanguageList;
-       pAvailableLanguageList = pLanguageMap->GetKeysN();
        SetLastResult(E_SUCCESS);
-       pLanguageMap->RemoveAll();
-       return pAvailableLanguageList;
+       return pAvailableLanguageList.release();
 }
 
 
@@ -540,34 +317,34 @@ _LocaleManagerImpl::GetAvailableTimeZonesN(void)
        result r = E_SUCCESS;
 
        std::unique_ptr<HashMap> pTimeZoneMap(new (std::nothrow) HashMap(SingleObjectDeleter));
-       SysTryCatch(NID_LCL, pTimeZoneMap, null, E_OUT_OF_MEMORY,
+       SysTryReturn(NID_LCL, pTimeZoneMap, null, E_OUT_OF_MEMORY,
                        "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
        r = file.Construct(tzFilePath, "r");
-       SysTryCatch(NID_LCL, r == E_SUCCESS, ,E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] It is failed to get the tzlist from the ini file.");
+       SysTryReturn(NID_LCL, r == E_SUCCESS, null,E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] It is failed to get the tzlist from the ini file.");
 
        pTimeZoneMap->Construct();
 
        do
        {
                std::unique_ptr<String> pTimeZone(new (std::nothrow) String());
-               SysTryCatch(NID_LCL, pTimeZone, null, E_OUT_OF_MEMORY,
+               SysTryReturn(NID_LCL, pTimeZone, null, E_OUT_OF_MEMORY,
                                "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
                r = file.Read(*(pTimeZone.get()));
                if ( r == E_END_OF_FILE)
                {
                        break;
                }
-               SysTryCatch(NID_LCL, r == E_SUCCESS, , r, "[%s] It is failed to read the tzlist.", GetErrorMessage(r));
+               SysTryReturn(NID_LCL, r == E_SUCCESS, null, r, "[%s] It is failed to read the tzlist.", GetErrorMessage(r));
                pTimeZone->Replace(L"\n", L"\0");
 
                if (!pTimeZoneMap->ContainsKey(*(pTimeZone.get())))
                {
                        std::unique_ptr<String> pDummyValue(new (std::nothrow) String());
-                       SysTryCatch(NID_LCL, pDummyValue, null, E_OUT_OF_MEMORY,
+                       SysTryReturn(NID_LCL, pDummyValue, null, E_OUT_OF_MEMORY,
                                        "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
                        r = pTimeZoneMap->Add(*(pTimeZone.get()), *(pDummyValue.get()));
-                       SysTryCatch(NID_LCL, r == E_SUCCESS, , r,"[%s] It is failed to make the tz list.", GetErrorMessage(r));
+                       SysTryReturn(NID_LCL, r == E_SUCCESS, null, r,"[%s] It is failed to make the tz list.", GetErrorMessage(r));
                        pTimeZone.release();
                        pDummyValue.release();
                }
@@ -575,45 +352,6 @@ _LocaleManagerImpl::GetAvailableTimeZonesN(void)
 
        SetLastResult(E_SUCCESS);
        return pTimeZoneMap.release();
-
-CATCH:
-       return GetAvailableTimeZonesFallbackN();
-}
-
-
-IMap*
-_LocaleManagerImpl::GetAvailableTimeZonesFallbackN(void)
-{
-       std::unique_ptr<HashMap> pTimeZoneMap(new (std::nothrow) HashMap(SingleObjectDeleter));
-       SysTryReturn(NID_LCL, pTimeZoneMap, null, E_OUT_OF_MEMORY,
-                       "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
-
-       result r = E_SUCCESS;
-       int index = 0;
-               
-       pTimeZoneMap->Construct();
-       
-       do
-       {
-               std::unique_ptr< String > pTimeZone(new (std::nothrow) String(TimeZoneList[index++]));
-               SysTryReturn(NID_LCL, pTimeZone, null, E_OUT_OF_MEMORY,
-                       "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-               if (!pTimeZoneMap->ContainsKey(*(pTimeZone.get())))
-               {
-                       std::unique_ptr< String > pDummyValue (new  (std::nothrow) String());
-                       SysTryReturn(NID_LCL, pDummyValue, null, E_OUT_OF_MEMORY,"[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
-                       r = pTimeZoneMap->Add(*(pTimeZone.get()), *(pDummyValue.get()));
-                       SysTryReturn(NID_LCL, !IsFailed(r), null, E_SYSTEM, "It is failed to make Timezone list.");
-                       
-                       pTimeZone.release();
-                       pDummyValue.release();
-               }
-       }while (index < TIMEZONE_MAX);
-
-       SetLastResult(E_SUCCESS);
-       return pTimeZoneMap.release();
 }
 
 
index 0b26b74..a5a06a3 100644 (file)
@@ -46,12 +46,11 @@ public:
 
        static Tizen::Base::String GetSelectedLanguage(void);
        static Tizen::Base::Collection::IList* GetAvailableLanguagesN(void);
-       static Tizen::Base::Collection::IList* GetAvailableLanguagesFallbackN(void);
+       // Get available language locales
+       static Tizen::Base::Collection::IList* GetAvailableLanguageLocalesN(void);
 
        static Tizen::Base::Collection::IMap* GetAvailableTimeZonesN(void);
        static Tizen::Base::Collection::IMap* GetAvailableTimeZonesN(int rawOffset);
-       static Tizen::Base::Collection::IMap* GetAvailableTimeZonesFallbackN(void);
-       
        static Tizen::Base::Collection::IMap* GetAvailableTimeZonesN(U_ICU_NAMESPACE::StringEnumeration* pIcuTZStrList);
 
        static Tizen::Locales::TimeZone GetSystemTimeZone(void);