xref: /reactos/dll/cpl/input/locale_list.c (revision 8a978a17)
1 /*
2  * PROJECT:         input.dll
3  * FILE:            dll/cpl/input/locale_list.c
4  * PURPOSE:         input.dll
5  * PROGRAMMER:      Dmitry Chapyshev (dmitry@reactos.org)
6  */
7 
8 #include "locale_list.h"
9 
10 
11 static LOCALE_LIST_NODE *_LocaleList = NULL;
12 
13 
14 static LOCALE_LIST_NODE*
15 LocaleList_Append(DWORD dwId, const WCHAR *pszName)
16 {
17     LOCALE_LIST_NODE *pCurrent;
18     LOCALE_LIST_NODE *pNew;
19 
20     if (pszName == NULL)
21         return NULL;
22 
23     pCurrent = _LocaleList;
24 
25     pNew = (LOCALE_LIST_NODE*)malloc(sizeof(LOCALE_LIST_NODE));
26     if (pNew == NULL)
27         return NULL;
28 
29     ZeroMemory(pNew, sizeof(LOCALE_LIST_NODE));
30 
31     pNew->pszName = _wcsdup(pszName);
32     if (pNew->pszName == NULL)
33     {
34         free(pNew);
35         return NULL;
36     }
37 
38     pNew->dwId = dwId;
39 
40     if (pCurrent == NULL)
41     {
42         _LocaleList = pNew;
43     }
44     else
45     {
46         while (pCurrent->pNext != NULL)
47         {
48             pCurrent = pCurrent->pNext;
49         }
50 
51         pNew->pPrev = pCurrent;
52         pCurrent->pNext = pNew;
53     }
54 
55     return pNew;
56 }
57 
58 
59 VOID
60 LocaleList_Destroy(VOID)
61 {
62     LOCALE_LIST_NODE *pCurrent;
63 
64     if (_LocaleList == NULL)
65         return;
66 
67     pCurrent = _LocaleList;
68 
69     while (pCurrent != NULL)
70     {
71         LOCALE_LIST_NODE *pNext = pCurrent->pNext;
72 
73         free(pCurrent->pszName);
74         free(pCurrent);
75 
76         pCurrent = pNext;
77     }
78 
79     _LocaleList = NULL;
80 }
81 
82 
83 LOCALE_LIST_NODE*
84 LocaleList_Create(VOID)
85 {
86     WCHAR szValue[MAX_PATH];
87     DWORD dwIndex;
88     DWORD dwSize;
89     HKEY hKey;
90 
91     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
92                       L"SYSTEM\\CurrentControlSet\\Control\\Nls\\Language",
93                       0,
94                       KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE,
95                       &hKey) != ERROR_SUCCESS)
96     {
97         return NULL;
98     }
99 
100     dwSize = ARRAYSIZE(szValue);
101     dwIndex = 0;
102 
103     while (RegEnumValueW(hKey, dwIndex, szValue, &dwSize,
104                          NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
105     {
106         WCHAR szName[MAX_STR_LEN];
107         DWORD dwId;
108 
109         dwId = DWORDfromString(szValue);
110 
111         if (GetLocaleInfoW(LOWORD(dwId),
112                            LOCALE_SLANGUAGE,
113                            szName, ARRAYSIZE(szName)))
114         {
115             LocaleList_Append(dwId, szName);
116         }
117 
118         dwSize = ARRAYSIZE(szValue);
119         ++dwIndex;
120     }
121 
122     RegCloseKey(hKey);
123 
124     return _LocaleList;
125 }
126 
127 
128 LOCALE_LIST_NODE*
129 LocaleList_GetByHkl(HKL hkl)
130 {
131     LOCALE_LIST_NODE *pCurrent;
132 
133     for (pCurrent = _LocaleList; pCurrent != NULL; pCurrent = pCurrent->pNext)
134     {
135         if (LOWORD(pCurrent->dwId) == LOWORD(hkl))
136         {
137             return pCurrent;
138         }
139     }
140 
141     return NULL;
142 }
143 
144 
145 LOCALE_LIST_NODE*
146 LocaleList_GetFirst(VOID)
147 {
148     return _LocaleList;
149 }
150