fa5f92a297ffe2bbf763494093a8240856c26de9
[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 /* Leave, if there is no valid listview item */
207 if (pnmv->item.iItem == -1)
208 return FALSE;
209
210 /* Get the new user name */
211 ListView_GetItemText(pnmv->hdr.hwndFrom,
212 pnmv->item.iItem, 0,
213 szOldUserName,
214 UNLEN);
215
216 /* Leave, if the user canceled the edit action */
217 if (pnmv->item.pszText == NULL)
218 return FALSE;
219
220 /* Get the new user name */
221 lstrcpy(szNewUserName, pnmv->item.pszText);
222
223 /* Leave, if the user name was not changed */
224 if (lstrcmp(szOldUserName, szNewUserName) == 0)
225 return FALSE;
226
227
228 /* Change the user name */
229 useri0.usri0_name = szNewUserName;
230
231 #if 0
232 status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);
233 #else
234 status = NERR_Success;
235 #endif
236 if (status != NERR_Success)
237 {
238 TCHAR szText[256];
239 wsprintf(szText, TEXT("Error: %u"), status);
240 MessageBox(NULL, szText, TEXT("NetUserSetInfo"), MB_ICONERROR | MB_OK);
241 return FALSE;
242 }
243
244 /* Update the listview item */
245 ListView_SetItemText(pnmv->hdr.hwndFrom,
246 pnmv->item.iItem, 0,
247 szNewUserName);
248
249 return TRUE;
250 }
251
252
253 static BOOL
254 OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
255 {
256 LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
257
258 switch (phdr->idFrom)
259 {
260 case IDC_USERS_LIST:
261 switch(phdr->code)
262 {
263 case NM_CLICK:
264 pUserData->iCurrentItem = lpnmlv->iItem;
265 if (lpnmlv->iItem == -1)
266 {
267 }
268 else
269 {
270 }
271 break;
272
273 case NM_DBLCLK:
274 break;
275
276 case LVN_ENDLABELEDIT:
277 return OnEndLabelEdit((LPNMLVDISPINFO)phdr);
278
279 case NM_RCLICK:
280 ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);
281 TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),
282 TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);
283 break;
284 }
285 break;
286 }
287
288 return FALSE;
289 }
290
291
292 INT_PTR CALLBACK
293 UsersPageProc(HWND hwndDlg,
294 UINT uMsg,
295 WPARAM wParam,
296 LPARAM lParam)
297 {
298 PUSER_DATA pUserData;
299
300 UNREFERENCED_PARAMETER(wParam);
301
302 pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
303
304 switch (uMsg)
305 {
306 case WM_INITDIALOG:
307 pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA));
308 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData);
309
310 pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER));
311
312 OnInitDialog(hwndDlg);
313 break;
314
315 case WM_COMMAND:
316 switch (LOWORD(wParam))
317 {
318 case IDM_USER_CHANGE_PASSWORD:
319 DialogBoxParam(hApplet,
320 MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),
321 hwndDlg,
322 ChangePasswordDlgProc,
323 (LPARAM)NULL);
324 break;
325
326 case IDM_USER_RENAME:
327 {
328 INT nItem;
329 HWND hwndLV;
330
331 hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
332 nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
333 if (nItem != -1)
334 {
335 (void)ListView_EditLabel(hwndLV, nItem);
336 }
337 }
338 break;
339
340 case IDM_USER_PROPERTIES:
341 MessageBeep(-1);
342 break;
343 }
344 break;
345
346 case WM_NOTIFY:
347 return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
348
349 case WM_DESTROY:
350 DestroyMenu(pUserData->hPopupMenu);
351 HeapFree(GetProcessHeap(), 0, pUserData);
352 break;
353 }
354
355 return FALSE;
356 }