ReactOS  0.4.15-dev-2771-g6d441f7
intl.c
Go to the documentation of this file.
1 /*
2  * ReactOS
3  * Copyright (C) 2004 ReactOS Team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  * PROJECT: ReactOS International Control Panel
21  * FILE: dll/cpl/intl/intl.c
22  * PURPOSE: Property sheet code
23  * PROGRAMMER: Eric Kohl
24  */
25 
26 #include "intl.h"
27 
28 #include <debug.h>
29 
30 #define NUM_APPLETS (1)
31 
32 #define BUFFERSIZE 512
33 
34 static LONG APIENTRY
36 
37 
42 
43 
44 /* Applets */
46 {
48 };
49 
50 VOID
52 {
53  WCHAR szErrorText[BUFFERSIZE];
54  WCHAR szErrorCaption[BUFFERSIZE];
55 
56  LoadStringW(hApplet, msg, szErrorText, sizeof(szErrorText) / sizeof(WCHAR));
57  LoadStringW(hApplet, IDS_ERROR, szErrorCaption, sizeof(szErrorCaption) / sizeof(WCHAR));
58 
59  MessageBoxW(NULL, szErrorText, szErrorCaption, MB_OK | MB_ICONERROR);
60 }
61 
62 INT
64  HWND hwnd,
65  UINT uType,
66  UINT uCaptionId,
67  UINT uMessageId)
68 {
69  WCHAR szErrorText[BUFFERSIZE];
70  WCHAR szErrorCaption[BUFFERSIZE];
71 
72  LoadStringW(hApplet, uMessageId, szErrorText, sizeof(szErrorText) / sizeof(WCHAR));
73  LoadStringW(hApplet, uCaptionId, szErrorCaption, sizeof(szErrorCaption) / sizeof(WCHAR));
74 
75  return MessageBoxW(hwnd, szErrorText, szErrorCaption, uType);
76 }
77 
78 static VOID
80 {
81  ZeroMemory(psp, sizeof(PROPSHEETPAGE));
82  psp->dwSize = sizeof(PROPSHEETPAGE);
83  psp->dwFlags = PSP_DEFAULT;
84  psp->hInstance = hApplet;
85  psp->pszTemplate = MAKEINTRESOURCE(idDlg);
86  psp->pfnDlgProc = DlgProc;
87  psp->lParam = lParam;
88 }
89 
90 BOOL
92 {
93  PWSTR lpCmdLine;
94  PWSTR lpSwitch;
95  size_t len;
96 
97  lpCmdLine = GetCommandLineW();
98 
99  lpSwitch = wcsstr(lpCmdLine, L"/f:\"");
100  if (!lpSwitch)
101  return FALSE;
102 
103  len = wcslen(lpSwitch);
104  if (len < 5 || lpSwitch[len-1] != L'\"')
105  {
106  DPRINT1("Invalid switch: %ls\n", lpSwitch);
107  return FALSE;
108  }
109 
110  lpSwitch[len-1] = L'\0';
111 
114  {
115  DPRINT1("Failed to open INF file: %ls\n", &lpSwitch[4]);
116  return FALSE;
117  }
118 
119  return TRUE;
120 }
121 
122 VOID
124 {
125  INFCONTEXT InfContext;
126  WCHAR szBuffer[30];
127 
129  L"Unattend",
130  L"LocaleID",
131  &InfContext))
132  {
134  DPRINT1("SetupFindFirstLine failed\n");
135  return;
136  }
137 
138  if (!SetupGetStringFieldW(&InfContext, 1, szBuffer,
139  sizeof(szBuffer) / sizeof(WCHAR), NULL))
140  {
142  DPRINT1("SetupGetStringField failed\n");
143  return;
144  }
145 
146  UnattendLCID = wcstoul(szBuffer, NULL, 16);
149 }
150 
151 static int CALLBACK
153 {
154  // NOTE: This callback is needed to set large icon correctly.
155  HICON hIcon;
156  switch (uMsg)
157  {
158  case PSCB_INITIALIZED:
159  {
161  SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
162  break;
163  }
164  }
165  return 0;
166 }
167 
168 static LONG APIENTRY
170 {
171  TCHAR Caption[BUFFERSIZE];
172  PROPSHEETPAGE psp[3];
173  PROPSHEETHEADER psh;
174  PGLOBALDATA pGlobalData;
175  INT nPage = 0;
176  LONG ret;
177 
178  if (OpenSetupInf())
179  {
180  ParseSetupInf();
181  }
182 
183  if (uMsg == CPL_STARTWPARMSW && lParam != 0)
184  nPage = _wtoi((PWSTR)lParam);
185 
186  pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBALDATA));
187  if (pGlobalData == NULL)
188  return FALSE;
189 
190  pGlobalData->SystemLCID = GetSystemDefaultLCID();
191  pGlobalData->bIsUserAdmin = IsUserAdmin();
192 
193  LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
194 
195  ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
196  psh.dwSize = sizeof(PROPSHEETHEADER);
198  psh.hwndParent = hwnd;
199  psh.hInstance = hApplet;
200  psh.pszIcon = MAKEINTRESOURCEW(IDC_CPLICON);
201  psh.pszCaption = Caption;
202  psh.nPages = 0;
203  psh.nStartPage = 0;
204  psh.ppsp = psp;
205  psh.pfnCallback = PropSheetProc;
206 
208  psh.nPages++;
210  psh.nPages++;
211 
212  if (pGlobalData->bIsUserAdmin)
213  {
215  psh.nPages++;
216  }
217 
218  if (nPage != 0 && nPage <= psh.nPages)
219  psh.nStartPage = nPage;
220 
221  ret = (LONG)(PropertySheet(&psh) != -1);
222  if (ret > 0)
224 
225  HeapFree(GetProcessHeap(), 0, pGlobalData);
226 
227  return ret;
228 }
229 
230 
231 /* Control Panel Callback */
233 CPlApplet(HWND hwndCpl,
234  UINT uMsg,
235  LPARAM lParam1,
236  LPARAM lParam2)
237 {
238  switch (uMsg)
239  {
240  case CPL_INIT:
241  return TRUE;
242 
243  case CPL_GETCOUNT:
244  return NUM_APPLETS;
245 
246  case CPL_INQUIRE:
247  {
248  CPLINFO *CPlInfo = (CPLINFO*)lParam2;
249  UINT uAppIndex = (UINT)lParam1;
250 
251  CPlInfo->lData = 0;
252  CPlInfo->idIcon = Applets[uAppIndex].idIcon;
253  CPlInfo->idName = Applets[uAppIndex].idName;
254  CPlInfo->idInfo = Applets[uAppIndex].idDescription;
255  break;
256  }
257 
258  case CPL_DBLCLK:
259  Applets[(UINT)lParam1].AppletProc(hwndCpl, uMsg, lParam1, lParam2);
260  break;
261 
262  case CPL_STARTWPARMSW:
263  return Applets[(UINT)lParam1].AppletProc(hwndCpl, uMsg, lParam1, lParam2);
264  }
265 
266  return FALSE;
267 }
268 
269 
270 BOOL WINAPI
272  DWORD dwReason,
273  LPVOID lpReserved)
274 {
275  switch(dwReason)
276  {
277  case DLL_PROCESS_ATTACH:
278  case DLL_THREAD_ATTACH:
279  hApplet = hinstDLL;
280  break;
281  }
282 
283  return TRUE;
284 }
DWORD IsUnattendedSetupEnabled
Definition: intl.c:40
BOOL WINAPI SetupFindFirstLineW(IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, IN OUT PINFCONTEXT Context)
Definition: infsupp.c:54
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
WORD idDlg
Definition: desk.c:110
#define MAKEINTRESOURCE
Definition: winuser.h:591
HINF hSetupInf
Definition: intl.c:39
static HICON
Definition: imagelist.c:84
Definition: cpl.h:24
BOOL OpenSetupInf(VOID)
Definition: intl.c:91
BOOL bIsUserAdmin
Definition: intl.h:122
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
uint16_t * PWSTR
Definition: typedefs.h:56
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
int idName
Definition: hotplug.h:36
HINSTANCE hApplet
Definition: intl.c:38
DWORD UnattendLCID
Definition: intl.c:41
#define INF_STYLE_OLDNT
Definition: infsupp.h:37
int idIcon
Definition: hotplug.h:35
#define CALLBACK
Definition: compat.h:35
#define IDD_ADVANCEDPAGE
Definition: resource.h:13
int idInfo
Definition: cpl.h:27
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
#define ZeroMemory
Definition: winbase.h:1664
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
#define PSH_USECALLBACK
Definition: prsht.h:48
#define IDC_CPLICON
Definition: resource.h:7
HINF WINAPI SetupOpenInfFileW(PCWSTR name, PCWSTR class, DWORD style, UINT *error)
Definition: parser.c:1229
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:58
WPARAM wParam
Definition: combotst.c:138
VOID WINAPI SetupCloseInfFile(IN HINF InfHandle)
Definition: infsupp.c:43
#define WM_SETTINGCHANGE
Definition: winuser.h:1611
int idIcon
Definition: cpl.h:25
int idDescription
Definition: hotplug.h:37
#define CPL_DBLCLK
Definition: cpl.h:16
DWORD dwReason
Definition: misc.cpp:154
#define IDS_CPLNAME
Definition: resource.h:8
#define NUM_APPLETS
Definition: intl.c:30
#define PSH_USEICONID
Definition: prsht.h:42
#define FALSE
Definition: types.h:117
INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2014
static BOOL IsUserAdmin(VOID)
Definition: netid.c:163
#define PROPSHEETHEADER
Definition: prsht.h:392
LONG_PTR LPARAM
Definition: windef.h:208
LCID WINAPI GetSystemDefaultLCID(void)
Definition: lang.c:787
#define IDS_CPLDESCRIPTION
Definition: resource.h:9
char TCHAR
Definition: xmlstorage.h:189
#define PSP_DEFAULT
Definition: prsht.h:22
INT_PTR CALLBACK LanguagesPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: languages.c:7
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LCID SystemLCID
Definition: intl.h:114
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define WINAPI
Definition: msvc.h:6
VOID ParseSetupInf(VOID)
Definition: intl.c:123
APPLET Applets[NUM_APPLETS]
Definition: intl.c:45
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
#define CPL_STARTWPARMSW
Definition: cpl.h:21
#define CPL_INIT
Definition: cpl.h:12
LONG APIENTRY CPlApplet(HWND hwndCpl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
Definition: intl.c:233
int ret
static LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
Definition: intl.c:169
#define CPL_INQUIRE
Definition: cpl.h:14
static const WCHAR L[]
Definition: oid.c:1250
#define MB_ICONERROR
Definition: winuser.h:781
GLenum GLsizei len
Definition: glext.h:6722
LONG_PTR lData
Definition: cpl.h:28
#define IDD_LANGUAGESPAGE
Definition: resource.h:12
int idName
Definition: cpl.h:26
static VOID InitIntlPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LPARAM lParam)
Definition: intl.c:79
INT_PTR(CALLBACK * DLGPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2871
#define IDD_GENERALPAGE
Definition: resource.h:9
#define PSCB_INITIALIZED
Definition: prsht.h:75
HICON hIcon
Definition: msconfig.c:44
#define PSH_PROPSHEETPAGE
Definition: prsht.h:43
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpReserved)
Definition: intl.c:271
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define MB_OK
Definition: winuser.h:784
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
INT ResourceMessageBox(HWND hwnd, UINT uType, UINT uCaptionId, UINT uMessageId)
Definition: intl.c:63
#define DPRINT1
Definition: precomp.h:8
#define msg(x)
Definition: auth_time.c:54
#define IDS_ERROR
Definition: resource.h:18
#define PropertySheet
Definition: prsht.h:400
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
Definition: intl.c:152
#define BUFFERSIZE
Definition: intl.c:32
VOID PrintErrorMsgBox(UINT msg)
Definition: intl.c:51
#define HWND_BROADCAST
Definition: winuser.h:1190
LPARAM lParam
Definition: combotst.c:139
DLGPROC DlgProc
Definition: desk.c:111
#define HeapFree(x, y, z)
Definition: compat.h:594
INT_PTR CALLBACK AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: advanced.c:422
#define CPL_GETCOUNT
Definition: cpl.h:13
#define LoadString
Definition: winuser.h:5794
#define PROPSHEETPAGE
Definition: prsht.h:389
#define APIENTRY
Definition: api.h:79
#define ICON_BIG
Definition: tnclass.cpp:51
Definition: hotplug.h:33
BOOL WINAPI SetupGetStringFieldW(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT PWSTR ReturnBuffer, IN ULONG ReturnBufferSize, OUT PULONG RequiredSize)
Definition: infsupp.c:184