- Hackfix the build: remove the function call to NetUserSetInfo (#if0/#endif). Eric...
[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_PARAM;
145 // lvi.lParam = (LPARAM)VarData;
146 lvi.pszText = pBuffer[i].usri20_name;
147 lvi.state = 0; //(i == 0) ? LVIS_SELECTED : 0;
148 iItem = ListView_InsertItem(hwndListView, &lvi);
149
150 ListView_SetItemText(hwndListView, iItem, 1,
151 pBuffer[i].usri20_full_name);
152
153 ListView_SetItemText(hwndListView, iItem, 2,
154 pBuffer[i].usri20_comment);
155 }
156
157 NetApiBufferFree(&pBuffer);
158
159 /* No more data left */
160 if (netStatus != ERROR_MORE_DATA)
161 break;
162 }
163
164 }
165
166
167 static VOID
168 OnInitDialog(HWND hwndDlg)
169 {
170 HWND hwndListView;
171
172 /* Set user environment variables */
173 hwndListView = GetDlgItem(hwndDlg, IDC_USERS_LIST);
174
175 (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
176
177 SetUsersListColumns(hwndListView);
178
179 UpdateUsersList(hwndListView);
180
181 // (void)ListView_SetColumnWidth(hwndListView, 3, LVSCW_AUTOSIZE_USEHEADER);
182 // (void)ListView_Update(hwndListView, 0);
183 }
184
185
186 static BOOL
187 OnEndLabelEdit(LPNMLVDISPINFO pnmv)
188 {
189 TCHAR szOldUserName[UNLEN];
190 TCHAR szNewUserName[UNLEN];
191 USER_INFO_0 useri0;
192 NET_API_STATUS status;
193
194 if (pnmv->item.iItem == -1)
195 return FALSE;
196
197 ListView_GetItemText(pnmv->hdr.hwndFrom,
198 pnmv->item.iItem, 0,
199 szOldUserName,
200 UNLEN);
201 lstrcpy(szNewUserName, pnmv->item.pszText);
202
203 if (lstrcmp(szOldUserName, szNewUserName) == 0)
204 return FALSE;
205
206 useri0.usri0_name = szNewUserName;
207
208 #if 0
209 status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);
210 #else
211 status = NERR_Success;
212 #endif
213 if (status != NERR_Success)
214 {
215 TCHAR szText[256];
216 wsprintf(szText, _T("Error: %u"), status);
217 MessageBox(NULL, szText, _T("NetUserSetInfo"), MB_ICONERROR | MB_OK);
218 return FALSE;
219 }
220
221 ListView_SetItemText(pnmv->hdr.hwndFrom,
222 pnmv->item.iItem, 0,
223 szNewUserName);
224
225 return TRUE;
226 }
227
228
229 static BOOL
230 OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
231 {
232 LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
233
234 switch (phdr->idFrom)
235 {
236 case IDC_USERS_LIST:
237 switch(phdr->code)
238 {
239 case NM_CLICK:
240 pUserData->iCurrentItem = lpnmlv->iItem;
241 if (lpnmlv->iItem == -1)
242 {
243 }
244 else
245 {
246 }
247 break;
248
249 case NM_DBLCLK:
250 break;
251
252 case LVN_ENDLABELEDIT:
253 return OnEndLabelEdit((LPNMLVDISPINFO)phdr);
254
255 case NM_RCLICK:
256 ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);
257 TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),
258 TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);
259 break;
260 }
261 break;
262 }
263
264 return FALSE;
265 }
266
267
268 INT_PTR CALLBACK
269 UsersPageProc(HWND hwndDlg,
270 UINT uMsg,
271 WPARAM wParam,
272 LPARAM lParam)
273 {
274 PUSER_DATA pUserData;
275
276 UNREFERENCED_PARAMETER(wParam);
277
278 pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
279
280 switch (uMsg)
281 {
282 case WM_INITDIALOG:
283 pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA));
284 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData);
285
286 pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER));
287
288 OnInitDialog(hwndDlg);
289 break;
290
291 case WM_COMMAND:
292 switch (LOWORD(wParam))
293 {
294 case IDM_USER_CHANGE_PASSWORD:
295 DialogBoxParam(hApplet,
296 MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),
297 hwndDlg,
298 ChangePasswordDlgProc,
299 (LPARAM)NULL);
300 break;
301
302 case IDM_USER_RENAME:
303 {
304 INT nItem;
305 HWND hwndLV;
306
307 hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
308 nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
309 if (nItem != -1)
310 {
311 (void)ListView_EditLabel(hwndLV, nItem);
312 }
313 }
314 break;
315
316 case IDM_USER_PROPERTIES:
317 MessageBeep(-1);
318 break;
319 }
320 break;
321
322 case WM_NOTIFY:
323 return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
324
325 case WM_DESTROY:
326 DestroyMenu(pUserData->hPopupMenu);
327 HeapFree(GetProcessHeap(), 0, pUserData);
328 break;
329 }
330
331 return FALSE;
332 }