493 lines
7.8 KiB
C++
493 lines
7.8 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1994-95 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
dlicdlg.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Delete license dialog implementation.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Don Ryan (donryan) 05-Mar-1995
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode - Win32
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "llsmgr.h"
|
||
|
#include "dlicdlg.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CDeleteLicenseDialog, CDialog)
|
||
|
//{{AFX_MSG_MAP(CDeleteLicenseDialog)
|
||
|
ON_NOTIFY(UDN_DELTAPOS, IDC_DEL_LICENSE_SPIN, OnDeltaPosSpin)
|
||
|
ON_EN_UPDATE(IDC_DEL_LICENSE_QUANTITY, OnUpdateQuantity)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
CDeleteLicenseDialog::CDeleteLicenseDialog(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CDeleteLicenseDialog::IDD, pParent)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Constructor for dialog.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pParent - owner window.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CDeleteLicenseDialog)
|
||
|
m_strComment = _T("");
|
||
|
m_nLicenses = 0;
|
||
|
m_nLicensesMin = 0;
|
||
|
m_strProduct = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_pProduct = NULL;
|
||
|
m_nTotalLicenses = 0;
|
||
|
m_bAreCtrlsInitialized = FALSE;
|
||
|
|
||
|
m_fUpdateHint = UPDATE_INFO_NONE;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::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(CDeleteLicenseDialog)
|
||
|
DDX_Control(pDX, IDC_DEL_LICENSE_COMMENT, m_cmtEdit);
|
||
|
DDX_Control(pDX, IDC_DEL_LICENSE_SPIN, m_spinCtrl);
|
||
|
DDX_Control(pDX, IDC_DEL_LICENSE_QUANTITY, m_licEdit);
|
||
|
DDX_Control(pDX, IDOK, m_okBtn);
|
||
|
DDX_Control(pDX, IDCANCEL, m_cancelBtn);
|
||
|
DDX_Text(pDX, IDC_DEL_LICENSE_COMMENT, m_strComment);
|
||
|
DDX_Text(pDX, IDC_DEL_LICENSE_QUANTITY, m_nLicenses);
|
||
|
DDV_MinMaxLong(pDX, m_nLicenses, m_nLicensesMin, m_nTotalLicenses);
|
||
|
DDX_Text(pDX, IDC_DEL_LICENSE_PRODUCT, m_strProduct);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::InitCtrls()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes dialog controls.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
m_strProduct = m_pProduct->m_strName;
|
||
|
UpdateData(FALSE); // upload...
|
||
|
|
||
|
m_spinCtrl.SetRange(0, UD_MAXVAL);
|
||
|
|
||
|
m_cmtEdit.LimitText(256);
|
||
|
|
||
|
m_licEdit.SetFocus();
|
||
|
m_licEdit.SetSel(0,-1);
|
||
|
m_licEdit.LimitText(6);
|
||
|
|
||
|
m_bAreCtrlsInitialized = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::InitDialog(CProduct* pProduct, int nTotalLicenses)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes dialog.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pProduct - product object.
|
||
|
nTotalLicenses - total licenses for product.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
ASSERT(nTotalLicenses > 0);
|
||
|
VALIDATE_OBJECT(pProduct, CProduct);
|
||
|
|
||
|
m_pProduct = pProduct;
|
||
|
m_nTotalLicenses = nTotalLicenses;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::AbortDialogIfNecessary()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Displays status and aborts if connection lost.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
theApp.DisplayLastStatus();
|
||
|
|
||
|
if (IsConnectionDropped(LlsGetLastStatus()))
|
||
|
{
|
||
|
AbortDialog(); // bail...
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::AbortDialog()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Aborts dialog.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
m_fUpdateHint = UPDATE_INFO_ABORT;
|
||
|
EndDialog(IDABORT);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CDeleteLicenseDialog::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 CDeleteLicenseDialog::OnOK()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Deletes a license for product.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
if (!IsQuantityValid())
|
||
|
return;
|
||
|
|
||
|
if (m_strProduct.IsEmpty())
|
||
|
return;
|
||
|
|
||
|
CString strConfirm;
|
||
|
CString strLicenses;
|
||
|
|
||
|
strLicenses.Format(_T("%d"), m_nLicenses);
|
||
|
AfxFormatString2(
|
||
|
strConfirm,
|
||
|
IDP_CONFIRM_DELETE_LICENSE,
|
||
|
strLicenses,
|
||
|
m_strProduct
|
||
|
);
|
||
|
|
||
|
if (AfxMessageBox(strConfirm, MB_YESNO) != IDYES)
|
||
|
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
|
||
|
);
|
||
|
|
||
|
if (NtStatus == STATUS_UNSUCCESSFUL)
|
||
|
{
|
||
|
//
|
||
|
// Some licenses for this product have already
|
||
|
// been deleted so we just pass back success so
|
||
|
// that we can return to the summary list...
|
||
|
//
|
||
|
|
||
|
NtStatus = STATUS_SUCCESS;
|
||
|
AfxMessageBox(IDP_ERROR_NO_LICENSES);
|
||
|
}
|
||
|
|
||
|
LlsSetLastStatus(NtStatus); // called api...
|
||
|
|
||
|
if (NT_SUCCESS(NtStatus))
|
||
|
{
|
||
|
m_fUpdateHint = UPDATE_LICENSE_DELETED;
|
||
|
EndDialog(IDOK);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
AbortDialogIfNecessary(); // display error...
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LlsSetLastStatus(::GetLastError());
|
||
|
AbortDialogIfNecessary(); // display error...
|
||
|
}
|
||
|
|
||
|
EndWaitCursor(); // hourglass...
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CDeleteLicenseDialog::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();
|
||
|
}
|
||
|
|
||
|
::SafeEnableWindow(
|
||
|
&m_okBtn,
|
||
|
&m_cancelBtn,
|
||
|
CDialog::GetFocus(),
|
||
|
(BOOL)(m_nTotalLicenses > 0)
|
||
|
);
|
||
|
|
||
|
return TRUE; // processed...
|
||
|
}
|
||
|
|
||
|
return CDialog::OnCommand(wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::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 > m_nTotalLicenses)
|
||
|
{
|
||
|
m_nLicenses = m_nTotalLicenses;
|
||
|
|
||
|
::MessageBeep(MB_OK);
|
||
|
}
|
||
|
|
||
|
UpdateData(FALSE); // set data
|
||
|
|
||
|
*pResult = 1; // handle ourselves...
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDeleteLicenseDialog::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 CDeleteLicenseDialog::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;
|
||
|
}
|