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