windows-nt/Source/XPSP1/NT/ds/security/gina/policy/poledit/copy.c
2020-09-26 16:20:57 +08:00

186 lines
4.6 KiB
C

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1993 **
//*********************************************************************
#include "admincfg.h"
HGLOBAL AllocateUser(TCHAR * szName,DWORD dwType);
HGLOBAL hClipboardUser = NULL;
BOOL OnCopy(HWND hwndApp,HWND hwndList)
{
int iSel;
HGLOBAL hUser;
USERDATA * pUserData;
DWORD dwType;
// make sure we can copy... shouldn't get called otherwise, but safety first
if (!CanCopy(hwndList))
return FALSE;
iSel = ListView_GetNextItem(hwndList,-1,LVNI_SELECTED);
if (iSel < 0)
return FALSE;
hUser = (HGLOBAL) LongToHandle(ListView_GetItemParm(hwndList,iSel));
if (!hUser || !(pUserData = (USERDATA *) GlobalLock(hUser)))
return FALSE;
dwType = (pUserData->hdr.dwType & UT_MASK);
GlobalUnlock(hUser);
// free clipboard user if already allocated
if (hClipboardUser) {
GlobalFree(hClipboardUser);
hClipboardUser = NULL;
}
// allocate a clipboard user handle
hClipboardUser = AllocateUser(TEXT(""),dwType);
if (!hClipboardUser) {
MsgBox(hwndApp,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
return FALSE;
}
if (!CopyUser(hUser,hClipboardUser)) {
MsgBox(hwndApp,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
return FALSE;
}
EnableMenuItems(hwndApp,dwAppState);
return TRUE;
}
BOOL OnPaste(HWND hwndApp,HWND hwndList)
{
int iItem = -1,iSelItem;
DWORD dwClipboardUserType;
HGLOBAL hUser;
UINT nSelItems=0;
// make sure we can paste... shouldn't get called otherwise, but safety first
if (!CanPaste(hwndList))
return FALSE;
// find out how many items are selected
while ((iItem=ListView_GetNextItem(hwndList,iItem,LVNI_SELECTED))
>=0) {
iSelItem = iItem;
nSelItems++;
}
dwClipboardUserType = GetClipboardUserType();
// display appropriate confirmation message depending on whether 1 user,
// 1 computer, or multiple items selected
if (nSelItems == 1) {
HGLOBAL hUser;
USERDATA *pUserData;
UINT uMsg;
int nRet;
if (!(hUser = (HGLOBAL) LongToHandle(ListView_GetItemParm(hwndList,iSelItem))) ||
!(pUserData = (USERDATA *) GlobalLock(hUser)))
return FALSE;
uMsg = pUserData->hdr.dwType & UT_USER ? IDS_QUERYPASTE_USER
: IDS_QUERYPASTE_WORKSTA;
nRet=MsgBoxParam(hwndApp,uMsg,pUserData->hdr.szName,MB_ICONQUESTION,
MB_YESNO);
GlobalUnlock(hUser);
if (nRet != IDYES)
return FALSE;
} else {
if (MsgBox(hwndApp,IDS_QUERYPASTE_MULTIPLE,MB_ICONQUESTION,MB_YESNO)
!= IDYES)
return FALSE;
}
iItem = -1;
while ((iItem=ListView_GetNextItem(hwndList,iItem,LVNI_SELECTED)) > -1) {
if ((hUser = (HGLOBAL) LongToHandle(ListView_GetItemParm(hwndList,iItem)))) {
if (!CopyUser(hClipboardUser,hUser)) {
MsgBox(hwndApp,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
return FALSE;
}
}
}
return TRUE;
}
// returns the type of user (user or computer) pasted to the "clipboard"
UINT GetClipboardUserType(VOID)
{
USERDATA * pUserData;
DWORD dwType;
if (!hClipboardUser || !(pUserData = (USERDATA *) GlobalLock(hClipboardUser)))
return 0;
dwType = (pUserData->hdr.dwType & UT_MASK);
GlobalUnlock(hClipboardUser);
return dwType;
}
// returns TRUE if the copy menu item should be enabled. This will
// happen if in policy file mode and exactly one item selected in listview
BOOL CanCopy(HWND hwndList)
{
int iItem=-1;
UINT nCount = 0;
if (dwAppState & AS_POLICYFILE) {
while ((iItem=ListView_GetNextItem(hwndList,iItem,LVNI_SELECTED)) > -1)
nCount ++;
}
return (nCount == 1);
}
// returns TRUE if the paste menu item should be enabled. This will happen
// if in policy file mode, have a user on the clipboard, there is at least one
// selected item and all the selected items are the same type (user or computer)
// as the item on the clipboard
BOOL CanPaste(HWND hwndList)
{
int iItem = -1;
DWORD dwClipboardUserType;
UINT nCount = 0;
HGLOBAL hUser;
USERDATA * pUserData;
BOOL fMatch;
if (!(dwAppState & AS_POLICYFILE) || !(hClipboardUser))
return FALSE;
dwClipboardUserType = GetClipboardUserType();
while ((iItem=ListView_GetNextItem(hwndList,iItem,LVNI_SELECTED)) > -1) {
nCount ++;
if ((hUser = (HGLOBAL) LongToHandle(ListView_GetItemParm(hwndList,iItem)))) {
if (!(pUserData = (USERDATA *) GlobalLock(hUser)))
return FALSE;
// is this user the same type as the one on the clipboard?
fMatch = (pUserData->hdr.dwType & dwClipboardUserType);
GlobalUnlock(hUser);
if (!fMatch)
return FALSE;
}
}
if (!nCount)
return FALSE;
return TRUE;
}