ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

groups.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.