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

561 lines
9.1 KiB
C++

/*++
Copyright (c) 1994-95 Microsoft Corporation
Module Name:
nlicdlg.cpp
Abstract:
New license dialog implementation.
Author:
Don Ryan (donryan) 02-Feb-1995
Environment:
User Mode - Win32
Revision History:
--*/
#include "stdafx.h"
#include "llsmgr.h"
#include "nlicdlg.h"
#include "mainfrm.h"
#include "pseatdlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CNewLicenseDialog, CDialog)
//{{AFX_MSG_MAP(CNewLicenseDialog)
ON_NOTIFY(UDN_DELTAPOS, IDC_NEW_LICENSE_SPIN, OnDeltaPosSpin)
ON_EN_UPDATE(IDC_NEW_LICENSE_QUANTITY, OnUpdateQuantity)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CNewLicenseDialog::CNewLicenseDialog(CWnd* pParent /*=NULL*/)
: CDialog(CNewLicenseDialog::IDD, pParent)
/*++
Routine Description:
Constructor for dialog.
Arguments:
pParent - owner window.
Return Values:
None.
--*/
{
//{{AFX_DATA_INIT(CNewLicenseDialog)
m_strComment = _T("");
m_nLicenses = 0;
m_nLicensesMin = 0;
m_strProduct = _T("");
//}}AFX_DATA_INIT
m_pProduct = NULL;
m_bIsOnlyProduct = FALSE;
m_bAreCtrlsInitialized = FALSE;
m_fUpdateHint = UPDATE_INFO_NONE;
}
void CNewLicenseDialog::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(CNewLicenseDialog)
DDX_Control(pDX, IDC_NEW_LICENSE_COMMENT, m_comEdit);
DDX_Control(pDX, IDC_NEW_LICENSE_QUANTITY, m_licEdit);
DDX_Control(pDX, IDC_NEW_LICENSE_SPIN, m_spinCtrl);
DDX_Control(pDX, IDC_NEW_LICENSE_PRODUCT, m_productList);
DDX_Text(pDX, IDC_NEW_LICENSE_COMMENT, m_strComment);
DDX_Text(pDX, IDC_NEW_LICENSE_QUANTITY, m_nLicenses);
DDV_MinMaxLong(pDX, m_nLicenses, m_nLicensesMin, 999999);
DDX_CBString(pDX, IDC_NEW_LICENSE_PRODUCT, m_strProduct);
//}}AFX_DATA_MAP
}
void CNewLicenseDialog::InitCtrls()
/*++
Routine Description:
Initializes dialog controls.
Arguments:
None.
Return Values:
None.
--*/
{
m_licEdit.SetFocus();
m_licEdit.SetSel(0,-1);
m_licEdit.LimitText(6);
m_comEdit.LimitText(256);
m_spinCtrl.SetRange(0, UD_MAXVAL);
m_bAreCtrlsInitialized = TRUE;
}
void CNewLicenseDialog::InitDialog(CProduct* pProduct, BOOL bIsOnlyProduct)
/*++
Routine Description:
Initializes dialog.
Arguments:
pProduct - product object.
bIsSingleProduct - true if only this product listed.
Return Values:
None.
--*/
{
m_pProduct = pProduct;
m_bIsOnlyProduct = bIsOnlyProduct;
#ifdef SUPPORT_UNLISTED_PRODUCTS
m_iUnlisted = CB_ERR;
#endif
}
void CNewLicenseDialog::AbortDialogIfNecessary()
/*++
Routine Description:
Displays status and aborts if connection lost.
Arguments:
None.
Return Values:
None.
--*/
{
theApp.DisplayLastStatus();
if (IsConnectionDropped(LlsGetLastStatus()))
{
AbortDialog(); // bail...
}
}
void CNewLicenseDialog::AbortDialog()
/*++
Routine Description:
Aborts dialog.
Arguments:
None.
Return Values:
None.
--*/
{
m_fUpdateHint = UPDATE_INFO_ABORT;
EndDialog(IDABORT);
}
BOOL CNewLicenseDialog::OnInitDialog()
/*++
Routine Description:
Message handler for WM_INITDIALOG.
Arguments:
None.
Return Values:
Returns false if focus set manually.
--*/
{
CDialog::OnInitDialog();
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
return TRUE;
}
void CNewLicenseDialog::OnOK()
/*++
Routine Description:
Creates a new license for product.
Arguments:
None.
Return Values:
None.
--*/
{
if (!IsQuantityValid())
return;
if (m_strProduct.IsEmpty())
return;
#ifdef SUPPORT_UNLISTED_PRODUCTS
if (m_productList.GetCurSel() == m_iUnlisted)
{
//
// CODEWORK...
//
return;
}
#endif
CPerSeatLicensingDialog psLicDlg;
psLicDlg.m_strProduct = m_strProduct;
if (psLicDlg.DoModal() != IDOK)
return;
BeginWaitCursor(); // hourglass...
NTSTATUS NtStatus;
LLS_LICENSE_INFO_0 LicenseInfo0;
TCHAR szUserBuffer[256];
DWORD dwUserBuffer = sizeof(szUserBuffer);
if (::GetUserName(szUserBuffer, &dwUserBuffer))
{
LicenseInfo0.Product = MKSTR(m_strProduct);
LicenseInfo0.Quantity = m_nLicenses;
LicenseInfo0.Date = 0; // ignored...
LicenseInfo0.Admin = szUserBuffer;
LicenseInfo0.Comment = MKSTR(m_strComment);
NtStatus = ::LlsLicenseAdd(
LlsGetActiveHandle(),
0,
(LPBYTE)&LicenseInfo0
);
LlsSetLastStatus(NtStatus); // called api...
if (NT_SUCCESS(NtStatus))
{
m_fUpdateHint = UPDATE_LICENSE_ADDED;
EndDialog(IDOK);
}
else
{
AbortDialogIfNecessary(); // display error...
}
}
else
{
LlsSetLastStatus(::GetLastError());
AbortDialogIfNecessary(); // display error...
}
EndWaitCursor(); // hourglass...
}
BOOL CNewLicenseDialog::RefreshCtrls()
/*++
Routine Description:
Refreshs list of products available.
Arguments:
None.
Return Values:
Returns true if controls refreshed.
--*/
{
int iProductInCB = CB_ERR;
BeginWaitCursor(); // hourglass...
if (m_bIsOnlyProduct)
{
VALIDATE_OBJECT(m_pProduct, CProduct);
iProductInCB = m_productList.AddString(m_pProduct->m_strName);
}
else
{
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
pController->InternalRelease(); // held open by application...
VALIDATE_OBJECT(pController, CController);
VALIDATE_OBJECT(pController->m_pProducts, CProducts);
CObArray* pObArray = pController->m_pProducts->m_pObArray;
VALIDATE_OBJECT(pObArray, CObArray);
int iProduct = 0;
int nProducts = pObArray->GetSize();
CProduct* pProduct;
while (nProducts--)
{
pProduct = (CProduct*)pObArray->GetAt(iProduct++);
VALIDATE_OBJECT(pProduct, CProduct);
if (m_productList.AddString(pProduct->m_strName) == CB_ERR)
{
LlsSetLastStatus(STATUS_NO_MEMORY);
return FALSE; // bail...
}
}
if (m_pProduct)
{
VALIDATE_OBJECT(m_pProduct, CProduct);
iProductInCB = m_productList.FindStringExact(-1, m_pProduct->m_strName);
ASSERT(iProductInCB != CB_ERR);
}
#ifdef SUPPORT_UNLISTED_PRODUCTS
CString strUnlisted;
strUnlisted.LoadString(IDS_UNLISTED_PRODUCT);
m_iUnlisted = m_productList.AddString(strUnlisted);
#endif
}
m_productList.SetCurSel((iProductInCB == CB_ERR) ? 0 : iProductInCB);
EndWaitCursor(); // hourglass...
return TRUE;
}
BOOL CNewLicenseDialog::OnCommand(WPARAM wParam, LPARAM lParam)
/*++
Routine Description:
Message handler for WM_COMMAND.
Arguments:
wParam - message specific.
lParam - message specific.
Return Values:
Returns true if message processed.
--*/
{
if (wParam == ID_INIT_CTRLS)
{
if (!m_bAreCtrlsInitialized)
{
InitCtrls();
if (!RefreshCtrls())
{
AbortDialogIfNecessary(); // display error...
}
}
return TRUE; // processed...
}
return CDialog::OnCommand(wParam, lParam);
}
void CNewLicenseDialog::OnDeltaPosSpin(NMHDR* pNMHDR, LRESULT* pResult)
/*++
Routine Description:
Notification handler for UDN_DELTAPOS.
Arguments:
pNMHDR - notification header.
pResult - return code.
Return Values:
None.
--*/
{
UpdateData(TRUE); // get data
m_nLicenses += ((NM_UPDOWN*)pNMHDR)->iDelta;
if (m_nLicenses < 0)
{
m_nLicenses = 0;
::MessageBeep(MB_OK);
}
else if (m_nLicenses > 999999)
{
m_nLicenses = 999999;
::MessageBeep(MB_OK);
}
UpdateData(FALSE); // set data
*pResult = 1; // handle ourselves...
}
void CNewLicenseDialog::OnUpdateQuantity()
/*++
Routine Description:
Message handler for EN_UPDATE.
Arguments:
None.
Return Values:
None.
--*/
{
long nLicensesOld = m_nLicenses;
if (!IsQuantityValid())
{
m_nLicenses = nLicensesOld;
UpdateData(FALSE);
m_licEdit.SetFocus();
m_licEdit.SetSel(0,-1);
::MessageBeep(MB_OK);
}
}
BOOL CNewLicenseDialog::IsQuantityValid()
/*++
Routine Description:
Wrapper around UpdateData(TRUE).
Arguments:
None.
Return Values:
VT_BOOL.
--*/
{
BOOL bIsValid;
m_nLicensesMin = 1; // raise minimum...
bIsValid = UpdateData(TRUE);
m_nLicensesMin = 0; // reset minimum...
return bIsValid;
}