windows-nt/Source/XPSP1/NT/admin/netui/llsmgr/ausrdlg.cpp
2020-09-26 16:20:57 +08:00

897 lines
16 KiB
C++

/*++
Copyright (c) 1994-95 Microsoft Corporation
Module Name:
ausrdlg.cpp
Abstract:
Add user dialog implementation.
Author:
Don Ryan (donryan) 14-Feb-1995
Environment:
User Mode - Win32
Revision History:
Jeff Parham (jeffparh) 30-Jan-1996
o Added new element to LV_COLUMN_ENTRY to differentiate the string
used for the column header from the string used in the menus
(so that the menu option can contain hot keys).
--*/
#include "stdafx.h"
#include "llsmgr.h"
#include "ausrdlg.h"
static LV_COLUMN_INFO g_userColumnInfo = {0, 0, 1, {0, 0, 0, -1}};
static LV_COLUMN_INFO g_addedColumnInfo = {0, 0, 1, {0, 0, 0, -1}};
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CAddUsersDialog, CDialog)
//{{AFX_MSG_MAP(CAddUsersDialog)
ON_CBN_DROPDOWN(IDC_ADD_USERS_DOMAINS, OnDropdownDomains)
ON_BN_CLICKED(IDC_ADD_USERS_ADD, OnAdd)
ON_BN_CLICKED(IDC_ADD_USERS_DELETE, OnDelete)
ON_NOTIFY(NM_DBLCLK, IDC_ADD_USERS_ADD_USERS, OnDblclkAddUsers)
ON_NOTIFY(NM_DBLCLK, IDC_ADD_USERS_USERS, OnDblclkUsers)
ON_CBN_SELCHANGE(IDC_ADD_USERS_DOMAINS, OnSelchangeDomains)
ON_NOTIFY(LVN_GETDISPINFO, IDC_ADD_USERS_USERS, OnGetdispinfoUsers)
ON_NOTIFY(NM_KILLFOCUS, IDC_ADD_USERS_USERS, OnKillfocusUsers)
ON_NOTIFY(NM_SETFOCUS, IDC_ADD_USERS_USERS, OnSetfocusUsers)
ON_NOTIFY(NM_KILLFOCUS, IDC_ADD_USERS_ADD_USERS, OnKillfocusAddUsers)
ON_NOTIFY(NM_SETFOCUS, IDC_ADD_USERS_ADD_USERS, OnSetfocusAddUsers)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CAddUsersDialog::CAddUsersDialog(CWnd* pParent /*=NULL*/)
: CDialog(CAddUsersDialog::IDD, pParent)
/*++
Routine Description:
Constructor for add user dialog.
Arguments:
pParent - parent window handle.
Return Values:
None.
--*/
{
//{{AFX_DATA_INIT(CAddUsersDialog)
m_iDomain = -1;
m_iIndex = 0;
//}}AFX_DATA_INIT
m_pObList = NULL;
m_bIsDomainListExpanded = FALSE;
m_bIsFocusUserList = FALSE;
m_bIsFocusAddedList = FALSE;
}
void CAddUsersDialog::DoDataExchange(CDataExchange* pDX)
/*++
Routine Description:
Called by framework to exchange dialog data.
Arguments:
pDX - data exchange object.
Return Values:
None.
--*/
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddUsersDialog)
DDX_Control(pDX, IDC_ADD_USERS_ADD, m_addBtn);
DDX_Control(pDX, IDC_ADD_USERS_DELETE, m_delBtn);
DDX_Control(pDX, IDC_ADD_USERS_DOMAINS, m_domainList);
DDX_Control(pDX, IDC_ADD_USERS_ADD_USERS, m_addedList);
DDX_Control(pDX, IDC_ADD_USERS_USERS, m_userList);
DDX_CBIndex(pDX, IDC_ADD_USERS_DOMAINS, m_iDomain);
//}}AFX_DATA_MAP
}
void CAddUsersDialog::InitDialog(CObList* pObList)
/*++
Routine Description:
Initializes return list.
Arguments:
pObList - pointer to return list.
Return Values:
None.
--*/
{
ASSERT_VALID(pObList);
m_pObList = pObList;
}
void CAddUsersDialog::InitDomainList()
/*++
Routine Description:
Initializes list of domains.
Arguments:
None.
Return Values:
VT_BOOL.
--*/
{
int iDomain;
CString strLabel;
strLabel.LoadString(IDS_DEFAULT_DOMAIN);
if ((iDomain = m_domainList.AddString(strLabel)) != CB_ERR)
{
m_domainList.SetCurSel(iDomain);
m_domainList.SetItemDataPtr(iDomain, (LPVOID)-1L);
}
else
{
theApp.DisplayStatus( STATUS_NO_MEMORY );
}
}
void CAddUsersDialog::InitUserList()
/*++
Routine Description:
Initializes list of users.
Arguments:
None.
Return Values:
None.
--*/
{
::LvInitColumns(&m_userList, &g_userColumnInfo);
::LvInitColumns(&m_addedList, &g_addedColumnInfo);
}
BOOL CAddUsersDialog::InsertDomains(CDomains* pDomains)
/*++
Routine Description:
Inserts domains into domain list.
Arguments:
pDomains - domain collection.
Return Values:
None.
--*/
{
NTSTATUS NtStatus = STATUS_SUCCESS;
ASSERT_VALID(pDomains);
if (pDomains)
{
VARIANT va;
VariantInit(&va);
CDomain* pDomain;
int iDomain;
int nDomains = pDomains->GetCount();
for (va.vt = VT_I4, va.lVal = 0; (va.lVal < nDomains) && NT_SUCCESS(NtStatus); va.lVal++)
{
pDomain = (CDomain*)MKOBJ(pDomains->GetItem(va));
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
if (pDomain)
{
if ((iDomain = m_domainList.AddString(pDomain->m_strName)) != CB_ERR)
{
m_domainList.SetItemDataPtr(iDomain, pDomain);
}
else
{
NtStatus = STATUS_NO_MEMORY;
}
pDomain->InternalRelease();
}
else
{
NtStatus = STATUS_NO_MEMORY;
}
}
}
else
{
NtStatus = STATUS_INVALID_PARAMETER;
}
if (NT_SUCCESS(NtStatus))
{
m_bIsDomainListExpanded = TRUE;
}
else
{
m_domainList.ResetContent();
LlsSetLastStatus(NtStatus);
}
return m_bIsDomainListExpanded;
}
void CAddUsersDialog::OnAdd()
/*++
Routine Description:
Message handler for IDC_ADD_USER_ADD.
Arguments:
None.
Return Values:
None.
--*/
{
CUser* pUser;
int iItem = -1;
while (pUser = (CUser*)::LvGetNextObj(&m_userList, &iItem))
{
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
LV_FINDINFO lvFindInfo;
lvFindInfo.flags = LVFI_STRING;
lvFindInfo.psz = MKSTR(pUser->m_strName);
if (m_addedList.FindItem(&lvFindInfo, -1) == -1)
{
//
// Make a copy of the user (w/no parent)
//
CUser* pNewUser = new CUser(NULL, pUser->m_strName);
if (pNewUser)
{
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT|
LVIF_PARAM|
LVIF_IMAGE;
lvItem.iSubItem = 0;
lvItem.lParam = (LPARAM)(LPVOID)pNewUser;
lvItem.iImage = BMPI_USER;
lvItem.pszText = MKSTR(pNewUser->m_strName);
lvItem.iItem = m_iIndex;
m_addedList.InsertItem(&lvItem);
m_iIndex++;
}
else
{
theApp.DisplayStatus( STATUS_NO_MEMORY );
break;
}
}
}
m_userList.SetFocus();
}
void CAddUsersDialog::OnDblclkAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
/*++
Routine Description:
Notification handler for NM_DLBCLK.
Arguments:
pNMHDR - notification header.
pResult - return code.
Return Values:
None.
--*/
{
OnDelete();
*pResult = 0;
}
void CAddUsersDialog::OnDblclkUsers(NMHDR* pNMHDR, LRESULT* pResult)
/*++
Routine Description:
Notification handler for NM_DLBCLK.
Arguments:
pNMHDR - notification header.
pResult - return code.
Return Values:
None.
--*/
{
OnAdd();
*pResult = 0;
}
void CAddUsersDialog::OnDelete()
/*++
Routine Description:
Message handler for IDC_ADD_USER_DELETE.
Arguments:
None.
Return Values:
None.
--*/
{
CUser* pUser;
int iItem = -1;
int iLastItem = 0;
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem))
{
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
pUser->InternalRelease(); // allocated above....
m_addedList.DeleteItem(iItem);
iLastItem = iItem;
iItem = -1;
m_iIndex--;
}
m_addedList.SetItemState(iLastItem, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
m_addedList.SetFocus();
}
void CAddUsersDialog::OnDropdownDomains()
/*++
Routine Description:
Notification handler for CBN_DROPDOWN.
Arguments:
None.
Return Values:
None.
--*/
{
if (m_bIsDomainListExpanded)
return;
NTSTATUS NtStatus = STATUS_SUCCESS;
CDomains* pDomains;
CDomain* pDomain;
int iDomain;
VARIANT va;
VariantInit(&va);
if (LlsGetApp()->IsFocusDomain())
{
pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetActiveDomain());
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
if (pDomain)
{
//
// Expand to include trusted domains
//
pDomains = (CDomains*)MKOBJ(pDomain->GetTrustedDomains(va));
if (pDomains && InsertDomains(pDomains))
{
//
// Now add active domain itself...
//
if ((iDomain = m_domainList.AddString(pDomain->m_strName)) != CB_ERR)
{
m_domainList.SetItemDataPtr(iDomain, pDomain);
}
else
{
NtStatus = STATUS_NO_MEMORY;
}
}
else
{
NtStatus = LlsGetLastStatus();
}
if (pDomains)
pDomains->InternalRelease();
pDomain->InternalRelease();
}
else
{
NtStatus = LlsGetLastStatus();
}
}
else
{
pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetLocalDomain());
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
if (pDomain)
{
//
// Expand to include all domains
//
pDomains = (CDomains*)MKOBJ(LlsGetApp()->GetDomains(va));
if (pDomains && InsertDomains(pDomains))
{
//
// CODEWORK... scroll to local domain???
//
}
else
{
NtStatus = LlsGetLastStatus();
}
if (pDomains)
pDomains->InternalRelease();
pDomain->InternalRelease();
}
else
{
NtStatus = LlsGetLastStatus();
}
}
if (!NT_SUCCESS(NtStatus))
{
theApp.DisplayStatus(NtStatus);
m_domainList.ResetContent();
}
}
BOOL CAddUsersDialog::OnInitDialog()
/*++
Routine Description:
Message handler for WM_INITDIALOG.
Arguments:
None.
Return Values:
None.
--*/
{
BeginWaitCursor();
CDialog::OnInitDialog();
InitUserList(); // always construct headers...
InitDomainList();
m_addBtn.EnableWindow(FALSE);
m_delBtn.EnableWindow(FALSE);
if (!RefreshUserList())
theApp.DisplayLastStatus();
m_domainList.SetFocus();
EndWaitCursor();
return FALSE; // set focus to domain list
}
void CAddUsersDialog::OnSelchangeDomains()
/*++
Routine Description:
Message handler for CBN_SELCHANGED.
Arguments:
None.
Return Values:
None.
--*/
{
RefreshUserList();
}
BOOL CAddUsersDialog::RefreshUserList()
/*++
Routine Description:
Refreshs list of users (with currently selected item).
Arguments:
None.
Return Values:
VT_BOOL.
--*/
{
NTSTATUS NtStatus = STATUS_SUCCESS;
m_userList.DeleteAllItems();
int iDomain;
if ((iDomain = m_domainList.GetCurSel()) != CB_ERR)
{
CDomain* pDomain = (CDomain*)m_domainList.GetItemDataPtr(iDomain);
CUsers* pUsers = (CUsers*)NULL;
VARIANT va;
VariantInit(&va);
if (pDomain == (CDomain*)-1L)
{
//
// Enumerate users in license cache...
//
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
if ( pController )
{
pController->InternalRelease(); // held open by CApplication
pUsers = pController->m_pUsers;
pUsers->InternalAddRef(); // released below...
}
}
else
{
//
// Enumerate users in particular domain...
//
ASSERT(pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
pUsers = (CUsers*)MKOBJ(pDomain->GetUsers(va));
ASSERT(pUsers && pUsers->IsKindOf(RUNTIME_CLASS(CUsers)));
}
if (pUsers)
{
CUser* pUser;
int nUsers = pUsers->GetCount();
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT|
LVIF_PARAM|
LVIF_IMAGE;
lvItem.iSubItem = 0;
lvItem.pszText = LPSTR_TEXTCALLBACK;
lvItem.cchTextMax = LPSTR_TEXTCALLBACK_MAX;
lvItem.iImage = BMPI_USER;
for (va.vt = VT_I4, va.lVal = 0; (va.lVal < nUsers) && NT_SUCCESS(NtStatus); va.lVal++)
{
pUser = (CUser*)MKOBJ(pUsers->GetItem(va));
ASSERT(pUser && pUser->IsKindOf(RUNTIME_CLASS(CUser)));
if (pUser)
{
lvItem.iItem = va.lVal;
lvItem.lParam = (LPARAM)(LPVOID)pUser;
if (m_userList.InsertItem(&lvItem) == -1)
{
NtStatus = STATUS_NO_MEMORY;
}
pUser->InternalRelease();
}
else
{
NtStatus = STATUS_NO_MEMORY;
}
}
pUsers->InternalRelease();
}
else
{
NtStatus = LlsGetLastStatus();
}
VariantClear(&va);
}
else
{
NtStatus = STATUS_NO_MEMORY;
}
if (!NT_SUCCESS(NtStatus))
{
m_userList.DeleteAllItems();
LlsSetLastStatus(NtStatus);
}
::LvResizeColumns(&m_userList, &g_userColumnInfo);
return NT_SUCCESS(NtStatus);
}
void CAddUsersDialog::OnOK()
/*++
Routine Description:
Message handler for IDOK.
Arguments:
None.
Return Values:
None.
--*/
{
if (m_pObList)
{
CUser* pUser;
int iItem = -1;
m_pObList->RemoveAll();
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem, LVNI_ALL))
{
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
m_pObList->AddTail(pUser);
}
}
CDialog::OnOK();
}
void CAddUsersDialog::OnCancel()
/*++
Routine Description:
Message handler for IDCANCEL.
Arguments:
None.
Return Values:
None.
--*/
{
CUser* pUser;
int iItem = -1;
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem, LVNI_ALL))
{
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
pUser->InternalRelease();
}
CDialog::OnCancel();
}
void CAddUsersDialog::InitDialogCtrls()
{
int iItem = -1;
if (m_bIsFocusUserList && m_userList.GetItemCount())
{
m_addBtn.EnableWindow(TRUE);
m_delBtn.EnableWindow(FALSE);
}
else if (m_bIsFocusAddedList && m_addedList.GetItemCount())
{
m_addBtn.EnableWindow(FALSE);
m_delBtn.EnableWindow(TRUE);
}
else
{
m_addBtn.EnableWindow(FALSE);
m_delBtn.EnableWindow(FALSE);
}
::LvResizeColumns(&m_userList, &g_userColumnInfo);
::LvResizeColumns(&m_addedList, &g_addedColumnInfo);
}
void CAddUsersDialog::OnGetdispinfoUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_ITEM lvItem = ((LV_DISPINFO*)pNMHDR)->item;
if (lvItem.iSubItem == 0)
{
CUser* pUser = (CUser*)lvItem.lParam;
ASSERT(pUser && pUser->IsKindOf(RUNTIME_CLASS(CUser)));
lstrcpyn(lvItem.pszText, pUser->m_strName, lvItem.cchTextMax);
}
*pResult = 0;
}
void CAddUsersDialog::OnKillfocusUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
}
void CAddUsersDialog::OnSetfocusUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
m_bIsFocusUserList = TRUE;
m_bIsFocusAddedList = FALSE;
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
*pResult = 0;
}
void CAddUsersDialog::OnKillfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
}
void CAddUsersDialog::OnSetfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
{
m_bIsFocusUserList = FALSE;
m_bIsFocusAddedList = TRUE;
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
*pResult = 0;
}
BOOL CAddUsersDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (wParam == ID_INIT_CTRLS)
{
InitDialogCtrls();
return TRUE; // processed...
}
return CDialog::OnCommand(wParam, lParam);
}