Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / text / win / LocaleWin.cpp
index 3d08c41..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/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
+#include <wtf/HashMap.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, ASCIICaseInsensitiveHash> NameToLCIDMap;
 
 static String extractLanguageCode(const String& locale)
 {
@@ -57,69 +57,49 @@ static String extractLanguageCode(const String& locale)
     return locale.left(dashPosition);
 }
 
-static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, LocaleNameToLCIDPtr localeNameToLCID, String& locale)
+static LCID LCIDFromLocaleInternal(LCID userDefaultLCID, const String& userDefaultLanguageCode, String& locale)
 {
-    String localeLanguageCode = extractLanguageCode(locale);
-    if (equalIgnoringCase(localeLanguageCode, userDefaultLanguageCode))
+    if (equalIgnoringASCIICase(extractLanguageCode(locale), userDefaultLanguageCode))
         return userDefaultLCID;
-    return localeNameToLCID(locale.charactersWithNullTermination(), 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)
-        return LOCALE_USER_DEFAULT;
-
     // 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)
     : m_lcid(lcid)
     , m_didInitializeNumberData(false)
 {
-#if ENABLE(CALENDAR_PICKER)
-    DWORD value = 0;
-    getLocaleInfo(LOCALE_IFIRSTDAYOFWEEK, value);
-    // 0:Monday, ..., 6:Sunday.
-    // We need 1 for Monday, 0 for Sunday.
-    m_firstDayOfWeek = (value + 1) % 7;
-#endif
-}
-
-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)
@@ -129,6 +109,7 @@ void LocaleWin::getLocaleInfo(LCTYPE type, DWORD& result)
 
 void LocaleWin::ensureShortMonthLabels()
 {
+#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     if (!m_shortMonthLabels.isEmpty())
         return;
     const LCTYPE types[12] = {
@@ -156,10 +137,12 @@ void LocaleWin::ensureShortMonthLabels()
             return;
         }
     }
+#endif
 }
 
 // -------------------------------- Tokenized date format
 
+#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
 static unsigned countContinuousLetters(const String& format, unsigned index)
 {
     unsigned count = 1;
@@ -257,9 +240,11 @@ static String convertWindowsDateTimeFormat(const String& format)
     commitLiteralToken(literalBuffer, converted);
     return converted.toString();
 }
+#endif
 
 void LocaleWin::ensureMonthLabels()
 {
+#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     if (!m_monthLabels.isEmpty())
         return;
     const LCTYPE types[12] = {
@@ -287,34 +272,7 @@ void LocaleWin::ensureMonthLabels()
             return;
         }
     }
-}
-
-void LocaleWin::ensureWeekDayShortLabels()
-{
-    if (!m_weekDayShortLabels.isEmpty())
-        return;
-    const LCTYPE types[7] = {
-        LOCALE_SABBREVDAYNAME7, // Sunday
-        LOCALE_SABBREVDAYNAME1, // Monday
-        LOCALE_SABBREVDAYNAME2,
-        LOCALE_SABBREVDAYNAME3,
-        LOCALE_SABBREVDAYNAME4,
-        LOCALE_SABBREVDAYNAME5,
-        LOCALE_SABBREVDAYNAME6
-    };
-    m_weekDayShortLabels.reserveCapacity(WTF_ARRAY_LENGTH(types));
-    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(types); ++i) {
-        m_weekDayShortLabels.append(getLocaleInfoString(types[i]));
-        if (m_weekDayShortLabels.last().isEmpty()) {
-            m_weekDayShortLabels.shrink(0);
-            m_weekDayShortLabels.reserveCapacity(WTF_ARRAY_LENGTH(WTF::weekdayName));
-            for (unsigned w = 0; w < WTF_ARRAY_LENGTH(WTF::weekdayName); ++w) {
-                // weekdayName starts with Monday.
-                m_weekDayShortLabels.append(WTF::weekdayName[(w + 6) % 7]);
-            }
-            return;
-        }
-    }
+#endif
 }
 
 #if ENABLE(DATE_AND_TIME_INPUT_TYPES)
@@ -323,28 +281,7 @@ const Vector<String>& LocaleWin::monthLabels()
     ensureMonthLabels();
     return m_monthLabels;
 }
-#endif
-
-#if ENABLE(CALENDAR_PICKER)
-const Vector<String>& LocaleWin::weekDayShortLabels()
-{
-    ensureWeekDayShortLabels();
-    return m_weekDayShortLabels;
-}
-
-unsigned LocaleWin::firstDayOfWeek()
-{
-    return m_firstDayOfWeek;
-}
-
-bool LocaleWin::isRTL()
-{
-    WTF::Unicode::Direction dir = WTF::Unicode::direction(monthLabels()[0][0]);
-    return dir == WTF::Unicode::RightToLeft || dir == WTF::Unicode::RightToLeftArabic;
-}
-#endif
 
-#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
 String LocaleWin::dateFormat()
 {
     if (m_dateFormat.isNull())
@@ -364,6 +301,13 @@ String LocaleWin::monthFormat()
     return m_monthFormat;
 }
 
+String LocaleWin::shortMonthFormat()
+{
+    if (m_shortMonthFormat.isNull())
+        m_shortMonthFormat = convertWindowsDateTimeFormat(getLocaleInfoString(LOCALE_SYEARMONTH)).replace("MMMM", "MMM");
+    return m_shortMonthFormat;
+}
+
 String LocaleWin::timeFormat()
 {
     if (m_timeFormatWithSeconds.isNull())
@@ -390,6 +334,30 @@ String LocaleWin::shortTimeFormat()
     return m_timeFormatWithoutSeconds;
 }
 
+String LocaleWin::dateTimeFormatWithSeconds()
+{
+    if (!m_dateTimeFormatWithSeconds.isNull())
+        return m_dateTimeFormatWithSeconds;
+    StringBuilder builder;
+    builder.append(dateFormat());
+    builder.append(' ');
+    builder.append(timeFormat());
+    m_dateTimeFormatWithSeconds = builder.toString();
+    return m_dateTimeFormatWithSeconds;
+}
+
+String LocaleWin::dateTimeFormatWithoutSeconds()
+{
+    if (!m_dateTimeFormatWithoutSeconds.isNull())
+        return m_dateTimeFormatWithoutSeconds;
+    StringBuilder builder;
+    builder.append(dateFormat());
+    builder.append(' ');
+    builder.append(shortTimeFormat());
+    m_dateTimeFormatWithoutSeconds = builder.toString();
+    return m_dateTimeFormatWithoutSeconds;
+}
+
 const Vector<String>& LocaleWin::shortMonthLabels()
 {
     ensureShortMonthLabels();
@@ -480,7 +448,8 @@ void LocaleWin::initializeLocaleData()
     case NegativeFormatSpaceSignSuffix:
         negativeSuffix = " " + negativeSign;
         break;
-    case NegativeFormatSignPrefix: // Fall through.
+    case NegativeFormatSignPrefix:
+        FALLTHROUGH;
     default:
         negativePrefix = negativeSign;
         break;