[KERNEL32] Implement InvalidateNLSCache
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 16 Apr 2019 12:41:58 +0000 (21:41 +0900)
committerKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 16 Apr 2019 12:41:58 +0000 (21:41 +0900)
dll/win32/kernel32/winnls/string/japanese.c
dll/win32/kernel32/winnls/string/japanese.h
dll/win32/kernel32/winnls/string/lang.c

index ddee64f..2cd42e8 100644 (file)
@@ -14,6 +14,7 @@
 
 /* #define DONT_USE_REGISTRY */
 
 
 /* #define DONT_USE_REGISTRY */
 
+static BOOL         s_bIsGannenCached = FALSE;
 static DWORD        s_JapaneseEraCount = 0;
 static JAPANESE_ERA s_JapaneseEraTable[JAPANESE_ERA_MAX]
 #ifdef DONT_USE_REGISTRY
 static DWORD        s_JapaneseEraCount = 0;
 static JAPANESE_ERA s_JapaneseEraTable[JAPANESE_ERA_MAX]
 #ifdef DONT_USE_REGISTRY
@@ -34,6 +35,12 @@ BOOL NLS_RegEnumValue(HANDLE hKey, UINT ulIndex,
                       LPWSTR szValueName, ULONG valueNameSize,
                       LPWSTR szValueData, ULONG valueDataSize);
 
                       LPWSTR szValueName, ULONG valueNameSize,
                       LPWSTR szValueData, ULONG valueDataSize);
 
+void JapaneseEra_ClearCache(void)
+{
+    s_bIsGannenCached = FALSE;
+    s_JapaneseEraCount = 0;
+}
+
 static INT JapaneseEra_Compare(const void *e1, const void *e2)
 {
     PCJAPANESE_ERA pEra1 = (PCJAPANESE_ERA)e1;
 static INT JapaneseEra_Compare(const void *e1, const void *e2)
 {
     PCJAPANESE_ERA pEra1 = (PCJAPANESE_ERA)e1;
@@ -61,9 +68,9 @@ BOOL JapaneseEra_IsFirstYearGannen(void)
     HANDLE KeyHandle;
     DWORD dwIndex;
     WCHAR szName[32], szValue[32];
     HANDLE KeyHandle;
     DWORD dwIndex;
     WCHAR szName[32], szValue[32];
-    static BOOL s_bIsCached = FALSE, s_bFirstIsGannen = TRUE;
+    static BOOL s_bFirstIsGannen = TRUE;
 
 
-    if (s_bIsCached)
+    if (s_bIsGannenCached)
         return s_bFirstIsGannen;
 
     KeyHandle = NLS_RegOpenKey(NULL, L"\\Registry\\Machine\\System\\"
         return s_bFirstIsGannen;
 
     KeyHandle = NLS_RegOpenKey(NULL, L"\\Registry\\Machine\\System\\"
@@ -71,6 +78,7 @@ BOOL JapaneseEra_IsFirstYearGannen(void)
     if (!KeyHandle)
         return TRUE;
 
     if (!KeyHandle)
         return TRUE;
 
+    s_bFirstIsGannen = TRUE;
     for (dwIndex = 0; dwIndex < 16; ++dwIndex)
     {
         if (!NLS_RegEnumValue(KeyHandle, dwIndex, szName, sizeof(szName),
     for (dwIndex = 0; dwIndex < 16; ++dwIndex)
     {
         if (!NLS_RegEnumValue(KeyHandle, dwIndex, szName, sizeof(szName),
@@ -88,7 +96,7 @@ BOOL JapaneseEra_IsFirstYearGannen(void)
 
     NtClose(KeyHandle);
 
 
     NtClose(KeyHandle);
 
-    s_bIsCached = TRUE;
+    s_bIsGannenCached = TRUE;
 
     return s_bFirstIsGannen;
 #endif
 
     return s_bFirstIsGannen;
 #endif
index a4829be..fda4f1d 100644 (file)
@@ -20,3 +20,4 @@ typedef const JAPANESE_ERA *PCJAPANESE_ERA;
 
 BOOL JapaneseEra_IsFirstYearGannen(void);
 PCJAPANESE_ERA JapaneseEra_Find(const SYSTEMTIME *pst OPTIONAL);
 
 BOOL JapaneseEra_IsFirstYearGannen(void);
 PCJAPANESE_ERA JapaneseEra_Find(const SYSTEMTIME *pst OPTIONAL);
+void JapaneseEra_ClearCache(void);
index 7d13980..000b3e1 100644 (file)
@@ -28,6 +28,9 @@
 DEBUG_CHANNEL(nls);
 
 #include "lcformat_private.h"
 DEBUG_CHANNEL(nls);
 
 #include "lcformat_private.h"
+#ifdef __REACTOS__
+    #include "japanese.h"
+#endif
 
 #define REG_SZ 1
 extern int wine_fold_string(int flags, const WCHAR *src, int srclen, WCHAR *dst, int dstlen);
 
 #define REG_SZ 1
 extern int wine_fold_string(int flags, const WCHAR *src, int srclen, WCHAR *dst, int dstlen);
@@ -3326,8 +3329,13 @@ BOOL WINAPI EnumSystemGeoID(GEOCLASS geoclass, GEOID parent, GEO_ENUMPROC enumpr
  */
 BOOL WINAPI InvalidateNLSCache(void)
 {
  */
 BOOL WINAPI InvalidateNLSCache(void)
 {
+#ifdef __REACTOS__
+    JapaneseEra_ClearCache();
+    return TRUE;
+#else
   FIXME("() stub\n");
   return FALSE;
   FIXME("() stub\n");
   return FALSE;
+#endif
 }
 
 /******************************************************************************
 }
 
 /******************************************************************************