Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS User Manager Control Panel * FILE: dll/cpl/usrmgr/groups.c * PURPOSE: Groups property page * * PROGRAMMERS: Eric Kohl */
#include "usrmgr.h"
typedef struct _GROUP_DATA{ HMENU hPopupMenu;
INT iCurrentItem;
} GROUP_DATA, *PGROUP_DATA;
static VOIDSetGroupsListColumns(HWND hwndListView){ LV_COLUMN column; RECT rect; TCHAR szStr[32];
GetClientRect(hwndListView, &rect);
memset(&column, 0x00, sizeof(column)); column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.40); column.iSubItem = 0; LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 0, &column);
column.cx = (INT)((rect.right - rect.left) * 0.60); column.iSubItem = 1; LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndListView, 1, &column);}
static VOIDUpdateGroupsList(HWND hwndListView){ NET_API_STATUS netStatus; PLOCALGROUP_INFO_1 pBuffer; DWORD entriesread; DWORD totalentries; DWORD_PTR resume_handle = 0; DWORD i; LV_ITEM lvi; INT iItem;
for (;;) { netStatus = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&pBuffer, 1024, &entriesread, &totalentries, &resume_handle); if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) break;
for (i = 0; i < entriesread; i++) { memset(&lvi, 0x00, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; lvi.pszText = pBuffer[i].lgrpi1_name; lvi.state = 0; lvi.iImage = 0; iItem = ListView_InsertItem(hwndListView, &lvi);
ListView_SetItemText(hwndListView, iItem, 1, pBuffer[i].lgrpi1_comment); }
NetApiBufferFree(pBuffer);
/* No more data left */ if (netStatus != ERROR_MORE_DATA) break; }
}
static VOIDUpdateGroupProperties(HWND hwndDlg){ TCHAR szGroupName[UNLEN + 1]; INT iItem; HWND hwndLV; PLOCALGROUP_INFO_1 pGroupInfo = NULL;
hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); iItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); if (iItem == -1) return;
/* Get the group name */ ListView_GetItemText(hwndLV, iItem, 0, szGroupName, UNLEN + 1);
NetLocalGroupGetInfo(NULL, szGroupName, 1, (LPBYTE*)&pGroupInfo);
ListView_SetItemText(hwndLV, iItem, 1, pGroupInfo->lgrpi1_comment);
NetApiBufferFree(pGroupInfo);}
INT_PTR CALLBACKNewGroupDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PLOCALGROUP_INFO_1 groupInfo; INT nLength;
UNREFERENCED_PARAMETER(wParam);
groupInfo = (PLOCALGROUP_INFO_1)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: SetWindowLongPtr(hwndDlg, DWLP_USER, lParam); groupInfo = (PLOCALGROUP_INFO_1)lParam; SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, EM_SETLIMITTEXT, 20, 0); break;
case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_GROUP_NEW_NAME: if (HIWORD(wParam) == EN_CHANGE) { nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, WM_GETTEXTLENGTH, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDOK), (nLength > 0)); } break;
case IDOK: if (!CheckAccountName(hwndDlg, IDC_GROUP_NEW_NAME, NULL)) { SetFocus(GetDlgItem(hwndDlg, IDC_GROUP_NEW_NAME)); SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, EM_SETSEL, 0, -1); break; }
/* Get Name */ groupInfo->lgrpi1_name = GetDlgItemTextAlloc(hwndDlg, IDC_GROUP_NEW_NAME);
/* Get Description */ groupInfo->lgrpi1_comment = GetDlgItemTextAlloc(hwndDlg, IDC_GROUP_NEW_DESCRIPTION);
EndDialog(hwndDlg, IDOK); break;
case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); break; } break;
default: return FALSE; }
return TRUE;}
static VOIDGroupNew(HWND hwndDlg){ NET_API_STATUS status; LOCALGROUP_INFO_1 group; LV_ITEM lvi; INT iItem; HWND hwndLV;
ZeroMemory(&group, sizeof(LOCALGROUP_INFO_1));
if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_GROUP_NEW), hwndDlg, NewGroupDlgProc, (LPARAM)&group) == IDOK) { status = NetLocalGroupAdd(NULL, 1, (LPBYTE)&group, NULL); if (status != NERR_Success) { TCHAR szText[256]; wsprintf(szText, TEXT("Error: %u"), status); MessageBox(NULL, szText, TEXT("NetUserAdd"), MB_ICONERROR | MB_OK); return; }
hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST);
ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; lvi.pszText = group.lgrpi1_name; lvi.state = 0; lvi.iImage = 0; iItem = ListView_InsertItem(hwndLV, &lvi);
ListView_SetItemText(hwndLV, iItem, 1, group.lgrpi1_comment); }
HeapFree(GetProcessHeap(), 0, group.lgrpi1_name); HeapFree(GetProcessHeap(), 0, group.lgrpi1_comment);}
static VOIDGroupRename(HWND hwndDlg){ INT nItem; HWND hwndLV;
hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); if (nItem != -1) { (void)ListView_EditLabel(hwndLV, nItem); }}
static BOOLGroupDelete(HWND hwndDlg){ TCHAR szGroupName[UNLEN + 1]; TCHAR szText[256]; INT nItem; HWND hwndLV; NET_API_STATUS status;
hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST); nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); if (nItem == -1) return FALSE;
/* Get the new group name */ ListView_GetItemText(hwndLV, nItem, 0, szGroupName, UNLEN + 1);
/* Display a warning message, because the delete operation cannot be reverted */ wsprintf(szText, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName); if (MessageBox(NULL, szText, TEXT("User Groups"), MB_ICONWARNING | MB_YESNO) == IDNO) return FALSE;
/* Delete the group */ status = NetLocalGroupDel(NULL, szGroupName); if (status != NERR_Success) { TCHAR szText[256]; wsprintf(szText, TEXT("Error: %u"), status); MessageBox(NULL, szText, TEXT("NetLocalGroupDel"), MB_ICONERROR | MB_OK); return FALSE; }
/* Delete the group from the list */ (void)ListView_DeleteItem(hwndLV, nItem);
return TRUE;}
static VOIDOnGroupsPageInitDialog(HWND hwndDlg){ HWND hwndListView; HIMAGELIST hImgList; HICON hIcon;
/* Create the image list */ hImgList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 5, 5); hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_GROUP), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ImageList_AddIcon(hImgList, hIcon); DestroyIcon(hIcon);
hwndListView = GetDlgItem(hwndDlg, IDC_GROUPS_LIST);
(VOID)ListView_SetImageList(hwndListView, hImgList, LVSIL_SMALL);
(void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
SetGroupsListColumns(hwndListView);
UpdateGroupsList(hwndListView);}
static BOOLOnGroupsPageBeginLabelEdit(LPNMLVDISPINFO pnmv){ HWND hwndEdit;
hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom); if (hwndEdit == NULL) return TRUE;
SendMessage(hwndEdit, EM_SETLIMITTEXT, 20, 0);
return FALSE;}
static BOOLOnGroupsPageEndLabelEdit(LPNMLVDISPINFO pnmv){ TCHAR szOldGroupName[UNLEN + 1]; TCHAR szNewGroupName[UNLEN + 1]; LOCALGROUP_INFO_0 lgrpi0; NET_API_STATUS status;
/* Leave, if there is no valid listview item */ if (pnmv->item.iItem == -1) return FALSE;
/* Get the new user name */ ListView_GetItemText(pnmv->hdr.hwndFrom, pnmv->item.iItem, 0, szOldGroupName, UNLEN + 1);
/* Leave, if the user canceled the edit action */ if (pnmv->item.pszText == NULL) return FALSE;
/* Get the new user name */ lstrcpy(szNewGroupName, pnmv->item.pszText);
/* Leave, if the user name was not changed */ if (lstrcmp(szOldGroupName, szNewGroupName) == 0) return FALSE;
/* Check the group name for illegal characters */ if (!CheckAccountName(NULL, 0, szNewGroupName)) return FALSE;
/* Change the user name */ lgrpi0.lgrpi0_name = szNewGroupName;
status = NetLocalGroupSetInfo(NULL, szOldGroupName, 0, (LPBYTE)&lgrpi0, NULL); if (status != NERR_Success) { TCHAR szText[256]; wsprintf(szText, TEXT("Error: %u"), status); MessageBox(NULL, szText, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR | MB_OK); return FALSE; }
/* Update the listview item */ ListView_SetItemText(pnmv->hdr.hwndFrom, pnmv->item.iItem, 0, szNewGroupName);
return TRUE;}
static BOOLOnGroupsPageNotify(HWND hwndDlg, PGROUP_DATA pGroupData, NMHDR *phdr){ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
switch (phdr->idFrom) { case IDC_GROUPS_LIST: switch(phdr->code) { case NM_CLICK: pGroupData->iCurrentItem = lpnmlv->iItem; break;
case NM_DBLCLK: if (lpnmlv->iItem != -1) { UINT uItem;
uItem = GetMenuDefaultItem(GetSubMenu(pGroupData->hPopupMenu, 1), FALSE, 0); if (uItem != (UINT)-1) SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(uItem, 0), 0); } break;
case NM_RCLICK: ClientToScreen(GetDlgItem(hwndDlg, IDC_GROUPS_LIST), &lpnmlv->ptAction); TrackPopupMenu(GetSubMenu(pGroupData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1), TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL); break;
case LVN_BEGINLABELEDIT: return OnGroupsPageBeginLabelEdit((LPNMLVDISPINFO)phdr);
case LVN_ENDLABELEDIT: return OnGroupsPageEndLabelEdit((LPNMLVDISPINFO)phdr); } break; }
return FALSE;}
INT_PTR CALLBACKGroupsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PGROUP_DATA pGroupData;
UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(hwndDlg);
pGroupData = (PGROUP_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: pGroupData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GROUP_DATA)); SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGroupData);
pGroupData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_GROUP));
OnGroupsPageInitDialog(hwndDlg); SetMenuDefaultItem(GetSubMenu(pGroupData->hPopupMenu, 1), IDM_GROUP_PROPERTIES, FALSE); break;
case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_GROUP_NEW: case IDC_GROUPS_ADD: GroupNew(hwndDlg); break;
case IDM_GROUP_RENAME: GroupRename(hwndDlg); break;
case IDM_GROUP_DELETE: case IDC_GROUPS_REMOVE: GroupDelete(hwndDlg); break;
case IDM_GROUP_PROPERTIES: case IDC_GROUPS_PROPERTIES: if (GroupProperties(hwndDlg) == IDOK) UpdateGroupProperties(hwndDlg); break; } break;
case WM_NOTIFY: return OnGroupsPageNotify(hwndDlg, pGroupData, (NMHDR *)lParam);
case WM_DESTROY: DestroyMenu(pGroupData->hPopupMenu); HeapFree(GetProcessHeap(), 0, pGroupData); break; }
return FALSE;}