340 lines
8 KiB
C
340 lines
8 KiB
C
|
//*********************************************************************
|
||
|
//* Microsoft Windows **
|
||
|
//* Copyright(c) Microsoft Corp., 1994 **
|
||
|
//*********************************************************************
|
||
|
|
||
|
#include "admincfg.h"
|
||
|
#include "grouppri.h"
|
||
|
|
||
|
#ifdef INCL_GROUP_SUPPORT
|
||
|
|
||
|
GROUPPRIENTRY * pGroupPriEntryFirst = NULL; // head of linked list
|
||
|
INT_PTR CALLBACK GroupPriorityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam);
|
||
|
extern HIMAGELIST hImageListSmall;
|
||
|
VOID EnableDlgButtons(HWND hDlg);
|
||
|
|
||
|
GROUPPRIENTRY * FindGroupPriEntry(TCHAR * pszGroupName)
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
|
||
|
|
||
|
while (pGroupPriEntry) {
|
||
|
if (!lstrcmpi(pszGroupName,pGroupPriEntry->pszGroupName))
|
||
|
return pGroupPriEntry;
|
||
|
pGroupPriEntry = pGroupPriEntry->pNext;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
BOOL AddGroupPriEntry(TCHAR * pszGroupName)
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntryNew;
|
||
|
|
||
|
if (FindGroupPriEntry(pszGroupName))
|
||
|
return TRUE; // already in list
|
||
|
|
||
|
pGroupPriEntryNew = (GROUPPRIENTRY * ) GlobalAlloc(GPTR,sizeof(GROUPPRIENTRY)
|
||
|
+ ((lstrlen(pszGroupName) + 1) * sizeof(TCHAR)));
|
||
|
|
||
|
if (!pGroupPriEntryNew)
|
||
|
return FALSE; // out of memory
|
||
|
|
||
|
pGroupPriEntryNew->pNext = NULL;
|
||
|
pGroupPriEntryNew->pszGroupName = ((LPBYTE) pGroupPriEntryNew)
|
||
|
+ sizeof(GROUPPRIENTRY);
|
||
|
lstrcpy(pGroupPriEntryNew->pszGroupName,pszGroupName);
|
||
|
|
||
|
if (!pGroupPriEntryFirst) {
|
||
|
pGroupPriEntryFirst = pGroupPriEntryNew;
|
||
|
pGroupPriEntryNew->pPrev = NULL;
|
||
|
} else {
|
||
|
// attach to end of linked list
|
||
|
GROUPPRIENTRY * pGroupPriEntryLast = pGroupPriEntryFirst;
|
||
|
while (pGroupPriEntryLast->pNext)
|
||
|
pGroupPriEntryLast=pGroupPriEntryLast->pNext;
|
||
|
|
||
|
pGroupPriEntryLast->pNext = pGroupPriEntryNew;
|
||
|
pGroupPriEntryNew->pPrev = pGroupPriEntryLast;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL RemoveGroupPriEntry(TCHAR * pszGroupName)
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntry;
|
||
|
|
||
|
if (!(pGroupPriEntry=FindGroupPriEntry(pszGroupName)))
|
||
|
return FALSE;
|
||
|
|
||
|
// fix up linked list
|
||
|
if (pGroupPriEntry == pGroupPriEntryFirst)
|
||
|
pGroupPriEntryFirst = pGroupPriEntry->pNext;
|
||
|
|
||
|
if (pGroupPriEntry->pPrev)
|
||
|
(pGroupPriEntry->pPrev)->pNext = pGroupPriEntry->pNext;
|
||
|
|
||
|
if (pGroupPriEntry->pNext)
|
||
|
(pGroupPriEntry->pNext)->pPrev = pGroupPriEntry->pPrev;
|
||
|
|
||
|
GlobalFree(pGroupPriEntry);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
VOID FreeGroupPriorityList( VOID )
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntry=pGroupPriEntryFirst,* pGroupPriEntryNext;
|
||
|
|
||
|
while (pGroupPriEntry) {
|
||
|
pGroupPriEntryNext = pGroupPriEntry->pNext;
|
||
|
GlobalFree(pGroupPriEntry);
|
||
|
pGroupPriEntry = pGroupPriEntryNext;
|
||
|
}
|
||
|
|
||
|
pGroupPriEntryFirst = NULL;
|
||
|
}
|
||
|
|
||
|
UINT LoadGroupPriorityList(HKEY hkeyPriority,HKEY hkeyGroup)
|
||
|
{
|
||
|
TCHAR szValueName[10],szGroupName[USERNAMELEN+1];
|
||
|
UINT uGroupIndex=1,uErr = ERROR_SUCCESS;
|
||
|
DWORD dwSize;
|
||
|
|
||
|
FreeGroupPriorityList();
|
||
|
|
||
|
while (uErr == ERROR_SUCCESS) {
|
||
|
wsprintf(szValueName,TEXT("%lu"),uGroupIndex);
|
||
|
dwSize = ARRAYSIZE(szGroupName) * sizeof(TCHAR);
|
||
|
uErr = RegQueryValueEx(hkeyPriority,szValueName,NULL,NULL,szGroupName,
|
||
|
&dwSize);
|
||
|
if (uErr == ERROR_SUCCESS) {
|
||
|
HKEY hkeyTmp;
|
||
|
|
||
|
// as sanity check: only add group priority entry if we find an
|
||
|
// entry for group in policy file
|
||
|
if (RegOpenKey(hkeyGroup,szGroupName,&hkeyTmp) == ERROR_SUCCESS) {
|
||
|
RegCloseKey(hkeyTmp);
|
||
|
|
||
|
if (!AddGroupPriEntry(szGroupName))
|
||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||
|
}
|
||
|
}
|
||
|
uGroupIndex++;
|
||
|
}
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
UINT SaveGroupPriorityList(HKEY hKey)
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
|
||
|
UINT uRet;
|
||
|
DWORD cbValueName;
|
||
|
TCHAR szValueName[MAX_PATH+1];
|
||
|
UINT uGroupIndex=1;
|
||
|
|
||
|
// erase all values for this key, first off
|
||
|
while (TRUE) {
|
||
|
cbValueName=ARRAYSIZE(szValueName);
|
||
|
uRet=RegEnumValue(hKey,0,szValueName,&cbValueName,NULL,
|
||
|
NULL,NULL,NULL);
|
||
|
// stop if we're out of items
|
||
|
if (uRet != ERROR_SUCCESS && uRet != ERROR_MORE_DATA)
|
||
|
break;
|
||
|
RegDeleteValue(hKey,szValueName);
|
||
|
}
|
||
|
uRet = ERROR_SUCCESS;
|
||
|
|
||
|
while (pGroupPriEntry) {
|
||
|
wsprintf(szValueName,TEXT("%lu"),uGroupIndex);
|
||
|
|
||
|
uRet = RegSetValueEx(hKey,szValueName,0,REG_SZ,pGroupPriEntry->pszGroupName,
|
||
|
((lstrlen(pGroupPriEntry->pszGroupName)+1) * sizeof(TCHAR)));
|
||
|
if (uRet != ERROR_SUCCESS) {
|
||
|
return uRet;
|
||
|
}
|
||
|
uGroupIndex++;
|
||
|
pGroupPriEntry = pGroupPriEntry->pNext;
|
||
|
}
|
||
|
|
||
|
return uRet;
|
||
|
}
|
||
|
|
||
|
BOOL OnGroupPriority(HWND hWnd)
|
||
|
{
|
||
|
return (BOOL)DialogBox(ghInst,MAKEINTRESOURCE(DLG_GROUPPRIORITY),hWnd,
|
||
|
GroupPriorityDlgProc);
|
||
|
}
|
||
|
|
||
|
BOOL InitGroupPriorityDlg(HWND hDlg)
|
||
|
{
|
||
|
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
|
||
|
LV_ITEM lvi;
|
||
|
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
|
||
|
LV_COLUMN lvc;
|
||
|
|
||
|
lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
|
||
|
lvc.fmt = LVCFMT_LEFT;
|
||
|
lvc.cx = 150;
|
||
|
lvc.pszText = (LPTSTR) szNull;
|
||
|
lvc.cchTextMax = 1;
|
||
|
lvc.iSubItem = 0;
|
||
|
ListView_InsertColumn(hwndList,0,&lvc);
|
||
|
|
||
|
SetWindowLong(hwndList,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
|
||
|
SetScrollRange(hwndList,SB_VERT,0,100,TRUE);
|
||
|
SetScrollRange(hwndList,SB_VERT,0,0,TRUE);
|
||
|
ListView_SetImageList(hwndList,hImageListSmall,LVSIL_SMALL);
|
||
|
|
||
|
lvi.iItem =lvi.iSubItem=0;
|
||
|
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
||
|
lvi.iImage = IMG_USERS;
|
||
|
|
||
|
// insert members of group list into listbox in current priority order
|
||
|
while (pGroupPriEntry) {
|
||
|
lvi.pszText = pGroupPriEntry->pszGroupName;
|
||
|
lvi.cchTextMax = lstrlen(lvi.pszText) + 1;
|
||
|
lvi.lParam = (LPARAM) pGroupPriEntry; // save pointer to node in lparam
|
||
|
|
||
|
ListView_InsertItem(hwndList,&lvi);
|
||
|
|
||
|
lvi.iItem ++;
|
||
|
pGroupPriEntry = pGroupPriEntry->pNext;
|
||
|
}
|
||
|
|
||
|
EnableDlgButtons(hDlg);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
VOID EnableDlgButtons(HWND hDlg)
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
|
||
|
int nItem;
|
||
|
BOOL fMoveUpOK=FALSE,fMoveDownOK=FALSE;
|
||
|
|
||
|
// if item is selected, enable up/down buttons appropriately
|
||
|
nItem=ListView_GetNextItem(hwndList,-1,LVNI_SELECTED);
|
||
|
|
||
|
if (nItem >=0) {
|
||
|
if (nItem > 0)
|
||
|
fMoveUpOK = TRUE;
|
||
|
|
||
|
if (nItem < ListView_GetItemCount(hwndList) -1)
|
||
|
fMoveDownOK = TRUE;
|
||
|
}
|
||
|
|
||
|
EnableDlgItem(hDlg,IDD_MOVEUP,fMoveUpOK);
|
||
|
EnableDlgItem(hDlg,IDD_MOVEDOWN,fMoveDownOK);
|
||
|
}
|
||
|
|
||
|
VOID MoveGroupItem(HWND hDlg,int iDelta)
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
|
||
|
LV_ITEM lvi;
|
||
|
TCHAR szText[MAX_PATH+1];
|
||
|
|
||
|
lvi.iItem=ListView_GetNextItem(hwndList,-1,LVNI_SELECTED);
|
||
|
|
||
|
if (lvi.iItem <0)
|
||
|
return;
|
||
|
|
||
|
lvi.iSubItem = 0;
|
||
|
lvi.mask = LVIF_ALL;
|
||
|
lvi.pszText = szText;
|
||
|
lvi.cchTextMax = ARRAYSIZE(szText)+1;
|
||
|
if (ListView_GetItem(hwndList,&lvi)) {
|
||
|
ListView_DeleteItem(hwndList,lvi.iItem);
|
||
|
lvi.iItem += iDelta;
|
||
|
lvi.state = LVIS_SELECTED;
|
||
|
lvi.stateMask = LVIS_SELECTED;
|
||
|
ListView_InsertItem(hwndList,&lvi);
|
||
|
}
|
||
|
|
||
|
SetFocus(hwndList);
|
||
|
}
|
||
|
|
||
|
BOOL ProcessGroupPriorityDlg(HWND hDlg)
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
|
||
|
int iMax = ListView_GetItemCount(hwndList),iItem;
|
||
|
GROUPPRIENTRY * pGroupPriEntry;
|
||
|
GROUPPRIENTRY * pGroupPriEntryLast;
|
||
|
|
||
|
// relink the list in the order the entries now appear in the listbox
|
||
|
for (iItem = 0;iItem < iMax;iItem ++) {
|
||
|
pGroupPriEntry = (GROUPPRIENTRY *)
|
||
|
IntToPtr(ListView_GetItemParm(hwndList,iItem));
|
||
|
|
||
|
if (iItem == 0) {
|
||
|
pGroupPriEntryFirst=pGroupPriEntryLast = pGroupPriEntry;
|
||
|
pGroupPriEntry->pPrev = pGroupPriEntry->pNext = NULL;
|
||
|
} else {
|
||
|
pGroupPriEntryLast->pNext = pGroupPriEntry;
|
||
|
pGroupPriEntry->pPrev = pGroupPriEntryLast;
|
||
|
pGroupPriEntry->pNext = NULL;
|
||
|
pGroupPriEntryLast = pGroupPriEntry;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dwAppState |= AS_FILEDIRTY;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK GroupPriorityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg) {
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
InitGroupPriorityDlg(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
|
||
|
switch (wParam) {
|
||
|
|
||
|
case IDOK:
|
||
|
|
||
|
if (ProcessGroupPriorityDlg(hDlg))
|
||
|
EndDialog(hDlg,TRUE);
|
||
|
return TRUE;
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
|
||
|
EndDialog(hDlg,FALSE);
|
||
|
return TRUE;
|
||
|
break;
|
||
|
|
||
|
case IDD_MOVEUP:
|
||
|
MoveGroupItem(hDlg,-1);
|
||
|
break;
|
||
|
|
||
|
case IDD_MOVEDOWN:
|
||
|
MoveGroupItem(hDlg,1);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
|
||
|
if ( ((LPNMHDR) lParam)->hwndFrom == GetDlgItem(hDlg,IDD_GROUPORDER))
|
||
|
EnableDlgButtons(hDlg);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif // INCL_GROUP_SUPPORT
|