Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / cpl / input / locale_list.c
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 }