[ROSTESTS]
[reactos.git] / rostests / winetests / GUI / mainwnd.c
1 /*
2 * PROJECT: ReactOS API Test GUI
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE:
5 * PURPOSE: main dialog implementation
6 * COPYRIGHT: Copyright 2008 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10 #include <precomp.h>
11 #include <io.h>
12
13 #define BUFSIZE 4096
14
15 HINSTANCE hInstance;
16
17 WCHAR szPipeName[] = L"\\\\.\\pipe\\winetest_pipe";
18
19 typedef int (_cdecl *RUNTEST)(char **);
20
21 DWORD WINAPI
22 PipeReadThread(LPVOID lpParam)
23 {
24 PMAIN_WND_INFO pInfo;
25 HWND hList, hEdit;
26 DWORD dwRead;
27 CHAR chBuf[BUFSIZE];
28 BOOL bSuccess = FALSE;
29 LVITEMA item;
30 INT count;
31
32 pInfo = (PMAIN_WND_INFO)lpParam;
33
34 hList = GetDlgItem(pInfo->hMainWnd, IDC_LIST);
35 hEdit = GetDlgItem(pInfo->hMainWnd, IDC_OUTPUT);
36
37 ZeroMemory(&item, sizeof(LVITEMA));
38 item.mask = LVIF_TEXT;
39
40 while (TRUE)
41 {
42 dwRead = 0;
43 bSuccess = ReadFile(pInfo->hStdOutRd,
44 chBuf,
45 BUFSIZE,
46 &dwRead,
47 NULL);
48 if(!bSuccess || dwRead == 0)
49 break;
50
51 chBuf[dwRead] = 0;
52
53 count = GetWindowTextLengthA(hEdit);
54 SendMessageA(hEdit, EM_SETSEL, (WPARAM)count, (LPARAM)count);
55 SendMessageA(hEdit, EM_REPLACESEL, 0, (LPARAM)chBuf);
56
57 //item.iItem = ListView_GetItemCount(hList);
58 //item.pszText = chBuf;
59 //SendMessage(hEdit, LVM_INSERTITEMA, 0, (LPARAM)&item);
60 }
61
62 return 0;
63 }
64
65
66 DWORD WINAPI
67 CreateClientProcess(PMAIN_WND_INFO pInfo)
68 {
69 SECURITY_ATTRIBUTES sa;
70 STARTUPINFO si;
71 PROCESS_INFORMATION pi;
72 BOOL bSuccess = FALSE;
73
74 //
75 // Set up the security attributes
76 //
77 sa.nLength= sizeof(SECURITY_ATTRIBUTES);
78 sa.lpSecurityDescriptor = NULL;
79 sa.bInheritHandle = TRUE;
80
81 //
82 // Create a pipe for the child process's STDOUT
83 //
84 if (!CreatePipe(&pInfo->hStdOutRd,
85 &pInfo->hStdOutWr,
86 &sa,
87 0))
88 {
89 return FALSE;
90 }
91
92 //
93 // Ensure the read handle to the pipe for STDOUT is not inherited
94 //
95 if (!SetHandleInformation(pInfo->hStdOutRd,
96 HANDLE_FLAG_INHERIT,
97 0))
98 {
99 return FALSE;
100 }
101
102 ZeroMemory(&si, sizeof(STARTUPINFO));
103 si.cb = sizeof(STARTUPINFO);
104 si.hStdError = pInfo->hStdOutWr;
105 si.hStdOutput = pInfo->hStdOutWr;
106 si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
107 si.dwFlags |= STARTF_USESTDHANDLES;
108
109 ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
110
111 bSuccess = CreateProcessW(pInfo->lpCmdLine,
112 NULL,
113 NULL,
114 NULL,
115 TRUE,
116 0,//CREATE_SUSPENDED,
117 NULL,
118 NULL,
119 &si,
120 &pi);
121 if (bSuccess)
122 {
123 //
124 // Create thread to handle pipe input from child processes
125 //
126 pInfo->hPipeThread = CreateThread(NULL,
127 0,
128 PipeReadThread,
129 pInfo,
130 0,
131 NULL);
132
133 WaitForSingleObject(pi.hProcess, INFINITE);
134
135 CloseHandle(pi.hProcess);
136 CloseHandle(pi.hThread);
137 }
138
139 return bSuccess;
140 }
141
142
143 static BOOL
144 OnInitMainDialog(HWND hDlg,
145 LPARAM lParam)
146 {
147 PMAIN_WND_INFO pInfo;
148
149 pInfo = (PMAIN_WND_INFO)lParam;
150
151 /* Initialize the main window context */
152 pInfo->hMainWnd = hDlg;
153
154 SetWindowLongPtr(hDlg,
155 GWLP_USERDATA,
156 (LONG_PTR)pInfo);
157
158 pInfo->hSmIcon = LoadImageW(hInstance,
159 MAKEINTRESOURCEW(IDI_ICON),
160 IMAGE_ICON,
161 16,
162 16,
163 0);
164 if (pInfo->hSmIcon)
165 {
166 SendMessageW(hDlg,
167 WM_SETICON,
168 ICON_SMALL,
169 (LPARAM)pInfo->hSmIcon);
170 }
171
172 pInfo->hBgIcon = LoadImageW(hInstance,
173 MAKEINTRESOURCEW(IDI_ICON),
174 IMAGE_ICON,
175 32,
176 32,
177 0);
178 if (pInfo->hBgIcon)
179 {
180 SendMessageW(hDlg,
181 WM_SETICON,
182 ICON_BIG,
183 (LPARAM)pInfo->hBgIcon);
184 }
185
186 return TRUE;
187 }
188
189 static VOID
190 RunSelectedTest(PMAIN_WND_INFO pInfo)
191 {
192 HWND hRunCmd;
193 WCHAR szTextCmd[MAX_RUN_CMD];
194 INT sel;
195
196 hRunCmd = GetDlgItem(pInfo->hMainWnd, IDC_TESTSELECTION);
197
198 sel = SendMessageW(hRunCmd,
199 CB_GETCURSEL,
200 0,
201 0);
202 if (sel != CB_ERR)
203 {
204 if (SendMessageW(hRunCmd,
205 CB_GETLBTEXT,
206 sel,
207 (LPARAM)szTextCmd) != CB_ERR)
208 {
209 pInfo->lpCmdLine = (LPWSTR)SendMessage(hRunCmd,
210 CB_GETITEMDATA,
211 0,
212 0);
213 if (pInfo->lpCmdLine)
214 {
215 //
216 // Create a new thread to create the client process
217 // and receive any ouput via stdout
218 //
219 CreateThread(NULL,
220 0,
221 CreateClientProcess,
222 pInfo,
223 0,
224 NULL);
225 }
226 }
227 }
228 }
229
230 static VOID
231 AddTestToCombo(PMAIN_WND_INFO pInfo)
232 {
233 HWND hRunCmd;
234 LPWSTR lpExePath;
235 INT len;
236
237 hRunCmd = GetDlgItem(pInfo->hMainWnd, IDC_TESTSELECTION);
238 if (hRunCmd)
239 {
240 SendMessageW(hRunCmd,
241 CB_INSERTSTRING,
242 0,
243 (LPARAM)pInfo->SelectedTest.szName);
244
245 len = (wcslen(pInfo->SelectedTest.szRunCmd) + 1) * sizeof(WCHAR);
246 lpExePath = HeapAlloc(GetProcessHeap(), 0, len);
247 if (lpExePath)
248 {
249 wcsncpy(lpExePath,
250 pInfo->SelectedTest.szRunCmd,
251 len / sizeof(WCHAR));
252 }
253
254 SendMessageW(hRunCmd,
255 CB_SETITEMDATA,
256 0,
257 (LPARAM)lpExePath);
258 SendMessageW(hRunCmd,
259 CB_SETCURSEL,
260 0,
261 0);
262 }
263 }
264
265 static VOID
266 FreeTestCmdStrings(PMAIN_WND_INFO pInfo)
267 {
268 HWND hRunCmd;
269 LPWSTR lpExePath;
270 INT cnt, i;
271
272 hRunCmd = GetDlgItem(pInfo->hMainWnd, IDC_TESTSELECTION);
273
274 cnt = SendMessageW(hRunCmd,
275 CB_GETCOUNT,
276 0,
277 0);
278 if (cnt != CB_ERR)
279 {
280 for (i = 0; i < cnt; i++)
281 {
282 lpExePath = (LPWSTR)SendMessage(hRunCmd,
283 CB_GETITEMDATA,
284 i,
285 0);
286 if (lpExePath)
287 {
288 HeapFree(GetProcessHeap(), 0, lpExePath);
289 }
290 }
291 }
292 }
293
294 static BOOL CALLBACK
295 MainDlgProc(HWND hDlg,
296 UINT Message,
297 WPARAM wParam,
298 LPARAM lParam)
299 {
300 PMAIN_WND_INFO pInfo;
301
302 /* Get the window context */
303 pInfo = (PMAIN_WND_INFO)GetWindowLongPtr(hDlg,
304 GWLP_USERDATA);
305 if (pInfo == NULL && Message != WM_INITDIALOG)
306 {
307 goto HandleDefaultMessage;
308 }
309
310 switch(Message)
311 {
312 case WM_INITDIALOG:
313 return OnInitMainDialog(hDlg, lParam);
314
315 case WM_COMMAND:
316 {
317 switch(LOWORD(wParam))
318 {
319 case IDC_BROWSE:
320 {
321 INT_PTR ret;
322
323 ret = DialogBoxParamW(hInstance,
324 MAKEINTRESOURCEW(IDD_TESTBROWSER),
325 hDlg,
326 (DLGPROC)BrowseDlgProc,
327 (LPARAM)pInfo);
328 if (ret == IDOK)
329 {
330 AddTestToCombo(pInfo);
331 }
332
333 break;
334 }
335 case IDC_OPTIONS:
336 DialogBoxParamW(hInstance,
337 MAKEINTRESOURCEW(IDD_OPTIONS),
338 hDlg,
339 (DLGPROC)OptionsDlgProc,
340 (LPARAM)pInfo);
341 break;
342
343 case IDC_RUN:
344 RunSelectedTest(pInfo);
345 break;
346
347 case IDOK:
348 EndDialog(hDlg, 0);
349 break;
350 }
351 }
352 break;
353
354 case WM_CLOSE:
355 EndDialog(hDlg, 0);
356 break;
357
358 case WM_DESTROY:
359 if (pInfo->hSmIcon)
360 DestroyIcon(pInfo->hSmIcon);
361 if (pInfo->hBgIcon)
362 DestroyIcon(pInfo->hBgIcon);
363
364 FreeTestCmdStrings(pInfo);
365
366 break;
367
368 HandleDefaultMessage:
369 default:
370 return FALSE;
371 }
372
373 return FALSE;
374 }
375
376
377 INT WINAPI
378 wWinMain(HINSTANCE hInst,
379 HINSTANCE hPrev,
380 LPWSTR Cmd,
381 int iCmd)
382 {
383 INITCOMMONCONTROLSEX iccx;
384 PMAIN_WND_INFO pInfo;
385 INT Ret = -1;
386
387 UNREFERENCED_PARAMETER(hPrev);
388 UNREFERENCED_PARAMETER(Cmd);
389 UNREFERENCED_PARAMETER(iCmd);
390
391 hInstance = hInst;
392
393 ZeroMemory(&iccx, sizeof(INITCOMMONCONTROLSEX));
394 iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
395 iccx.dwICC = ICC_TAB_CLASSES;
396 InitCommonControlsEx(&iccx);
397
398 pInfo = HeapAlloc(GetProcessHeap(),
399 0,
400 sizeof(MAIN_WND_INFO));
401 if (pInfo)
402 {
403 Ret = (DialogBoxParamW(hInstance,
404 MAKEINTRESOURCEW(IDD_WINETESTGUI),
405 NULL,
406 (DLGPROC)MainDlgProc,
407 (LPARAM)pInfo) == IDOK);
408
409 HeapFree(GetProcessHeap(),
410 0,
411 pInfo);
412 }
413
414 return Ret;
415 }