migrate substitution keywords to SVN
[reactos.git] / reactos / lib / cpl / appwiz / appwiz.c
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
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 /* $Id$
20 *
21 * PROJECT: ReactOS Software Control Panel
22 * FILE: lib/cpl/system/appwiz.c
23 * PURPOSE: ReactOS Software Control Panel
24 * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com)
25 * UPDATE HISTORY:
26 * 06-17-2004 Created
27 */
28
29 #include <windows.h>
30 #include <commctrl.h>
31 #include <cpl.h>
32
33 #include <stdlib.h>
34 #include <stdio.h>
35 #include <stdarg.h>
36 #include <tchar.h>
37 #include <process.h>
38
39 #include "resource.h"
40 #include "appwiz.h"
41
42 #define NUM_APPLETS (1)
43
44 LONG CALLBACK SystemApplet(VOID);
45 INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
46 INT_PTR CALLBACK ComputerPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
47 HINSTANCE hApplet = 0;
48
49 /* Applets */
50 APPLET Applets[NUM_APPLETS] =
51 {
52 {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
53 };
54
55
56 static VOID
57 CallUninstall(HWND hwndDlg)
58 {
59 STARTUPINFO si;
60 PROCESS_INFORMATION pi;
61 int nIndex;
62 HKEY hKey;
63 DWORD dwType;
64 TCHAR pszUninstallString[MAX_PATH];
65 DWORD dwSize;
66
67 nIndex = SendDlgItemMessage(hwndDlg, IDC_SOFTWARELIST, LB_GETCURSEL, 0, 0);
68 if (nIndex == -1)
69 {
70 MessageBox(hwndDlg,
71 _TEXT("No item selected"),
72 _TEXT("Error"),
73 MB_ICONSTOP);
74 }
75 else
76 {
77 hKey = (HKEY)SendDlgItemMessage(hwndDlg, IDC_SOFTWARELIST, LB_GETITEMDATA, (WPARAM)nIndex, 0);
78
79 dwType = REG_SZ;
80 dwSize = MAX_PATH;
81 if (RegQueryValueEx(hKey,
82 _TEXT("UninstallString"),
83 NULL,
84 &dwType,
85 (LPBYTE)pszUninstallString,
86 &dwSize) == ERROR_SUCCESS)
87 {
88 ZeroMemory(&si, sizeof(si));
89 si.cb = sizeof(si);
90 si.wShowWindow = SW_SHOW;
91 if (CreateProcess(NULL,pszUninstallString,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
92 {
93 CloseHandle(pi.hProcess);
94 CloseHandle(pi.hThread);
95 }
96 }
97 else
98 {
99 MessageBox(hwndDlg,
100 _TEXT("Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."),
101 _TEXT("Error"),
102 MB_ICONSTOP);
103 }
104 }
105 }
106
107
108 /* Property page dialog callback */
109 static INT_PTR CALLBACK
110 InstallPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
111 {
112 TCHAR pszName[MAX_PATH];
113 TCHAR pszDisplayName[MAX_PATH];
114 FILETIME FileTime;
115 HKEY hKey;
116 HKEY hSubKey;
117 DWORD dwType;
118 DWORD dwSize;
119 int i;
120 ULONG index;
121
122 switch (uMsg)
123 {
124 case WM_INITDIALOG:
125 EnableWindow(GetDlgItem(hwndDlg,IDC_INSTALL), FALSE);
126 if (RegOpenKey(HKEY_LOCAL_MACHINE,
127 _TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),
128 &hKey) != ERROR_SUCCESS)
129 {
130 MessageBox(hwndDlg,
131 _TEXT("Unable to open Uninstall Key"),
132 _TEXT("Error"),
133 MB_ICONSTOP);
134 return FALSE;
135 }
136
137 i = 0;
138 dwSize = MAX_PATH;
139 while (RegEnumKeyEx (hKey, i, pszName, &dwSize, NULL, NULL, NULL, &FileTime) == ERROR_SUCCESS)
140 {
141 if (RegOpenKey(hKey,pszName,&hSubKey)==ERROR_SUCCESS)
142 {
143 dwType = REG_SZ;
144 dwSize = MAX_PATH;
145 if (RegQueryValueEx(hSubKey,
146 _TEXT("DisplayName"),
147 NULL,
148 &dwType,
149 (LPBYTE)pszDisplayName,
150 &dwSize) == ERROR_SUCCESS)
151 {
152 index = SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_ADDSTRING,0,(LPARAM)pszDisplayName);
153 SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_SETITEMDATA,index,(LPARAM)hSubKey);
154 }
155 }
156
157 dwSize = MAX_PATH;
158 i++;
159 }
160
161 RegCloseKey(hKey);
162 break;
163
164 case WM_COMMAND:
165 switch (LOWORD(wParam))
166 {
167 case IDC_SOFTWARELIST:
168 if (HIWORD(wParam) == LBN_DBLCLK)
169 {
170 CallUninstall(hwndDlg);
171 }
172 break;
173
174 case IDC_ADDREMOVE:
175 CallUninstall(hwndDlg);
176 break;
177 }
178 break;
179 }
180
181 return FALSE;
182 }
183
184
185 /* Property page dialog callback */
186 static INT_PTR CALLBACK
187 RosPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
188 {
189 switch(uMsg)
190 {
191 case WM_INITDIALOG:
192 break;
193 }
194
195 return FALSE;
196 }
197
198
199 static VOID
200 InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
201 {
202 ZeroMemory(psp, sizeof(PROPSHEETPAGE));
203 psp->dwSize = sizeof(PROPSHEETPAGE);
204 psp->dwFlags = PSP_DEFAULT;
205 psp->hInstance = hApplet;
206 psp->pszTemplate = MAKEINTRESOURCE(idDlg);
207 psp->pfnDlgProc = DlgProc;
208 }
209
210
211 /* First Applet */
212
213 LONG CALLBACK
214 SystemApplet(VOID)
215 {
216 PROPSHEETPAGE psp[2];
217 PROPSHEETHEADER psh;
218 TCHAR Caption[1024];
219
220 LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
221
222 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
223 psh.dwSize = sizeof(PROPSHEETHEADER);
224 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
225 psh.hwndParent = NULL;
226 psh.hInstance = hApplet;
227 psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
228 psh.pszCaption = Caption;
229 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
230 psh.nStartPage = 0;
231 psh.ppsp = psp;
232 psh.pfnCallback = NULL;
233
234 InitPropSheetPage(&psp[0], IDD_PROPPAGEINSTALL, InstallPageProc);
235 InitPropSheetPage(&psp[1], IDD_PROPPAGEROSSETUP, RosPageProc);
236
237 return (LONG)(PropertySheet(&psh) != -1);
238 }
239
240
241 /* Control Panel Callback */
242 LONG CALLBACK
243 CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
244 {
245 CPLINFO *CPlInfo;
246 DWORD i;
247
248 i = (DWORD)lParam1;
249 switch(uMsg)
250 {
251 case CPL_INIT:
252 return TRUE;
253
254 case CPL_GETCOUNT:
255 return NUM_APPLETS;
256
257 case CPL_INQUIRE:
258 CPlInfo = (CPLINFO*)lParam2;
259 CPlInfo->lData = 0;
260 CPlInfo->idIcon = Applets[i].idIcon;
261 CPlInfo->idName = Applets[i].idName;
262 CPlInfo->idInfo = Applets[i].idDescription;
263 break;
264
265 case CPL_DBLCLK:
266 Applets[i].AppletProc();
267 break;
268 }
269
270 return FALSE;
271 }
272
273
274 BOOL WINAPI
275 DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
276 {
277 switch(dwReason)
278 {
279 case DLL_PROCESS_ATTACH:
280 case DLL_THREAD_ATTACH:
281 hApplet = hinstDLL;
282 break;
283 }
284 return TRUE;
285 }