Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / text / win / LocaleWin.cpp
index 54fc5ff..d19693a 100644 (file)
 
 #include "DateComponents.h"
 #include "DateTimeFormat.h"
-#include "Language.h"
 #include "LocalizedStrings.h"
 #include <limits>
 #include <windows.h>
 #include <wtf/CurrentTime.h>
 #include <wtf/DateMath.h>
 #include <wtf/HashMap.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
+#include <wtf/Language.h>
 #include <wtf/text/StringBuilder.h>
 #include <wtf/text/StringHash.h>
 
-using namespace std;
 
 namespace WebCore {
+using namespace std;
 
-typedef LCID (WINAPI* LocaleNameToLCIDPtr)(LPCWSTR, DWORD);
-typedef HashMap<String, LCID> NameToLCIDMap;
+typedef HashMap<String, LCID, ASCIICaseInsensitiveHash> NameToLCIDMap;
 
 static String extractLanguageCode(const String& locale)
 {
@@ -60,95 +57,30 @@ static String extractLanguageCode(const String& locale)
     return locale.left(dashPosition);
 }
 
-static String removeLastComponent(const String& name)
-{
-    size_t lastSeparator = name.reverseFind('-');
-    if (lastSeparator == notFound)
-        return emptyString();
-    return name.left(lastSeparator);
-}
-
-static void ensureNameToLCIDMap(NameToLCIDMap& map)
-{
-    if (!map.isEmpty())
-        return;
-    // http://www.microsoft.com/resources/msdn/goglobal/default.mspx
-    // We add only locales used in layout tests for now.
-    map.add("ar", 0x0001);
-    map.add("ar-eg", 0x0C01);
-    map.add("de", 0x0007);
-    map.add("de-de", 0x0407);
-    map.add("el", 0x0008);
-    map.add("el-gr", 0x0408);
-    map.add("en", 0x0009);
-    map.add("en-gb", 0x0809);
-    map.add("en-us", 0x0409);
-    map.add("fr", 0x000C);
-    map.add("fr-fr", 0x040C);
-    map.add("he", 0x000D);
-    map.add("he-il", 0x040D);
-    map.add("hi", 0x0039);
-    map.add("hi-in", 0x0439);
-    map.add("ja", 0x0011);
-    map.add("ja-jp", 0x0411);
-    map.add("ko", 0x0012);
-    map.add("ko-kr", 0x0412);
-    map.add("ru", 0x0019);
-    map.add("ru-ru", 0x0419);
-    map.add("zh-cn", 0x0804);
-    map.add("zh-tw", 0x0404);
-}
-
-// Fallback implementation of LocaleNameToLCID API. This is used for
-// testing on Windows XP.
-// FIXME: Remove this, ensureNameToLCIDMap, and removeLastComponent when we drop
-// Windows XP support.
-static LCID WINAPI convertLocaleNameToLCID(LPCWSTR name, DWORD)
+static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, String& locale)
 {
-    if (!name || !name[0])
-        return LOCALE_USER_DEFAULT;
-    DEFINE_STATIC_LOCAL(NameToLCIDMap, map, ());
-    ensureNameToLCIDMap(map);
-    String localeName = String(name).replace('_', '-').lower();
-    do {
-        NameToLCIDMap::const_iterator iterator = map.find(localeName);
-        if (iterator != map.end())
-            return iterator->value;
-        localeName = removeLastComponent(localeName);
-    } while (!localeName.isEmpty());
-    return LOCALE_USER_DEFAULT;
-}
-
-static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, LocaleNameToLCIDPtr localeNameToLCID, String& locale)
-{
-    String localeLanguageCode = extractLanguageCode(locale);
-    if (equalIgnoringCase(localeLanguageCode, userDefaultLanguageCode))
+    if (equalIgnoringASCIICase(extractLanguageCode(locale), userDefaultLanguageCode))
         return userDefaultLCID;
-    return localeNameToLCID(locale.charactersWithNullTermination().data(), 0);
+    return LocaleNameToLCID(locale.charactersWithNullTermination().data(), 0);
 }
 
 static LCID LCIDFromLocale(const AtomicString& locale)
 {
-    // LocaleNameToLCID() is available since Windows Vista.
-    LocaleNameToLCIDPtr localeNameToLCID = reinterpret_cast<LocaleNameToLCIDPtr>(::GetProcAddress(::GetModuleHandle(L"kernel32"), "LocaleNameToLCID"));
-    if (!localeNameToLCID)
-        localeNameToLCID = convertLocaleNameToLCID;
-
     // According to MSDN, 9 is enough for LOCALE_SISO639LANGNAME.
     const size_t languageCodeBufferSize = 9;
     WCHAR lowercaseLanguageCode[languageCodeBufferSize];
     ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lowercaseLanguageCode, languageCodeBufferSize);
     String userDefaultLanguageCode = String(lowercaseLanguageCode);
 
-    LCID lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, localeNameToLCID, String(locale));
+    LCID lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, String(locale));
     if (!lcid)
-        lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, localeNameToLCID, defaultLanguage());
+        lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, userDefaultLanguageCode, defaultLanguage());
     return lcid;
 }
 
-PassOwnPtr<Locale> Locale::create(const AtomicString& locale)
+std::unique_ptr<Locale> Locale::create(const AtomicString& locale)
 {
-    return LocaleWin::create(LCIDFromLocale(locale));
+    return std::make_unique<LocaleWin>(LCIDFromLocale(locale));
 }
 
 inline LocaleWin::LocaleWin(LCID lcid)
@@ -157,24 +89,17 @@ inline LocaleWin::LocaleWin(LCID lcid)
 {
 }
 
-PassOwnPtr<LocaleWin> LocaleWin::create(LCID lcid)
-{
-    return adoptPtr(new LocaleWin(lcid));
-}
-
-LocaleWin::~LocaleWin()
-{
-}
+LocaleWin::~LocaleWin() = default;
 
 String LocaleWin::getLocaleInfoString(LCTYPE type)
 {
     int bufferSizeWithNUL = ::GetLocaleInfo(m_lcid, type, 0, 0);
     if (bufferSizeWithNUL <= 0)
         return String();
-    Vector<UChar> buffer(bufferSizeWithNUL);
+    StringVector<UChar> buffer(bufferSizeWithNUL);
     ::GetLocaleInfo(m_lcid, type, buffer.data(), bufferSizeWithNUL);
     buffer.shrink(bufferSizeWithNUL - 1);
-    return String::adopt(buffer);
+    return String::adopt(WTFMove(buffer));
 }
 
 void LocaleWin::getLocaleInfo(LCTYPE type, DWORD& result)
@@ -523,7 +448,8 @@ void LocaleWin::initializeLocaleData()
     case NegativeFormatSpaceSignSuffix:
         negativeSuffix = " " + negativeSign;
         break;
-    case NegativeFormatSignPrefix: // Fall through.
+    case NegativeFormatSignPrefix:
+        FALLTHROUGH;
     default:
         negativePrefix = negativeSign;
         break;