912 lines
18 KiB
C++
912 lines
18 KiB
C++
/*++
|
|
|
|
Copyright (c) 1994-95 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
prdppgl.cpp
|
|
|
|
Abstract:
|
|
|
|
Product property page (licences) implementation.
|
|
|
|
Author:
|
|
|
|
Don Ryan (donryan) 02-Feb-1995
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
Jeff Parham (jeffparh) 30-Jan-1996
|
|
o Ported to CCF API to add/remove licenses.
|
|
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 "prdppgl.h"
|
|
#include "mainfrm.h"
|
|
|
|
#define LVID_DATE 1
|
|
#define LVID_QUANTITY 2
|
|
#define LVID_ADMIN 3
|
|
#define LVID_COMMENT 4
|
|
|
|
#define LVCX_DATE 20
|
|
#define LVCX_QUANTITY 20
|
|
#define LVCX_ADMIN 30
|
|
#define LVCX_COMMENT -1
|
|
|
|
static LV_COLUMN_INFO g_licenseColumnInfo = {
|
|
|
|
0, 0, 5,
|
|
{{LVID_SEPARATOR, 0, 0, 0 },
|
|
{LVID_DATE, IDS_DATE, 0, LVCX_DATE },
|
|
{LVID_QUANTITY, IDS_QUANTITY, 0, LVCX_QUANTITY},
|
|
{LVID_ADMIN, IDS_ADMINISTRATOR, 0, LVCX_ADMIN },
|
|
{LVID_COMMENT, IDS_COMMENT, 0, LVCX_COMMENT }},
|
|
|
|
};
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNCREATE(CProductPropertyPageLicenses, CPropertyPage)
|
|
|
|
BEGIN_MESSAGE_MAP(CProductPropertyPageLicenses, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CProductPropertyPageLicenses)
|
|
ON_BN_CLICKED(IDC_PP_PRODUCT_LICENSES_NEW, OnNew)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_PP_PRODUCT_LICENSES_LICENSES, OnColumnClickLicenses)
|
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_PP_PRODUCT_LICENSES_LICENSES, OnGetDispInfoLicenses)
|
|
ON_BN_CLICKED(IDC_PP_PRODUCT_LICENSES_DELETE, OnDelete)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
CProductPropertyPageLicenses::CProductPropertyPageLicenses()
|
|
: CPropertyPage(CProductPropertyPageLicenses::IDD)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor for product property page (licenses).
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
//{{AFX_DATA_INIT(CProductPropertyPageLicenses)
|
|
m_nLicensesTotal = 0;
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_pProduct = NULL;
|
|
m_pUpdateHint = NULL;
|
|
m_bAreCtrlsInitialized = FALSE;
|
|
}
|
|
|
|
|
|
CProductPropertyPageLicenses::~CProductPropertyPageLicenses()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destructor for product property page (licenses).
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Nothing to do here...
|
|
//
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::DoDataExchange(CDataExchange* pDX)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by framework to exchange dialog data.
|
|
|
|
Arguments:
|
|
|
|
pDX - data exchange object.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CProductPropertyPageLicenses)
|
|
DDX_Control(pDX, IDC_PP_PRODUCT_LICENSES_NEW, m_newBtn);
|
|
DDX_Control(pDX, IDC_PP_PRODUCT_LICENSES_DELETE, m_delBtn);
|
|
DDX_Control(pDX, IDC_PP_PRODUCT_LICENSES_LICENSES, m_licenseList);
|
|
DDX_Text(pDX, IDC_PP_PRODUCT_LICENSES_TOTAL, m_nLicensesTotal);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::InitCtrls()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes property page controls.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
m_newBtn.SetFocus();
|
|
m_delBtn.EnableWindow(FALSE);
|
|
|
|
m_bAreCtrlsInitialized = TRUE;
|
|
|
|
::LvInitColumns(&m_licenseList, &g_licenseColumnInfo);
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::InitPage(CProduct* pProduct, DWORD* pUpdateHint)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes property page.
|
|
|
|
Arguments:
|
|
|
|
pProduct - product object.
|
|
pUpdateHint - update hint.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ASSERT(pUpdateHint);
|
|
VALIDATE_OBJECT(pProduct, CProduct);
|
|
|
|
m_pProduct = pProduct;
|
|
m_pUpdateHint = pUpdateHint;
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::AbortPageIfNecessary()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Displays status and aborts if connection lost.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
theApp.DisplayLastStatus();
|
|
|
|
if (IsConnectionDropped(LlsGetLastStatus()))
|
|
{
|
|
AbortPage(); // bail...
|
|
}
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::AbortPage()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Aborts property page.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
*m_pUpdateHint = UPDATE_INFO_ABORT;
|
|
GetParent()->PostMessage(WM_COMMAND, IDCANCEL);
|
|
}
|
|
|
|
|
|
BOOL CProductPropertyPageLicenses::OnInitDialog()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_INITDIALOG.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
|
|
Returns false if focus set to control manually.
|
|
|
|
--*/
|
|
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
SendMessage(WM_COMMAND, ID_INIT_CTRLS);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::OnNew()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Creates a new license for product.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
|
|
VALIDATE_OBJECT(pController, CController);
|
|
|
|
LPTSTR pszUniServerName = pController->GetName();
|
|
LPTSTR pszUniProductName = m_pProduct->GetName();
|
|
|
|
if ( ( NULL == pszUniServerName ) || ( NULL == pszUniProductName ) )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
LPSTR pszAscServerName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniServerName ) );
|
|
LPSTR pszAscProductName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniProductName ) );
|
|
*/
|
|
LPSTR pszAscServerName = NULL;
|
|
LPSTR pszAscProductName = NULL;
|
|
|
|
int cbSize = 0;
|
|
|
|
cbSize = WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniServerName ,
|
|
-1,
|
|
pszAscServerName ,
|
|
0 ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
if( cbSize != 0 )
|
|
{
|
|
pszAscServerName = ( LPSTR )LocalAlloc( LMEM_FIXED , cbSize + 1 );
|
|
}
|
|
|
|
if( pszAscServerName == NULL )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
|
|
return;
|
|
}
|
|
|
|
WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniServerName ,
|
|
-1,
|
|
pszAscServerName ,
|
|
cbSize ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
|
|
|
|
|
|
cbSize = 0;
|
|
|
|
cbSize = WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniProductName ,
|
|
-1,
|
|
pszAscProductName ,
|
|
0 ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
if( cbSize != 0 )
|
|
{
|
|
pszAscProductName = ( LPSTR )LocalAlloc( LMEM_FIXED , 1 + cbSize );
|
|
}
|
|
|
|
if( NULL == pszAscProductName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
|
|
return;
|
|
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
wsprintfA( pszAscServerName, "%ls", pszUniServerName );
|
|
wsprintfA( pszAscProductName, "%ls", pszUniProductName );
|
|
*/
|
|
WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniProductName ,
|
|
-1,
|
|
pszAscProductName ,
|
|
cbSize ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
DWORD dwError = CCFCertificateEnterUI( m_hWnd, pszAscServerName, pszAscProductName, "Microsoft", CCF_ENTER_FLAG_PER_SEAT_ONLY | CCF_ENTER_FLAG_SERVER_IS_ES, NULL );
|
|
DWORD fUpdateHint;
|
|
|
|
if ( ERROR_SUCCESS == dwError )
|
|
{
|
|
fUpdateHint = UPDATE_LICENSE_ADDED;
|
|
}
|
|
else
|
|
{
|
|
fUpdateHint = UPDATE_INFO_NONE;
|
|
}
|
|
|
|
*m_pUpdateHint |= fUpdateHint;
|
|
|
|
if (IsLicenseInfoUpdated(fUpdateHint) && !RefreshCtrls())
|
|
{
|
|
AbortPageIfNecessary(); // display error...
|
|
}
|
|
}
|
|
|
|
if ( NULL != pszAscServerName )
|
|
{
|
|
LocalFree( pszAscServerName );
|
|
}
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
LocalFree( pszAscProductName );
|
|
}
|
|
}
|
|
|
|
if ( NULL != pszUniServerName )
|
|
{
|
|
SysFreeString( pszUniServerName );
|
|
}
|
|
if ( NULL != pszUniProductName )
|
|
{
|
|
SysFreeString( pszUniProductName );
|
|
}
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::OnDelete()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Removes licenses from product.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
|
|
VALIDATE_OBJECT(pController, CController);
|
|
|
|
LPTSTR pszUniServerName = pController->GetName();
|
|
LPSTR pszAscServerName = NULL;
|
|
LPSTR pszAscProductName = NULL;
|
|
int cbSize;
|
|
|
|
|
|
if ( NULL == pszUniServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
// LPSTR pszAscServerName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniServerName ) );
|
|
|
|
cbSize = WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniServerName ,
|
|
-1,
|
|
pszAscServerName ,
|
|
0 ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
if( cbSize != 0 )
|
|
{
|
|
pszAscServerName = ( LPSTR )LocalAlloc( LMEM_FIXED , cbSize + 1 );
|
|
}
|
|
|
|
|
|
if ( NULL == pszAscServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
// wsprintfA( pszAscServerName, "%ls", pszUniServerName );
|
|
WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniServerName ,
|
|
-1,
|
|
pszAscServerName ,
|
|
cbSize ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
// LPSTR pszAscProductName = NULL;
|
|
LPTSTR pszUniProductName = m_pProduct->GetName();
|
|
|
|
if ( NULL != pszUniProductName )
|
|
{
|
|
// pszAscProductName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniProductName ) );
|
|
cbSize = 0;
|
|
|
|
cbSize = WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniProductName ,
|
|
-1,
|
|
pszAscProductName ,
|
|
0 ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
if( cbSize != 0 )
|
|
{
|
|
pszAscProductName = ( LPSTR )LocalAlloc( LMEM_FIXED , 1 + cbSize );
|
|
}
|
|
|
|
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
// wsprintfA( pszAscProductName, "%ls", pszUniProductName );
|
|
WideCharToMultiByte( CP_OEMCP ,
|
|
0 ,
|
|
pszUniProductName ,
|
|
-1,
|
|
pszAscProductName ,
|
|
cbSize ,
|
|
NULL ,
|
|
NULL );
|
|
|
|
}
|
|
|
|
SysFreeString( pszUniProductName );
|
|
}
|
|
|
|
CCFCertificateRemoveUI( m_hWnd, pszAscServerName, pszAscProductName, pszAscProductName ? "Microsoft" : NULL, NULL, NULL );
|
|
|
|
*m_pUpdateHint |= UPDATE_LICENSE_DELETED;
|
|
|
|
if ( !RefreshCtrls() )
|
|
{
|
|
AbortPageIfNecessary(); // display error...
|
|
}
|
|
|
|
LocalFree( pszAscServerName );
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
LocalFree( pszAscProductName );
|
|
}
|
|
}
|
|
|
|
SysFreeString( pszUniServerName );
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CProductPropertyPageLicenses::RefreshCtrls()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs property page controls.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if controls refreshed.
|
|
|
|
--*/
|
|
|
|
{
|
|
VALIDATE_OBJECT(m_pProduct, CProduct);
|
|
|
|
BOOL bIsRefreshed = FALSE;
|
|
|
|
VARIANT va;
|
|
VariantInit(&va);
|
|
|
|
m_nLicensesTotal = 0; // reset now...
|
|
|
|
BeginWaitCursor(); // hourglass...
|
|
|
|
CLicenses* pLicenses = (CLicenses*)MKOBJ(m_pProduct->GetLicenses(va));
|
|
|
|
if (pLicenses)
|
|
{
|
|
VALIDATE_OBJECT(pLicenses, CLicenses);
|
|
|
|
bIsRefreshed = ::LvRefreshObArray(
|
|
&m_licenseList,
|
|
&g_licenseColumnInfo,
|
|
pLicenses->m_pObArray
|
|
);
|
|
|
|
if (bIsRefreshed)
|
|
{
|
|
CObArray* pObArray;
|
|
CLicense* pLicense;
|
|
|
|
pObArray = pLicenses->m_pObArray;
|
|
INT_PTR nLicenses = pObArray->GetSize();
|
|
|
|
while (nLicenses--)
|
|
{
|
|
pLicense = (CLicense*)pObArray->GetAt(nLicenses);
|
|
VALIDATE_OBJECT(pLicense, CLicense);
|
|
|
|
m_nLicensesTotal += pLicense->GetQuantity();
|
|
}
|
|
}
|
|
|
|
pLicenses->InternalRelease(); // add ref'd individually...
|
|
}
|
|
|
|
if (!bIsRefreshed)
|
|
{
|
|
::LvReleaseObArray(&m_licenseList); // reset list now...
|
|
}
|
|
|
|
EndWaitCursor(); // hourglass...
|
|
|
|
UpdateData(FALSE); // update total...
|
|
|
|
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
|
|
|
|
return bIsRefreshed;
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::OnDestroy()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_DESTROY.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
::LvReleaseObArray(&m_licenseList); // release now...
|
|
CPropertyPage::OnDestroy();
|
|
}
|
|
|
|
|
|
BOOL CProductPropertyPageLicenses::OnSetActive()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Activates property page.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if focus accepted.
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL bIsActivated;
|
|
|
|
if (bIsActivated = CPropertyPage::OnSetActive())
|
|
{
|
|
if (IsLicenseInfoUpdated(*m_pUpdateHint) && !RefreshCtrls())
|
|
{
|
|
AbortPageIfNecessary(); // display error...
|
|
}
|
|
}
|
|
|
|
return bIsActivated;
|
|
}
|
|
|
|
|
|
BOOL CProductPropertyPageLicenses::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())
|
|
{
|
|
AbortPageIfNecessary(); // display error...
|
|
}
|
|
}
|
|
|
|
::SafeEnableWindow(
|
|
&m_delBtn,
|
|
&m_licenseList,
|
|
CDialog::GetFocus(),
|
|
(BOOL)(m_nLicensesTotal > 0)
|
|
);
|
|
|
|
return TRUE; // processed...
|
|
}
|
|
|
|
return CDialog::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::OnColumnClickLicenses(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_COLUMNCLICK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
g_licenseColumnInfo.bSortOrder = GetKeyState(VK_CONTROL) < 0;
|
|
g_licenseColumnInfo.nSortedItem = ((NM_LISTVIEW*)pNMHDR)->iSubItem;
|
|
|
|
m_licenseList.SortItems(CompareProductLicenses, 0); // use column info
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CProductPropertyPageLicenses::OnGetDispInfoLicenses(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_GETDISPINFO.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
LV_ITEM* plvItem = &((LV_DISPINFO*)pNMHDR)->item;
|
|
ASSERT(plvItem);
|
|
|
|
CLicense* pLicense = (CLicense*)plvItem->lParam;
|
|
VALIDATE_OBJECT(pLicense, CLicense);
|
|
|
|
switch (plvItem->iSubItem)
|
|
{
|
|
case LVID_SEPARATOR:
|
|
{
|
|
plvItem->iImage = 0;
|
|
CString strLabel = _T("");
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_DATE:
|
|
{
|
|
BSTR bstrDate = pLicense->GetDateString();
|
|
if( bstrDate != NULL)
|
|
{
|
|
lstrcpyn(plvItem->pszText, bstrDate, plvItem->cchTextMax);
|
|
SysFreeString(bstrDate);
|
|
|
|
}
|
|
else
|
|
{
|
|
lstrcpy(plvItem->pszText, L"");
|
|
}
|
|
}
|
|
break;
|
|
|
|
case LVID_QUANTITY:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pLicense->m_lQuantity);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_ADMIN:
|
|
lstrcpyn(plvItem->pszText, pLicense->m_strUser, plvItem->cchTextMax);
|
|
break;
|
|
|
|
case LVID_COMMENT:
|
|
lstrcpyn(plvItem->pszText, pLicense->m_strDescription, plvItem->cchTextMax);
|
|
break;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
int CALLBACK CompareProductLicenses(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVM_SORTITEMS.
|
|
|
|
Arguments:
|
|
|
|
lParam1 - object to sort.
|
|
lParam2 - object to sort.
|
|
lParamSort - sort criteria.
|
|
|
|
Return Values:
|
|
|
|
Same as lstrcmp.
|
|
|
|
--*/
|
|
|
|
{
|
|
#define pLicense1 ((CLicense*)lParam1)
|
|
#define pLicense2 ((CLicense*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pLicense1, CLicense);
|
|
VALIDATE_OBJECT(pLicense2, CLicense);
|
|
|
|
int iResult;
|
|
|
|
switch (g_licenseColumnInfo.nSortedItem)
|
|
{
|
|
case LVID_DATE:
|
|
iResult = pLicense1->m_lDate - pLicense2->m_lDate;
|
|
break;
|
|
|
|
case LVID_QUANTITY:
|
|
iResult = pLicense1->GetQuantity() - pLicense2->GetQuantity();
|
|
break;
|
|
|
|
case LVID_ADMIN:
|
|
iResult =pLicense1->m_strUser.CompareNoCase(pLicense2->m_strUser);
|
|
break;
|
|
|
|
case LVID_COMMENT:
|
|
iResult = pLicense1->m_strDescription.CompareNoCase(pLicense2->m_strDescription);
|
|
break;
|
|
|
|
default:
|
|
iResult = 0;
|
|
break;
|
|
}
|
|
|
|
return g_licenseColumnInfo.bSortOrder ? -iResult : iResult;
|
|
}
|
|
|
|
|