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