* Sync up to trunk HEAD (r62286).
[reactos.git] / dll / cpl / sysdm / sysdm.c
1 /*
2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/sysdm.c
5 * PURPOSE: dll entry file
6 * COPYRIGHT: Copyright Thomas Weidenmueller <w3seek@reactos.org>
7 *
8 */
9
10 #include "precomp.h"
11
12 #include <cpl.h>
13 #include <regstr.h>
14
15 LONG CALLBACK SystemApplet(VOID);
16 HINSTANCE hApplet = 0;
17 HWND hCPLWindow;
18
19 /* Applets */
20 APPLET Applets[NUM_APPLETS] =
21 {
22 {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
23 };
24
25 #define MAX_SYSTEM_PAGES 32
26
27 static BOOL CALLBACK
28 PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam)
29 {
30 PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam;
31 if (ppsh != NULL && ppsh->nPages < MAX_SYSTEM_PAGES)
32 {
33 ppsh->phpage[ppsh->nPages++] = hpage;
34 return TRUE;
35 }
36
37 return FALSE;
38 }
39
40 static BOOL
41 InitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc)
42 {
43 HPROPSHEETPAGE hPage;
44 PROPSHEETPAGE psp;
45
46 if (ppsh->nPages < MAX_SYSTEM_PAGES)
47 {
48 ZeroMemory(&psp, sizeof(psp));
49 psp.dwSize = sizeof(psp);
50 psp.dwFlags = PSP_DEFAULT;
51 psp.hInstance = hApplet;
52 psp.pszTemplate = MAKEINTRESOURCE(idDlg);
53 psp.pfnDlgProc = DlgProc;
54
55 hPage = CreatePropertySheetPage(&psp);
56 if (hPage != NULL)
57 {
58 return PropSheetAddPage(hPage, (LPARAM)ppsh);
59 }
60 }
61
62 return FALSE;
63 }
64
65 typedef HPROPSHEETPAGE (WINAPI *PCreateNetIDPropertyPage)(VOID);
66
67 static HMODULE
68 AddNetIdPage(PROPSHEETHEADER *ppsh)
69 {
70 HPROPSHEETPAGE hPage;
71 HMODULE hMod;
72 PCreateNetIDPropertyPage pCreateNetIdPage;
73
74 hMod = LoadLibrary(TEXT("netid.dll"));
75 if (hMod != NULL)
76 {
77 pCreateNetIdPage = (PCreateNetIDPropertyPage)GetProcAddress(hMod,
78 "CreateNetIDPropertyPage");
79 if (pCreateNetIdPage != NULL)
80 {
81 hPage = pCreateNetIdPage();
82 if (hPage == NULL)
83 goto Fail;
84
85 if (!PropSheetAddPage(hPage, (LPARAM)ppsh))
86 {
87 DestroyPropertySheetPage(hPage);
88 goto Fail;
89 }
90 }
91 else
92 {
93 Fail:
94 FreeLibrary(hMod);
95 hMod = NULL;
96 }
97 }
98
99 return hMod;
100 }
101
102 /* First Applet */
103 LONG CALLBACK
104 SystemApplet(VOID)
105 {
106 HPROPSHEETPAGE hpsp[MAX_SYSTEM_PAGES];
107 PROPSHEETHEADER psh;
108 HMODULE hNetIdDll;
109 HPSXA hpsxa = NULL;
110 LONG Ret;
111 static INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), ICC_LINK_CLASS};
112
113 if (!InitCommonControlsEx(&icc))
114 return 0;
115
116 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
117 psh.dwSize = sizeof(PROPSHEETHEADER);
118 psh.dwFlags = PSH_PROPTITLE;
119 psh.hwndParent = hCPLWindow;
120 psh.hInstance = hApplet;
121 psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
122 psh.pszCaption = MAKEINTRESOURCE(IDS_CPLSYSTEMNAME);
123 psh.nPages = 0;
124 psh.nStartPage = 0;
125 psh.phpage = hpsp;
126 psh.pfnCallback = NULL;
127
128 InitPropSheetPage(&psh, IDD_PROPPAGEGENERAL, (DLGPROC) GeneralPageProc);
129 hNetIdDll = AddNetIdPage(&psh);
130 InitPropSheetPage(&psh, IDD_PROPPAGEHARDWARE, (DLGPROC) HardwarePageProc);
131 InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, (DLGPROC) AdvancedPageProc);
132
133 /* Load additional pages provided by shell extensions */
134 hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\System"), MAX_SYSTEM_PAGES - psh.nPages);
135 if (hpsxa != NULL)
136 {
137 SHAddFromPropSheetExtArray(hpsxa, PropSheetAddPage, (LPARAM)&psh);
138 }
139
140 Ret = (LONG)(PropertySheet(&psh) != -1);
141
142 if (hpsxa != NULL)
143 {
144 SHDestroyPropSheetExtArray(hpsxa);
145 }
146
147 if (hNetIdDll != NULL)
148 FreeLibrary(hNetIdDll);
149
150 return Ret;
151 }
152
153 /* Control Panel Callback */
154 LONG CALLBACK
155 CPlApplet(HWND hwndCPl,
156 UINT uMsg,
157 LPARAM lParam1,
158 LPARAM lParam2)
159 {
160 INT i = (INT)lParam1;
161
162 UNREFERENCED_PARAMETER(hwndCPl);
163
164 switch (uMsg)
165 {
166 case CPL_INIT:
167 return TRUE;
168
169 case CPL_GETCOUNT:
170 return NUM_APPLETS;
171
172 case CPL_INQUIRE:
173 {
174 CPLINFO *CPlInfo = (CPLINFO*)lParam2;
175 CPlInfo->lData = 0;
176 CPlInfo->idIcon = Applets[i].idIcon;
177 CPlInfo->idName = Applets[i].idName;
178 CPlInfo->idInfo = Applets[i].idDescription;
179 }
180 break;
181
182 case CPL_DBLCLK:
183 hCPLWindow = hwndCPl;
184 Applets[i].AppletProc();
185 break;
186 }
187
188 return FALSE;
189 }
190
191
192 BOOL WINAPI
193 DllMain(HINSTANCE hinstDLL,
194 DWORD dwReason,
195 LPVOID lpvReserved)
196 {
197 UNREFERENCED_PARAMETER(lpvReserved);
198
199 switch (dwReason)
200 {
201 case DLL_PROCESS_ATTACH:
202 case DLL_THREAD_ATTACH:
203 hApplet = hinstDLL;
204 break;
205 }
206
207 return TRUE;
208 }