Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengroups.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS User Manager Control Panel 00004 * FILE: dll/cpl/usrmgr/groups.c 00005 * PURPOSE: Groups property page 00006 * 00007 * PROGRAMMERS: Eric Kohl 00008 */ 00009 00010 #include "usrmgr.h" 00011 00012 typedef struct _GROUP_DATA 00013 { 00014 HMENU hPopupMenu; 00015 00016 INT iCurrentItem; 00017 00018 } GROUP_DATA, *PGROUP_DATA; 00019 00020 00021 static VOID 00022 SetGroupsListColumns(HWND hwndListView) 00023 { 00024 LV_COLUMN column; 00025 RECT rect; 00026 TCHAR szStr[32]; 00027 00028 GetClientRect(hwndListView, &rect); 00029 00030 memset(&column, 0x00, sizeof(column)); 00031 column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; 00032 column.fmt = LVCFMT_LEFT; 00033 column.cx = (INT)((rect.right - rect.left) * 0.40); 00034 column.iSubItem = 0; 00035 LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0])); 00036 column.pszText = szStr; 00037 (void)ListView_InsertColumn(hwndListView, 0, &column); 00038 00039 column.cx = (INT)((rect.right - rect.left) * 0.60); 00040 column.iSubItem = 1; 00041 LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0])); 00042 column.pszText = szStr; 00043 (void)ListView_InsertColumn(hwndListView, 1, &column); 00044 } 00045 00046 00047 static VOID 00048 UpdateGroupsList(HWND hwndListView) 00049 { 00050 NET_API_STATUS netStatus; 00051 PLOCALGROUP_INFO_1 pBuffer; 00052 DWORD entriesread; 00053 DWORD totalentries; 00054 DWORD_PTR resume_handle = 0; 00055 DWORD i; 00056 LV_ITEM lvi; 00057 INT iItem; 00058 00059 for (;;) 00060 { 00061 netStatus = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&pBuffer, 00062 1024, &entriesread, 00063 &totalentries, &resume_handle); 00064 if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) 00065 break; 00066 00067 for (i = 0; i < entriesread; i++) 00068 { 00069 memset(&lvi, 0x00, sizeof(lvi)); 00070 lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; 00071 lvi.pszText = pBuffer[i].lgrpi1_name; 00072 lvi.state = 0; 00073 lvi.iImage = 0; 00074 iItem = ListView_InsertItem(hwndListView, &lvi); 00075 00076 ListView_SetItemText(hwndListView, iItem, 1, 00077 pBuffer[i].lgrpi1_comment); 00078 } 00079 00080 NetApiBufferFree(pBuffer); 00081 00082 /* No more data left */ 00083 if (netStatus != ERROR_MORE_DATA) 00084 break; 00085 } 00086 00087 } 00088 00089 00090 static VOID 00091 UpdateGroupProperties(HWND hwndDlg) 00092 { 00093 TCHAR szGroupName[UNLEN]; 00094 INT iItem; 00095 HWND hwndLV; 00096 PLOCALGROUP_INFO_1 pGroupInfo = NULL; 00097 00098 hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); 00099 iItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); 00100 if (iItem == -1) 00101 return; 00102 00103 /* Get the group name */ 00104 ListView_GetItemText(hwndLV, 00105 iItem, 0, 00106 szGroupName, 00107 UNLEN); 00108 00109 NetLocalGroupGetInfo(NULL, szGroupName, 1, (LPBYTE*)&pGroupInfo); 00110 00111 ListView_SetItemText(hwndLV, iItem, 1, 00112 pGroupInfo->lgrpi1_comment); 00113 00114 NetApiBufferFree(pGroupInfo); 00115 } 00116 00117 00118 INT_PTR CALLBACK 00119 NewGroupDlgProc(HWND hwndDlg, 00120 UINT uMsg, 00121 WPARAM wParam, 00122 LPARAM lParam) 00123 { 00124 PLOCALGROUP_INFO_1 groupInfo; 00125 INT nLength; 00126 00127 UNREFERENCED_PARAMETER(wParam); 00128 00129 groupInfo = (PLOCALGROUP_INFO_1)GetWindowLongPtr(hwndDlg, DWLP_USER); 00130 00131 switch (uMsg) 00132 { 00133 case WM_INITDIALOG: 00134 SetWindowLongPtr(hwndDlg, DWLP_USER, lParam); 00135 groupInfo = (PLOCALGROUP_INFO_1)lParam; 00136 SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, EM_SETLIMITTEXT, 20, 0); 00137 break; 00138 00139 case WM_COMMAND: 00140 switch (LOWORD(wParam)) 00141 { 00142 case IDC_GROUP_NEW_NAME: 00143 if (HIWORD(wParam) == EN_CHANGE) 00144 { 00145 nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, WM_GETTEXTLENGTH, 0, 0); 00146 EnableWindow(GetDlgItem(hwndDlg, IDOK), (nLength > 0)); 00147 } 00148 break; 00149 00150 case IDOK: 00151 if (!CheckAccountName(hwndDlg, IDC_GROUP_NEW_NAME, NULL)) 00152 { 00153 SetFocus(GetDlgItem(hwndDlg, IDC_GROUP_NEW_NAME)); 00154 SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, EM_SETSEL, 0, -1); 00155 break; 00156 } 00157 00158 nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, WM_GETTEXTLENGTH, 0, 0); 00159 if (nLength > 0) 00160 { 00161 groupInfo->lgrpi1_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR)); 00162 GetDlgItemText(hwndDlg, IDC_GROUP_NEW_NAME, groupInfo->lgrpi1_name, nLength + 1); 00163 } 00164 00165 nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_DESCRIPTION, WM_GETTEXTLENGTH, 0, 0); 00166 if (nLength > 0) 00167 { 00168 groupInfo->lgrpi1_comment = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR)); 00169 GetDlgItemText(hwndDlg, IDC_GROUP_NEW_DESCRIPTION, groupInfo->lgrpi1_comment, nLength + 1); 00170 } 00171 00172 EndDialog(hwndDlg, IDOK); 00173 break; 00174 00175 case IDCANCEL: 00176 EndDialog(hwndDlg, IDCANCEL); 00177 break; 00178 } 00179 break; 00180 00181 default: 00182 return FALSE; 00183 } 00184 00185 return TRUE; 00186 } 00187 00188 00189 static VOID 00190 GroupNew(HWND hwndDlg) 00191 { 00192 NET_API_STATUS status; 00193 LOCALGROUP_INFO_1 group; 00194 LV_ITEM lvi; 00195 INT iItem; 00196 HWND hwndLV; 00197 00198 ZeroMemory(&group, sizeof(LOCALGROUP_INFO_1)); 00199 00200 if (DialogBoxParam(hApplet, 00201 MAKEINTRESOURCE(IDD_GROUP_NEW), 00202 hwndDlg, 00203 NewGroupDlgProc, 00204 (LPARAM)&group) == IDOK) 00205 { 00206 #if 0 00207 status = NetLocalGroupAdd(NULL, 00208 1, 00209 (LPBYTE)&group, 00210 NULL); 00211 #else 00212 status = NERR_Success; 00213 #endif 00214 if (status != NERR_Success) 00215 { 00216 TCHAR szText[256]; 00217 wsprintf(szText, TEXT("Error: %u"), status); 00218 MessageBox(NULL, szText, TEXT("NetUserAdd"), MB_ICONERROR | MB_OK); 00219 return; 00220 } 00221 00222 hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); 00223 00224 ZeroMemory(&lvi, sizeof(lvi)); 00225 lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; 00226 lvi.pszText = group.lgrpi1_name; 00227 lvi.state = 0; 00228 lvi.iImage = 0; 00229 iItem = ListView_InsertItem(hwndLV, &lvi); 00230 00231 ListView_SetItemText(hwndLV, iItem, 1, 00232 group.lgrpi1_comment); 00233 } 00234 00235 if (group.lgrpi1_name) 00236 HeapFree(GetProcessHeap(), 0, group.lgrpi1_name); 00237 00238 if (group.lgrpi1_comment) 00239 HeapFree(GetProcessHeap(), 0, group.lgrpi1_comment); 00240 } 00241 00242 00243 static VOID 00244 GroupRename(HWND hwndDlg) 00245 { 00246 INT nItem; 00247 HWND hwndLV; 00248 00249 hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); 00250 nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); 00251 if (nItem != -1) 00252 { 00253 (void)ListView_EditLabel(hwndLV, nItem); 00254 } 00255 } 00256 00257 00258 static BOOL 00259 GroupDelete(HWND hwndDlg) 00260 { 00261 TCHAR szGroupName[UNLEN]; 00262 TCHAR szText[256]; 00263 INT nItem; 00264 HWND hwndLV; 00265 NET_API_STATUS status; 00266 00267 hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); 00268 nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); 00269 if (nItem == -1) 00270 return FALSE; 00271 00272 /* Get the new group name */ 00273 ListView_GetItemText(hwndLV, 00274 nItem, 0, 00275 szGroupName, 00276 UNLEN); 00277 00278 /* Display a warning message, because the delete operation cannot be reverted */ 00279 wsprintf(szText, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName); 00280 if (MessageBox(NULL, szText, TEXT("User Groups"), MB_ICONWARNING | MB_YESNO) == IDNO) 00281 return FALSE; 00282 00283 /* Delete the group */ 00284 #if 0 00285 status = NetLocalGroupDel(NULL, szGroupName); 00286 #else 00287 status = NERR_Success; 00288 #endif 00289 if (status != NERR_Success) 00290 { 00291 TCHAR szText[256]; 00292 wsprintf(szText, TEXT("Error: %u"), status); 00293 MessageBox(NULL, szText, TEXT("NetLocalGroupDel"), MB_ICONERROR | MB_OK); 00294 return FALSE; 00295 } 00296 00297 /* Delete the group from the list */ 00298 (void)ListView_DeleteItem(hwndLV, nItem); 00299 00300 return TRUE; 00301 } 00302 00303 00304 static VOID 00305 OnInitDialog(HWND hwndDlg) 00306 { 00307 HWND hwndListView; 00308 HIMAGELIST hImgList; 00309 HICON hIcon; 00310 00311 /* Create the image list */ 00312 hImgList = ImageList_Create(16,16,ILC_COLOR8 | ILC_MASK,5,5); 00313 hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_GROUP),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); 00314 ImageList_AddIcon(hImgList,hIcon); 00315 DestroyIcon(hIcon); 00316 00317 hwndListView = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); 00318 00319 (VOID)ListView_SetImageList(hwndListView, hImgList, LVSIL_SMALL); 00320 00321 (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT); 00322 00323 SetGroupsListColumns(hwndListView); 00324 00325 UpdateGroupsList(hwndListView); 00326 } 00327 00328 00329 static BOOL 00330 OnBeginLabelEdit(LPNMLVDISPINFO pnmv) 00331 { 00332 HWND hwndEdit; 00333 00334 hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom); 00335 if (hwndEdit == NULL) 00336 return TRUE; 00337 00338 SendMessage(hwndEdit, EM_SETLIMITTEXT, 20, 0); 00339 00340 return FALSE; 00341 } 00342 00343 00344 static BOOL 00345 OnEndLabelEdit(LPNMLVDISPINFO pnmv) 00346 { 00347 TCHAR szOldGroupName[UNLEN]; 00348 TCHAR szNewGroupName[UNLEN]; 00349 //LOCALGROUP_INFO_0 lgrpi0; 00350 NET_API_STATUS status; 00351 00352 /* Leave, if there is no valid listview item */ 00353 if (pnmv->item.iItem == -1) 00354 return FALSE; 00355 00356 /* Get the new user name */ 00357 ListView_GetItemText(pnmv->hdr.hwndFrom, 00358 pnmv->item.iItem, 0, 00359 szOldGroupName, 00360 UNLEN); 00361 00362 /* Leave, if the user canceled the edit action */ 00363 if (pnmv->item.pszText == NULL) 00364 return FALSE; 00365 00366 /* Get the new user name */ 00367 lstrcpy(szNewGroupName, pnmv->item.pszText); 00368 00369 /* Leave, if the user name was not changed */ 00370 if (lstrcmp(szOldGroupName, szNewGroupName) == 0) 00371 return FALSE; 00372 00373 /* Check the group name for illegal characters */ 00374 if (!CheckAccountName(NULL, 0, szNewGroupName)) 00375 return FALSE; 00376 00377 /* Change the user name */ 00378 //lgrpi0.lgrpi0_name = szNewGroupName; 00379 00380 #if 0 00381 status = NetLocalGroupSetInfo(NULL, szOldGroupName, 0, (LPBYTE)&lgrpi0, NULL); 00382 #else 00383 status = NERR_Success; 00384 #endif 00385 if (status != NERR_Success) 00386 { 00387 TCHAR szText[256]; 00388 wsprintf(szText, TEXT("Error: %u"), status); 00389 MessageBox(NULL, szText, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR | MB_OK); 00390 return FALSE; 00391 } 00392 00393 /* Update the listview item */ 00394 ListView_SetItemText(pnmv->hdr.hwndFrom, 00395 pnmv->item.iItem, 0, 00396 szNewGroupName); 00397 00398 return TRUE; 00399 } 00400 00401 00402 static BOOL 00403 OnNotify(HWND hwndDlg, PGROUP_DATA pGroupData, NMHDR *phdr) 00404 { 00405 LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr; 00406 00407 switch (phdr->idFrom) 00408 { 00409 case IDC_GROUPS_LIST: 00410 switch(phdr->code) 00411 { 00412 case NM_CLICK: 00413 pGroupData->iCurrentItem = lpnmlv->iItem; 00414 break; 00415 00416 case NM_DBLCLK: 00417 if (lpnmlv->iItem != -1) 00418 { 00419 UINT uItem; 00420 00421 uItem = GetMenuDefaultItem(GetSubMenu(pGroupData->hPopupMenu, 1), 00422 FALSE, 0); 00423 if (uItem != (UINT)-1) 00424 SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(uItem, 0), 0); 00425 } 00426 break; 00427 00428 case NM_RCLICK: 00429 ClientToScreen(GetDlgItem(hwndDlg, IDC_GROUPS_LIST), &lpnmlv->ptAction); 00430 TrackPopupMenu(GetSubMenu(pGroupData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1), 00431 TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL); 00432 break; 00433 00434 case LVN_BEGINLABELEDIT: 00435 return OnBeginLabelEdit((LPNMLVDISPINFO)phdr); 00436 00437 case LVN_ENDLABELEDIT: 00438 return OnEndLabelEdit((LPNMLVDISPINFO)phdr); 00439 } 00440 break; 00441 } 00442 00443 return FALSE; 00444 } 00445 00446 00447 INT_PTR CALLBACK 00448 GroupsPageProc(HWND hwndDlg, 00449 UINT uMsg, 00450 WPARAM wParam, 00451 LPARAM lParam) 00452 { 00453 PGROUP_DATA pGroupData; 00454 00455 UNREFERENCED_PARAMETER(lParam); 00456 UNREFERENCED_PARAMETER(wParam); 00457 UNREFERENCED_PARAMETER(hwndDlg); 00458 00459 00460 pGroupData = (PGROUP_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER); 00461 00462 switch (uMsg) 00463 { 00464 case WM_INITDIALOG: 00465 pGroupData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GROUP_DATA)); 00466 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGroupData); 00467 00468 pGroupData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_GROUP)); 00469 00470 OnInitDialog(hwndDlg); 00471 SetMenuDefaultItem(GetSubMenu(pGroupData->hPopupMenu, 1), 00472 IDM_GROUP_PROPERTIES, 00473 FALSE); 00474 break; 00475 00476 case WM_COMMAND: 00477 switch (LOWORD(wParam)) 00478 { 00479 case IDM_GROUP_NEW: 00480 GroupNew(hwndDlg); 00481 break; 00482 00483 case IDM_GROUP_RENAME: 00484 GroupRename(hwndDlg); 00485 break; 00486 00487 case IDM_GROUP_DELETE: 00488 GroupDelete(hwndDlg); 00489 break; 00490 00491 case IDM_GROUP_PROPERTIES: 00492 if (GroupProperties(hwndDlg) == IDOK) 00493 UpdateGroupProperties(hwndDlg); 00494 break; 00495 } 00496 break; 00497 00498 case WM_NOTIFY: 00499 return OnNotify(hwndDlg, pGroupData, (NMHDR *)lParam); 00500 00501 case WM_DESTROY: 00502 DestroyMenu(pGroupData->hPopupMenu); 00503 HeapFree(GetProcessHeap(), 0, pGroupData); 00504 break; 00505 } 00506 00507 return FALSE; 00508 } Generated on Sat May 26 2012 04:19:48 for ReactOS by
1.7.6.1
|