- Sync up Mm interface with WinLdr branch (introduce the concept of a memory type...
[reactos.git] / reactos / dll / cpl / usrmgr / users.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS User Manager Control Panel
5 * FILE: dll/cpl/usrmgr/users.c
6 * PURPOSE: Users property page
7 *
8 * PROGRAMMERS: Eric Kohl
9 */
10
11 #include "usrmgr.h"
12
13
14 typedef struct _USER_DATA
15 {
16 HMENU hPopupMenu;
17
18 INT iCurrentItem;
19
20 } USER_DATA, *PUSER_DATA;
21
22
23
24 static BOOL
25 SetPassword(HWND hwndDlg)
26 {
27 TCHAR szPassword1[256];
28 TCHAR szPassword2[256];
29 UINT uLen1;
30 UINT uLen2;
31
32 uLen1 = GetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD1, szPassword1, 256);
33 uLen2 = GetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD2, szPassword2, 256);
34
35 /* Check the passwords */
36 if (uLen1 != uLen2 || _tcscmp(szPassword1, szPassword2) != 0)
37 {
38 MessageBox(hwndDlg,
39 TEXT("The passwords you entered are not the same!"),
40 TEXT("ERROR"),
41 MB_OK | MB_ICONERROR);
42 return FALSE;
43 }
44
45
46 return TRUE;
47 }
48
49
50 INT_PTR CALLBACK
51 ChangePasswordDlgProc(HWND hwndDlg,
52 UINT uMsg,
53 WPARAM wParam,
54 LPARAM lParam)
55 {
56 UNREFERENCED_PARAMETER(wParam);
57
58 switch (uMsg)
59 {
60 case WM_INITDIALOG:
61 break;
62
63 case WM_COMMAND:
64 switch (LOWORD(wParam))
65 {
66 case IDOK:
67 if (SetPassword(hwndDlg))
68 EndDialog(hwndDlg, 0);
69 break;
70
71 case IDCANCEL:
72 EndDialog(hwndDlg, 0);
73 break;
74 }
75 break;
76
77 default:
78 return FALSE;
79 }
80
81 return TRUE;
82 }
83
84
85
86 static VOID
87 SetUsersListColumns(HWND hwndListView)
88 {
89 LV_COLUMN column;
90 RECT rect;
91 TCHAR szStr[32];
92
93 GetClientRect(hwndListView, &rect);
94
95 memset(&column, 0x00, sizeof(column));
96 column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
97 column.fmt=LVCFMT_LEFT;
98 column.cx = (INT)((rect.right - rect.left) * 0.25);
99 column.iSubItem = 0;
100 LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0]));
101 column.pszText = szStr;
102 (void)ListView_InsertColumn(hwndListView, 0, &column);
103
104 column.cx = (INT)((rect.right - rect.left) * 0.50);
105 column.iSubItem = 1;
106 LoadString(hApplet, IDS_FULLNAME, szStr, sizeof(szStr) / sizeof(szStr[0]));
107 column.pszText = szStr;
108 (void)ListView_InsertColumn(hwndListView, 1, &column);
109
110 column.cx = (INT)((rect.right - rect.left) * 0.25);
111 column.iSubItem = 2;
112 LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0]));
113 column.pszText = szStr;
114 (void)ListView_InsertColumn(hwndListView, 2, &column);
115 }
116
117
118 static VOID
119 UpdateUsersList(HWND hwndListView)
120 {
121 NET_API_STATUS netStatus;
122 PUSER_INFO_20 pBuffer;
123 DWORD entriesread;
124 DWORD totalentries;
125 DWORD resume_handle = 0;
126 DWORD i;
127
128 LV_ITEM lvi;
129 INT iItem;
130
131
132 for (;;)
133 {
134 netStatus = NetUserEnum(NULL, 20, FILTER_NORMAL_ACCOUNT,
135 (LPBYTE*)&pBuffer,
136 1024, &entriesread,
137 &totalentries, &resume_handle);
138 if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA)
139 break;
140
141 for (i = 0; i < entriesread; i++)
142 {
143 memset(&lvi, 0x00, sizeof(lvi));
144 lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; // | LVIF_PARAM;
145 // lvi.lParam = (LPARAM)VarData;
146 lvi.pszText = pBuffer[i].usri20_name;
147 lvi.state = 0; //(i == 0) ? LVIS_SELECTED : 0;
148 lvi.iImage = (pBuffer[i].usri20_flags & UF_ACCOUNTDISABLE) ? 1 : 0;
149 iItem = ListView_InsertItem(hwndListView, &lvi);
150
151 ListView_SetItemText(hwndListView, iItem, 1,
152 pBuffer[i].usri20_full_name);
153
154 ListView_SetItemText(hwndListView, iItem, 2,
155 pBuffer[i].usri20_comment);
156 }
157
158 NetApiBufferFree(&pBuffer);
159
160 /* No more data left */
161 if (netStatus != ERROR_MORE_DATA)
162 break;
163 }
164
165 }
166
167
168 static VOID
169 OnInitDialog(HWND hwndDlg)
170 {
171 HWND hwndListView;
172 HIMAGELIST hImgList;
173 HICON hIcon;
174
175 /* Create the image list */
176 hImgList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 5, 5);
177 hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
178 ImageList_AddIcon(hImgList, hIcon);
179 hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_LOCKED_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
180 ImageList_AddIcon(hImgList, hIcon);
181 DestroyIcon(hIcon);
182
183 hwndListView = GetDlgItem(hwndDlg, IDC_USERS_LIST);
184
185 (VOID)ListView_SetImageList(hwndListView, hImgList, LVSIL_SMALL);
186
187 (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
188
189 SetUsersListColumns(hwndListView);
190
191 UpdateUsersList(hwndListView);
192
193 // (void)ListView_SetColumnWidth(hwndListView, 3, LVSCW_AUTOSIZE_USEHEADER);
194 // (void)ListView_Update(hwndListView, 0);
195 }
196
197
198 static BOOL
199 OnEndLabelEdit(LPNMLVDISPINFO pnmv)
200 {
201 TCHAR szOldUserName[UNLEN];
202 TCHAR szNewUserName[UNLEN];
203 USER_INFO_0 useri0;
204 NET_API_STATUS status;
205
206 if (pnmv->item.iItem == -1)
207 return FALSE;
208
209 ListView_GetItemText(pnmv->hdr.hwndFrom,
210 pnmv->item.iItem, 0,
211 szOldUserName,
212 UNLEN);
213 lstrcpy(szNewUserName, pnmv->item.pszText);
214
215 if (lstrcmp(szOldUserName, szNewUserName) == 0)
216 return FALSE;
217
218 useri0.usri0_name = szNewUserName;
219
220 #if 0
221 status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);
222 #else
223 status = NERR_Success;
224 #endif
225 if (status != NERR_Success)
226 {
227 TCHAR szText[256];
228 wsprintf(szText, _T("Error: %u"), status);
229 MessageBox(NULL, szText, _T("NetUserSetInfo"), MB_ICONERROR | MB_OK);
230 return FALSE;
231 }
232
233 ListView_SetItemText(pnmv->hdr.hwndFrom,
234 pnmv->item.iItem, 0,
235 szNewUserName);
236
237 return TRUE;
238 }
239
240
241 static BOOL
242 OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
243 {
244 LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
245
246 switch (phdr->idFrom)
247 {
248 case IDC_USERS_LIST:
249 switch(phdr->code)
250 {
251 case NM_CLICK:
252 pUserData->iCurrentItem = lpnmlv->iItem;
253 if (lpnmlv->iItem == -1)
254 {
255 }
256 else
257 {
258 }
259 break;
260
261 case NM_DBLCLK:
262 break;
263
264 case LVN_ENDLABELEDIT:
265 return OnEndLabelEdit((LPNMLVDISPINFO)phdr);
266
267 case NM_RCLICK:
268 ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);
269 TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),
270 TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);
271 break;
272 }
273 break;
274 }
275
276 return FALSE;
277 }
278
279
280 INT_PTR CALLBACK
281 UsersPageProc(HWND hwndDlg,
282 UINT uMsg,
283 WPARAM wParam,
284 LPARAM lParam)
285 {
286 PUSER_DATA pUserData;
287
288 UNREFERENCED_PARAMETER(wParam);
289
290 pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
291
292 switch (uMsg)
293 {
294 case WM_INITDIALOG:
295 pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA));
296 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData);
297
298 pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER));
299
300 OnInitDialog(hwndDlg);
301 break;
302
303 case WM_COMMAND:
304 switch (LOWORD(wParam))
305 {
306 case IDM_USER_CHANGE_PASSWORD:
307 DialogBoxParam(hApplet,
308 MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),
309 hwndDlg,
310 ChangePasswordDlgProc,
311 (LPARAM)NULL);
312 break;
313
314 case IDM_USER_RENAME:
315 {
316 INT nItem;
317 HWND hwndLV;
318
319 hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
320 nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
321 if (nItem != -1)
322 {
323 (void)ListView_EditLabel(hwndLV, nItem);
324 }
325 }
326 break;
327
328 case IDM_USER_PROPERTIES:
329 MessageBeep(-1);
330 break;
331 }
332 break;
333
334 case WM_NOTIFY:
335 return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
336
337 case WM_DESTROY:
338 DestroyMenu(pUserData->hPopupMenu);
339 HeapFree(GetProcessHeap(), 0, pUserData);
340 break;
341 }
342
343 return FALSE;
344 }