|
|
/*++
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_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_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.
--*/
{ NTSTATUS NtStatus = STATUS_SUCCESS; CDomains* pDomains = NULL; CDomain* pDomain = NULL; int iDomain = 0;
//First add the default domain
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 ); return; }
//If FocusDomain, add the trusted domains
if (LlsGetApp()->IsFocusDomain()) { pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetActiveDomain()); ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
if (pDomain) { VARIANT va; VariantInit(&va); 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(); } //If not FocusDomain, add all domains
else { pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetLocalDomain()); ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
if (pDomain) { VARIANT va; VariantInit(&va); 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(); } }
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_domainList.ResetContent(); LlsSetLastStatus(NtStatus); return FALSE; }
return TRUE; }
void CAddUsersDialog::OnAdd()
/*++
Routine Description:
Message handler for IDC_ADD_USER_ADD.
Arguments:
None.
Return Values:
None.
--*/
{ CUser* pUser; int iItem = -1;
while (NULL != (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.
--*/
{ UNREFERENCED_PARAMETER(pNMHDR);
OnDelete();
ASSERT(NULL != pResult); *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.
--*/
{ UNREFERENCED_PARAMETER(pNMHDR);
OnAdd();
ASSERT(NULL != pResult); *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 (NULL != (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(); }
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 (NULL != (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 (NULL != (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) { ASSERT(NULL != pNMHDR); 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); }
ASSERT(NULL != pResult); *pResult = 0; }
void CAddUsersDialog::OnKillfocusUsers(NMHDR* pNMHDR, LRESULT* pResult) { UNREFERENCED_PARAMETER(pNMHDR);
ASSERT(NULL != pResult); *pResult = 0; }
void CAddUsersDialog::OnSetfocusUsers(NMHDR* pNMHDR, LRESULT* pResult) { UNREFERENCED_PARAMETER(pNMHDR);
m_bIsFocusUserList = TRUE; m_bIsFocusAddedList = FALSE; PostMessage(WM_COMMAND, ID_INIT_CTRLS); ASSERT(NULL != pResult); *pResult = 0; }
void CAddUsersDialog::OnKillfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult) { UNREFERENCED_PARAMETER(pNMHDR);
ASSERT(NULL != pResult); *pResult = 0; }
void CAddUsersDialog::OnSetfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult) { UNREFERENCED_PARAMETER(pNMHDR);
m_bIsFocusUserList = FALSE; m_bIsFocusAddedList = TRUE; PostMessage(WM_COMMAND, ID_INIT_CTRLS); ASSERT(NULL != pResult); *pResult = 0; }
BOOL CAddUsersDialog::OnCommand(WPARAM wParam, LPARAM lParam) { if (wParam == ID_INIT_CTRLS) { InitDialogCtrls(); return TRUE; // processed...
}
return CDialog::OnCommand(wParam, lParam); }
|