mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4013 lines
79 KiB
4013 lines
79 KiB
/*++
|
|
|
|
Copyright (c) 1994-95 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
llsview.cpp
|
|
|
|
Abstract:
|
|
|
|
View window implementation.
|
|
|
|
Author:
|
|
|
|
Don Ryan (donryan) 12-Feb-1995
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
Jeff Parham (jeffparh) 16-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).
|
|
o Added better error message in case where a server being expanded
|
|
in the server browser is not configured for the License Service.
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include "llsmgr.h"
|
|
#include "llsdoc.h"
|
|
#include "llsview.h"
|
|
#include "prdpsht.h"
|
|
#include "usrpsht.h"
|
|
#include "mappsht.h"
|
|
#include "srvpsht.h"
|
|
#include "sdomdlg.h"
|
|
#include "lmoddlg.h"
|
|
#include "lgrpdlg.h"
|
|
#include "nmapdlg.h"
|
|
|
|
static const TCHAR szRegKeyLlsmgr[] = REG_KEY_LLSMGR;
|
|
static const TCHAR szRegKeyLlsmgrMruList[] = REG_KEY_LLSMGR_MRU_LIST;
|
|
static const TCHAR szRegKeyLlsmgrFontFaceName[] = REG_KEY_LLSMGR_FONT_FACENAME;
|
|
static const TCHAR szRegKeyLlsmgrFontHeight[] = REG_KEY_LLSMGR_FONT_HEIGHT;
|
|
static const TCHAR szRegKeyLlsmgrFontWeight[] = REG_KEY_LLSMGR_FONT_WEIGHT;
|
|
static const TCHAR szRegKeyLlsmgrFontItalic[] = REG_KEY_LLSMGR_FONT_ITALIC;
|
|
static const TCHAR szRegKeyLlsmgrSaveSettings[] = REG_KEY_LLSMGR_SAVE_SETTINGS;
|
|
static const TCHAR szRegKeyLlsmgrFontCharset[] = REG_KEY_LLSMGR_FONT_CHARSET;
|
|
|
|
static LV_COLUMN_INFO g_licenseColumnInfo = {
|
|
|
|
0, 1, LVID_PURCHASE_HISTORY_TOTAL_COLUMNS,
|
|
|
|
{{LVID_SEPARATOR, 0, 0, 0 },
|
|
{LVID_PURCHASE_HISTORY_DATE, IDS_DATE, IDS_DATE_MENUOPT, LVCX_PURCHASE_HISTORY_DATE },
|
|
{LVID_PURCHASE_HISTORY_PRODUCT, IDS_PRODUCT, IDS_PRODUCT_MENUOPT, LVCX_PURCHASE_HISTORY_PRODUCT },
|
|
{LVID_PURCHASE_HISTORY_QUANTITY, IDS_QUANTITY, IDS_QUANTITY_MENUOPT, LVCX_PURCHASE_HISTORY_QUANTITY },
|
|
{LVID_PURCHASE_HISTORY_ADMINISTRATOR, IDS_ADMINISTRATOR, IDS_ADMINISTRATOR_MENUOPT, LVCX_PURCHASE_HISTORY_ADMINISTRATOR},
|
|
{LVID_PURCHASE_HISTORY_COMMENT, IDS_COMMENT, IDS_COMMENT_MENUOPT, LVCX_PURCHASE_HISTORY_COMMENT }},
|
|
|
|
};
|
|
|
|
static LV_COLUMN_INFO g_productColumnInfo = {
|
|
|
|
0, 0, LVID_PRODUCTS_VIEW_TOTAL_COLUMNS,
|
|
|
|
{{LVID_PRODUCTS_VIEW_NAME, IDS_PRODUCT, IDS_PRODUCT_MENUOPT, LVCX_PRODUCTS_VIEW_NAME },
|
|
{LVID_PRODUCTS_VIEW_PER_SEAT_PURCHASED, IDS_PER_SEAT_PURCHASED, IDS_PER_SEAT_PURCHASED_MENUOPT, LVCX_PRODUCTS_VIEW_PER_SEAT_PURCHASED },
|
|
{LVID_PRODUCTS_VIEW_PER_SEAT_CONSUMED, IDS_PER_SEAT_CONSUMED, IDS_PER_SEAT_CONSUMED_MENUOPT, LVCX_PRODUCTS_VIEW_PER_SEAT_CONSUMED },
|
|
{LVID_PRODUCTS_VIEW_PER_SERVER_PURCHASED, IDS_PER_SERVER_PURCHASED, IDS_PER_SERVER_PURCHASED_MENUOPT, LVCX_PRODUCTS_VIEW_PER_SERVER_PURCHASED},
|
|
{LVID_PRODUCTS_VIEW_PER_SERVER_REACHED, IDS_PER_SERVER_REACHED, IDS_PER_SERVER_REACHED_MENUOPT, LVCX_PRODUCTS_VIEW_PER_SERVER_REACHED }},
|
|
|
|
};
|
|
|
|
static LV_COLUMN_INFO g_userColumnInfo = {
|
|
|
|
0, 0, LVID_PER_SEAT_CLIENTS_TOTAL_COLUMNS,
|
|
|
|
{{LVID_PER_SEAT_CLIENTS_NAME, IDS_USER_NAME, IDS_USER_NAME_MENUOPT, LVCX_PER_SEAT_CLIENTS_NAME },
|
|
{LVID_PER_SEAT_CLIENTS_LICENSED_USAGE, IDS_LICENSED_USAGE, IDS_LICENSED_USAGE_MENUOPT, LVCX_PER_SEAT_CLIENTS_LICENSED_USAGE },
|
|
{LVID_PER_SEAT_CLIENTS_UNLICENSED_USAGE, IDS_UNLICENSED_USAGE, IDS_UNLICENSED_USAGE_MENUOPT, LVCX_PER_SEAT_CLIENTS_UNLICENSED_USAGE},
|
|
{LVID_PER_SEAT_CLIENTS_SERVER_PRODUCTS, IDS_PRODUCTS, IDS_PRODUCTS_MENUOPT, LVCX_PER_SEAT_CLIENTS_SERVER_PRODUCTS }},
|
|
|
|
};
|
|
|
|
static TC_TAB_INFO g_tcTabInfo = {
|
|
|
|
TCID_TOTAL_TABS,
|
|
{{TCID_PURCHASE_HISTORY, IDS_PURCHASE_HISTORY, TCE_LISTVIEW|TCE_FORMAT_REPORT|TCE_SUPPORTS_SORT, NULL, &g_licenseColumnInfo},
|
|
{TCID_PRODUCTS_VIEW, IDS_PRODUCTS_VIEW, TCE_LISTVIEW|TCE_FORMAT_REPORT|TCE_SUPPORTS_ALL, NULL, &g_productColumnInfo},
|
|
{TCID_PER_SEAT_CLIENTS, IDS_PER_SEAT_CLIENTS, TCE_LISTVIEW|TCE_FORMAT_REPORT|TCE_SUPPORTS_ALL, NULL, &g_userColumnInfo },
|
|
{TCID_SERVER_BROWSER, IDS_SERVER_BROWSER, TCE_TREEVIEW|TCE_SUPPORTS_EDIT, NULL, NULL }},
|
|
|
|
};
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNCREATE(CLlsmgrView, CView)
|
|
|
|
BEGIN_MESSAGE_MAP(CLlsmgrView, CView)
|
|
//{{AFX_MSG_MAP(CLlsmgrView)
|
|
ON_WM_SIZE()
|
|
ON_COMMAND(ID_SELECT_FONT, OnSelectFont)
|
|
ON_COMMAND(ID_VIEW_LICENSES, OnViewLicenses)
|
|
ON_COMMAND(ID_VIEW_MAPPINGS, OnViewMappings)
|
|
ON_COMMAND(ID_VIEW_PRODUCTS, OnViewProducts)
|
|
ON_COMMAND(ID_VIEW_SERVERS, OnViewServers)
|
|
ON_COMMAND(ID_VIEW_USERS, OnViewUsers)
|
|
ON_COMMAND(ID_VIEW_DELETE, OnDelete)
|
|
ON_COMMAND(ID_VIEW_ICONS, OnFormatIcons)
|
|
ON_COMMAND(MY_ID_VIEW_LIST, OnFormatList)
|
|
ON_COMMAND(ID_VIEW_PROPERTIES, OnViewProperties)
|
|
ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh)
|
|
ON_COMMAND(ID_VIEW_REPORT, OnFormatReport)
|
|
ON_COMMAND(ID_VIEW_SMALL_ICONS, OnFormatSmallIcons)
|
|
ON_WM_CREATE()
|
|
ON_COMMAND(ID_SORT_COLUMN0, OnSortColumn0)
|
|
ON_COMMAND(ID_SORT_COLUMN1, OnSortColumn1)
|
|
ON_COMMAND(ID_SORT_COLUMN2, OnSortColumn2)
|
|
ON_COMMAND(ID_SORT_COLUMN3, OnSortColumn3)
|
|
ON_COMMAND(ID_SORT_COLUMN4, OnSortColumn4)
|
|
ON_COMMAND(ID_SORT_COLUMN5, OnSortColumn5)
|
|
ON_COMMAND(ID_NEW_LICENSE, OnNewLicense)
|
|
ON_COMMAND(ID_NEW_MAPPING, OnNewMapping)
|
|
ON_COMMAND(ID_SELECT_DOMAIN, OnSelectDomain)
|
|
ON_COMMAND(ID_SAVE_SETTINGS, OnSaveSettings)
|
|
ON_UPDATE_COMMAND_UI(ID_SAVE_SETTINGS, OnUpdateSaveSettings)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_DELETE, OnUpdateViewDelete)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_PROPERTIES, OnUpdateViewProperties)
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_NOTIFY(TCN_SELCHANGING, IDC_VIEW_TAB_CTRL, OnSelChangingTabCtrl)
|
|
ON_NOTIFY(TCN_SELCHANGE, IDC_VIEW_TAB_CTRL, OnSelChangeTabCtrl)
|
|
ON_NOTIFY(TCN_KEYDOWN, IDC_VIEW_TAB_CTRL, OnKeyDownTabCtrl)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VIEW_TAB_CTRL, OnSetFocusTabCtrl)
|
|
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_VIEW_LICENSE_LIST, OnKeyDownLicenseList)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_VIEW_LICENSE_LIST, OnColumnClickLicenseList)
|
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_VIEW_LICENSE_LIST, OnGetDispInfoLicenseList)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VIEW_LICENSE_LIST, OnSetFocusLicenseList)
|
|
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_VIEW_PRODUCT_LIST, OnKeyDownProductList)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_VIEW_PRODUCT_LIST, OnDblClkProductList)
|
|
ON_NOTIFY(NM_RETURN, IDC_VIEW_PRODUCT_LIST, OnReturnProductList)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_VIEW_PRODUCT_LIST, OnColumnClickProductList)
|
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_VIEW_PRODUCT_LIST, OnGetDispInfoProductList)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VIEW_PRODUCT_LIST, OnSetFocusProductList)
|
|
|
|
ON_NOTIFY(LVN_KEYDOWN, IDC_VIEW_USER_LIST, OnKeyDownUserList)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_VIEW_USER_LIST, OnDblClkUserList)
|
|
ON_NOTIFY(NM_RETURN, IDC_VIEW_USER_LIST, OnReturnUserList)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_VIEW_USER_LIST, OnColumnClickUserList)
|
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_VIEW_USER_LIST, OnGetDispInfoUserList)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VIEW_USER_LIST, OnSetFocusUserList)
|
|
|
|
ON_NOTIFY(TVN_KEYDOWN, IDC_VIEW_SERVER_TREE, OnKeyDownServerTree)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_VIEW_SERVER_TREE, OnDblClkServerTree)
|
|
ON_NOTIFY(NM_RETURN, IDC_VIEW_SERVER_TREE, OnReturnServerTree)
|
|
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_VIEW_SERVER_TREE, OnItemExpandingServerTree)
|
|
ON_NOTIFY(TVN_GETDISPINFO, IDC_VIEW_SERVER_TREE, OnGetDispInfoServerTree)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VIEW_SERVER_TREE, OnSetFocusServerTree)
|
|
|
|
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
|
|
|
|
ON_COMMAND_EX_RANGE(ID_MRU_DOMAIN0, ID_MRU_DOMAIN15, OnSelMruDomain)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
CLlsmgrView::CLlsmgrView()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor for view window.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
m_pTabEntry = g_tcTabInfo.tcTabEntry;
|
|
m_bOrder = FALSE;
|
|
LoadSettings();
|
|
}
|
|
|
|
|
|
CLlsmgrView::~CLlsmgrView()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destructor for view window.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
SaveSettings();
|
|
}
|
|
|
|
|
|
void CLlsmgrView::AddToMRU(LPCTSTR lpszDomainName)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adds domain to mru list.
|
|
|
|
Arguments:
|
|
|
|
lpszDomainName - domain of focus.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (lpszDomainName && *lpszDomainName)
|
|
{
|
|
POSITION curPos;
|
|
POSITION nextPos;
|
|
|
|
nextPos = m_mruDomainList.GetHeadPosition();
|
|
|
|
while (curPos = nextPos)
|
|
{
|
|
CString strDomain = m_mruDomainList.GetNext(nextPos);
|
|
|
|
if (!strDomain.CompareNoCase(lpszDomainName))
|
|
m_mruDomainList.RemoveAt(curPos);
|
|
}
|
|
|
|
m_mruDomainList.AddHead(lpszDomainName);
|
|
|
|
if (m_mruDomainList.GetCount() > MAX_MRU_ENTRIES)
|
|
m_mruDomainList.RemoveTail();
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
void CLlsmgrView::AssertValid() const
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validates object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CView::AssertValid();
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
void CLlsmgrView::Dump(CDumpContext& dc) const
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps contents of object.
|
|
|
|
Arguments:
|
|
|
|
dc - dump context.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CView::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
|
|
void CLlsmgrView::EnableCurSelTab(BOOL bEnable)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enables or disables currently selected control.
|
|
|
|
Arguments:
|
|
|
|
bEnable - enable control if true.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (bEnable)
|
|
{
|
|
m_pTabEntry = g_tcTabInfo.tcTabEntry + m_tabCtrl.GetCurSel();
|
|
|
|
m_pTabEntry->pWnd->EnableWindow(TRUE);
|
|
m_pTabEntry->pWnd->ShowWindow(SW_SHOW);
|
|
m_pTabEntry->pWnd->UpdateWindow();
|
|
|
|
if (!IsTabUpdated(m_pTabEntry))
|
|
{
|
|
DWORD fUpdateHint = UPDATE_INFO_NONE;
|
|
|
|
switch (m_pTabEntry->iItem)
|
|
{
|
|
case TCID_PURCHASE_HISTORY:
|
|
fUpdateHint = UPDATE_INFO_LICENSES;
|
|
break;
|
|
|
|
case TCID_PRODUCTS_VIEW:
|
|
fUpdateHint = UPDATE_INFO_PRODUCTS;
|
|
break;
|
|
|
|
case TCID_PER_SEAT_CLIENTS:
|
|
fUpdateHint = UPDATE_INFO_USERS;
|
|
break;
|
|
|
|
case TCID_SERVER_BROWSER:
|
|
fUpdateHint = UPDATE_INFO_SERVERS;
|
|
break;
|
|
}
|
|
|
|
OnUpdate(this, fUpdateHint, NULL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pTabEntry->pWnd->EnableWindow(FALSE);
|
|
m_pTabEntry->pWnd->ShowWindow(SW_HIDE);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
CLlsmgrDoc* CLlsmgrView::GetDocument()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns document object associated with view.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns object pointer or NULL.
|
|
|
|
--*/
|
|
|
|
{
|
|
VALIDATE_OBJECT(m_pDocument, CLlsmgrDoc);
|
|
return (CLlsmgrDoc*)m_pDocument;
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
|
|
void CLlsmgrView::InitLicenseList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes license list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRect emptyRect;
|
|
emptyRect.SetRectEmpty();
|
|
|
|
m_licenseList.Create(
|
|
WS_CHILD|
|
|
WS_BORDER|
|
|
WS_VISIBLE|
|
|
WS_CLIPSIBLINGS|
|
|
LVS_REPORT|
|
|
LVS_SINGLESEL|
|
|
LVS_SHOWSELALWAYS|
|
|
LVS_SHAREIMAGELISTS|
|
|
LVS_AUTOARRANGE,
|
|
emptyRect,
|
|
&m_tabCtrl,
|
|
IDC_VIEW_LICENSE_LIST
|
|
);
|
|
|
|
::LvInitColumns(&m_licenseList, &g_licenseColumnInfo);
|
|
g_tcTabInfo.tcTabEntry[TCID_PURCHASE_HISTORY].pWnd = &m_licenseList;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::InitProductList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes product list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRect emptyRect;
|
|
emptyRect.SetRectEmpty();
|
|
|
|
m_productList.Create(
|
|
WS_CHILD|
|
|
WS_BORDER|
|
|
WS_DISABLED|
|
|
WS_CLIPSIBLINGS|
|
|
LVS_REPORT|
|
|
LVS_SINGLESEL|
|
|
LVS_SHOWSELALWAYS|
|
|
LVS_SHAREIMAGELISTS|
|
|
LVS_AUTOARRANGE,
|
|
emptyRect,
|
|
&m_tabCtrl,
|
|
IDC_VIEW_PRODUCT_LIST
|
|
);
|
|
|
|
::LvInitColumns(&m_productList, &g_productColumnInfo);
|
|
g_tcTabInfo.tcTabEntry[TCID_PRODUCTS_VIEW].pWnd = &m_productList;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::InitServerTree()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes tree ctrl.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRect emptyRect;
|
|
emptyRect.SetRectEmpty();
|
|
|
|
m_serverTree.Create(
|
|
WS_CHILD|
|
|
WS_BORDER|
|
|
WS_DISABLED|
|
|
WS_CLIPSIBLINGS|
|
|
TVS_LINESATROOT|
|
|
TVS_HASBUTTONS|
|
|
TVS_HASLINES|
|
|
TVS_DISABLEDRAGDROP|
|
|
TVS_SHOWSELALWAYS,
|
|
emptyRect,
|
|
&m_tabCtrl,
|
|
IDC_VIEW_SERVER_TREE
|
|
);
|
|
|
|
m_serverTree.SetImageList(&theApp.m_smallImages, TVSIL_NORMAL);
|
|
::SetDefaultFont(&m_serverTree);
|
|
|
|
g_tcTabInfo.tcTabEntry[TCID_SERVER_BROWSER].pWnd = &m_serverTree;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::InitTabCtrl()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes tab control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRect emptyRect;
|
|
emptyRect.SetRectEmpty();
|
|
|
|
m_tabCtrl.Create(
|
|
WS_CHILD|
|
|
WS_VISIBLE|
|
|
WS_CLIPCHILDREN|
|
|
TCS_SINGLELINE|
|
|
TCS_FOCUSONBUTTONDOWN|
|
|
TCS_TABS,
|
|
emptyRect,
|
|
this,
|
|
IDC_VIEW_TAB_CTRL
|
|
);
|
|
|
|
::TcInitTabs(&m_tabCtrl, &g_tcTabInfo);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::InitUserList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes user list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRect emptyRect;
|
|
emptyRect.SetRectEmpty();
|
|
|
|
m_userList.Create(
|
|
WS_CHILD|
|
|
WS_BORDER|
|
|
WS_DISABLED|
|
|
LVS_REPORT|
|
|
LVS_SINGLESEL|
|
|
LVS_SHOWSELALWAYS|
|
|
LVS_SHAREIMAGELISTS|
|
|
LVS_AUTOARRANGE,
|
|
emptyRect,
|
|
&m_tabCtrl,
|
|
IDC_VIEW_USER_LIST
|
|
);
|
|
|
|
::LvInitColumns(&m_userList, &g_userColumnInfo);
|
|
g_tcTabInfo.tcTabEntry[TCID_PER_SEAT_CLIENTS].pWnd = &m_userList;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by framework when view is activated.
|
|
|
|
Arguments:
|
|
|
|
bActivate - activated or deactivated.
|
|
pActivateView - view being activated.
|
|
pDeactiveView - view being deactivated.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (bActivate && (pActivateView == this))
|
|
{
|
|
if (IsTabInFocus(m_pTabEntry))
|
|
{
|
|
m_tabCtrl.SetFocus();
|
|
}
|
|
else
|
|
{
|
|
m_pTabEntry->pWnd->SetFocus();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnColumnClickLicenseList(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.bSortOrder = !g_licenseColumnInfo.bSortOrder;
|
|
|
|
g_licenseColumnInfo.nSortedItem = ((NM_LISTVIEW*)pNMHDR)->iSubItem;
|
|
|
|
m_licenseList.SortItems(CompareLicenses, 0); // use column info
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDestroy()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_DESTROY.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ResetLicenseList();
|
|
ResetProductList();
|
|
ResetUserList();
|
|
ResetServerTree();
|
|
|
|
m_userList.DestroyWindow();
|
|
m_serverTree.DestroyWindow();
|
|
m_productList.DestroyWindow();
|
|
m_licenseList.DestroyWindow();
|
|
m_tabCtrl.DestroyWindow();
|
|
|
|
CView::OnDestroy();
|
|
}
|
|
|
|
|
|
void CLlsmgrView::LoadSettings()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Load settings from registry.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
long Status;
|
|
HKEY hKeyLlsmgr;
|
|
|
|
m_bSaveSettings = TRUE;
|
|
m_mruDomainList.RemoveAll();
|
|
|
|
memset(&m_lFont, 0, sizeof(LOGFONT));
|
|
|
|
m_lFont.lfHeight = FONT_HEIGHT_DEFAULT;
|
|
m_lFont.lfWeight = FONT_WEIGHT_DEFAULT;
|
|
CHARSETINFO csi;
|
|
DWORD dw = ::GetACP();
|
|
|
|
if (!::TranslateCharsetInfo((DWORD*)UIntToPtr(dw), &csi, TCI_SRCCODEPAGE))
|
|
csi.ciCharset = ANSI_CHARSET;
|
|
m_lFont.lfCharSet = (BYTE)csi.ciCharset; // default charset
|
|
|
|
::lstrcpy(m_lFont.lfFaceName, TEXT("MS Shell Dlg")); // default facename
|
|
|
|
Status = RegOpenKeyEx(HKEY_CURRENT_USER, szRegKeyLlsmgr, 0, KEY_READ, &hKeyLlsmgr);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
DWORD dwType;
|
|
DWORD dwSize;
|
|
|
|
DWORD dwValue;
|
|
TCHAR szValue[512];
|
|
|
|
//
|
|
// Load save settings on exit
|
|
//
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof(DWORD);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrSaveSettings, 0, &dwType, (LPBYTE)&dwValue, &dwSize))
|
|
m_bSaveSettings = (BOOL)dwValue;
|
|
|
|
//
|
|
// Load font information
|
|
//
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof(DWORD);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontHeight, 0, &dwType, (LPBYTE)&dwValue, &dwSize))
|
|
m_lFont.lfHeight = ((LONG)dwValue > 0) ? -((LONG)dwValue) : 0;
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof(DWORD);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontWeight, 0, &dwType, (LPBYTE)&dwValue, &dwSize))
|
|
m_lFont.lfWeight = ((LONG)dwValue > 0) ? ((LONG)dwValue) : 0;
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof(DWORD);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontItalic, 0, &dwType, (LPBYTE)&dwValue, &dwSize))
|
|
m_lFont.lfItalic = (BOOL)dwValue;
|
|
|
|
dwType = REG_SZ;
|
|
dwSize = sizeof(szValue);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontFaceName, 0, &dwType, (LPBYTE)szValue, &dwSize))
|
|
lstrcpyn(m_lFont.lfFaceName, szValue, 32);
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof(DWORD);
|
|
|
|
if (!::RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontCharset, 0, &dwType, (LPBYTE)&dwValue, &dwSize))
|
|
m_lFont.lfCharSet = (BYTE)dwValue;
|
|
|
|
//
|
|
// MRU domain list
|
|
//
|
|
|
|
dwType = REG_MULTI_SZ;
|
|
dwSize = sizeof(szValue);
|
|
|
|
if (!RegQueryValueEx(hKeyLlsmgr, szRegKeyLlsmgrMruList, 0, &dwType, (LPBYTE)szValue, &dwSize))
|
|
{
|
|
LPTSTR psz = szValue;
|
|
|
|
while (*psz)
|
|
{
|
|
AddToMRU(psz);
|
|
psz += lstrlen(psz) + 1;
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hKeyLlsmgr);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnColumnClickProductList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_COLUMNCLICK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
// g_productColumnInfo.bSortOrder = GetKeyState(VK_CONTROL) < 0;
|
|
g_productColumnInfo.bSortOrder = !g_productColumnInfo.bSortOrder;
|
|
g_productColumnInfo.nSortedItem = ((NM_LISTVIEW*)pNMHDR)->iSubItem;
|
|
m_productList.SortItems(CompareProducts, 0); // use column info
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnColumnClickUserList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_COLUMNCLICK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
// g_userColumnInfo.bSortOrder = GetKeyState(VK_CONTROL) < 0;
|
|
g_userColumnInfo.bSortOrder = !g_userColumnInfo.bSortOrder;
|
|
g_userColumnInfo.nSortedItem = ((NM_LISTVIEW*)pNMHDR)->iSubItem;
|
|
m_userList.SortItems(CompareUsers, 0); // use column info
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
LRESULT CLlsmgrView::OnContextMenu(WPARAM wParam, LPARAM lParam)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_CONTEXTMENU.
|
|
|
|
Arguments:
|
|
|
|
wParam - control window handle.
|
|
lParam - screen coordinates of mouse.
|
|
|
|
Return Values:
|
|
|
|
Returns 0 if successful.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsEditSupported(m_pTabEntry))
|
|
{
|
|
POINT pt;
|
|
POINTS pts = MAKEPOINTS(lParam);
|
|
|
|
pt.x = (long)(short)pts.x;
|
|
pt.y = (long)(short)pts.y;
|
|
|
|
CRect wndRect;
|
|
m_pTabEntry->pWnd->GetWindowRect(wndRect);
|
|
|
|
if (wndRect.PtInRect(pt) && IsItemSelected(m_pTabEntry))
|
|
{
|
|
CMenu optionMenu;
|
|
optionMenu.LoadMenu(IDM_POPUP);
|
|
|
|
CMenu* pPopupMenu = optionMenu.GetSubMenu(m_pTabEntry->iItem);
|
|
|
|
if (pPopupMenu)
|
|
{
|
|
pPopupMenu->TrackPopupMenu(
|
|
TPM_LEFTALIGN|
|
|
TPM_RIGHTBUTTON,
|
|
pt.x,
|
|
pt.y,
|
|
GetParentFrame(),
|
|
NULL
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::PreCreateWindow(CREATESTRUCT& cs)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by framework before window created.
|
|
|
|
Arguments:
|
|
|
|
cs - window creation information.
|
|
|
|
Return Values:
|
|
|
|
Returns 0 if successful.
|
|
|
|
--*/
|
|
|
|
{
|
|
cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
|
|
return CView::PreCreateWindow(cs);
|
|
}
|
|
|
|
|
|
int CLlsmgrView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_CREATE.
|
|
|
|
Arguments:
|
|
|
|
lpCreateStruct - window creation information.
|
|
|
|
Return Values:
|
|
|
|
Returns 0 if successful.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (CView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
InitTabCtrl();
|
|
InitLicenseList();
|
|
InitProductList();
|
|
InitUserList();
|
|
InitServerTree();
|
|
|
|
CFont* pFont;
|
|
|
|
if (pFont = CFont::FromHandle(::CreateFontIndirect(&m_lFont)))
|
|
{
|
|
m_tabCtrl.SetFont(pFont);
|
|
m_licenseList.SetFont(pFont);
|
|
m_productList.SetFont(pFont);
|
|
m_userList.SetFont(pFont);
|
|
m_serverTree.SetFont(pFont);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDblClkProductList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_DBLCLK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ViewProductProperties();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDblClkServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_DBLCLK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CService* pService;
|
|
|
|
if (pService = (CService*)::TvGetSelObj(&m_serverTree))
|
|
{
|
|
ASSERT_VALID(pService);
|
|
|
|
if (pService->IsKindOf(RUNTIME_CLASS(CService)))
|
|
{
|
|
ViewServerProperties(); // only support dblclk services
|
|
}
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDblClkUserList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_DBLCLK.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ViewUserProperties();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDelete()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_DELETE.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (m_pTabEntry->iItem == TCID_PER_SEAT_CLIENTS)
|
|
{
|
|
CUser* pUser;
|
|
CString strConfirm;
|
|
|
|
if (pUser = (CUser*)::LvGetSelObj(&m_userList))
|
|
{
|
|
AfxFormatString1(strConfirm, IDP_CONFIRM_DELETE_USER, pUser->m_strName);
|
|
|
|
if (AfxMessageBox(strConfirm, MB_YESNO) == IDYES)
|
|
{
|
|
NTSTATUS NtStatus;
|
|
|
|
NtStatus = ::LlsUserDelete(
|
|
LlsGetActiveHandle(),
|
|
MKSTR(pUser->m_strName)
|
|
);
|
|
|
|
if (NtStatus == STATUS_OBJECT_NAME_NOT_FOUND)
|
|
NtStatus = STATUS_SUCCESS;
|
|
|
|
if (NT_SUCCESS(NtStatus))
|
|
{
|
|
OnUpdate(this, UPDATE_LICENSE_DELETED, NULL);
|
|
}
|
|
else
|
|
{
|
|
theApp.DisplayStatus(NtStatus);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (m_pTabEntry->iItem == TCID_PRODUCTS_VIEW)
|
|
{
|
|
CProduct* pProduct;
|
|
|
|
if (pProduct = (CProduct*)::LvGetSelObj(&m_productList))
|
|
{
|
|
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
|
|
VALIDATE_OBJECT(pController, CController);
|
|
|
|
LPTSTR pszUniServerName = pController->GetName();
|
|
|
|
if ( NULL == pszUniServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
LPSTR pszAscServerName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniServerName ) );
|
|
|
|
if ( NULL == pszAscServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
wsprintfA( pszAscServerName, "%ls", pszUniServerName );
|
|
|
|
LPSTR pszAscProductName = NULL;
|
|
LPTSTR pszUniProductName = pProduct->GetName();
|
|
|
|
if ( NULL != pszUniProductName )
|
|
{
|
|
pszAscProductName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniProductName ) );
|
|
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
wsprintfA( pszAscProductName, "%ls", pszUniProductName );
|
|
}
|
|
|
|
SysFreeString( pszUniProductName );
|
|
}
|
|
|
|
CCFCertificateRemoveUI( m_hWnd, pszAscServerName, pszAscProductName, pszAscProductName ? "Microsoft" : NULL, NULL, NULL );
|
|
|
|
OnUpdate(this, UPDATE_LICENSE_DELETED, NULL);
|
|
|
|
LocalFree( pszAscServerName );
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
LocalFree( pszAscProductName );
|
|
}
|
|
}
|
|
|
|
SysFreeString( pszUniServerName );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnDraw(CDC* pDC)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_DRAW.
|
|
|
|
Arguments:
|
|
|
|
pDC - device context.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Nothing to do here...
|
|
//
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::OnEraseBkgnd(CDC* pDC)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_ERASEBKGND.
|
|
|
|
Arguments:
|
|
|
|
pDC - device context.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CBrush grayBrush(RGB(192,192,192));
|
|
CBrush* pOldBrush = pDC->SelectObject(&grayBrush);
|
|
|
|
CRect clientRect;
|
|
GetClientRect(clientRect);
|
|
|
|
pDC->FillRect(clientRect, &grayBrush);
|
|
|
|
pDC->SelectObject(pOldBrush);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnFormatIcons()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_ICONS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsFormatSupported(m_pTabEntry) && !IsFormatLargeIcons(m_pTabEntry))
|
|
{
|
|
VALIDATE_OBJECT(m_pTabEntry->pWnd, CWnd);
|
|
|
|
::LvChangeFormat((CListCtrl*)m_pTabEntry->pWnd, LVS_ICON);
|
|
SetFormatLargeIcons(m_pTabEntry);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnFormatList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for MY_ID_VIEW_LIST.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsFormatSupported(m_pTabEntry) && !IsFormatList(m_pTabEntry))
|
|
{
|
|
VALIDATE_OBJECT(m_pTabEntry->pWnd, CWnd);
|
|
|
|
::LvChangeFormat((CListCtrl*)m_pTabEntry->pWnd, LVS_LIST);
|
|
SetFormatList(m_pTabEntry);
|
|
}
|
|
}
|
|
|
|
void CLlsmgrView::OnFormatReport()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_REPORT.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsFormatSupported(m_pTabEntry) && !IsFormatReport(m_pTabEntry))
|
|
{
|
|
VALIDATE_OBJECT(m_pTabEntry->pWnd, CWnd);
|
|
|
|
::LvChangeFormat((CListCtrl*)m_pTabEntry->pWnd, LVS_REPORT);
|
|
SetFormatReport(m_pTabEntry);
|
|
}
|
|
}
|
|
|
|
void CLlsmgrView::OnFormatSmallIcons()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_SMALL_ICON
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsFormatSupported(m_pTabEntry) && !IsFormatSmallIcons(m_pTabEntry))
|
|
{
|
|
VALIDATE_OBJECT(m_pTabEntry->pWnd, CWnd);
|
|
|
|
::LvChangeFormat((CListCtrl*)m_pTabEntry->pWnd, LVS_SMALLICON);
|
|
SetFormatSmallIcons(m_pTabEntry);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnGetDispInfoLicenseList(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_PURCHASE_HISTORY_DATE:
|
|
{
|
|
BSTR bstrDate = pLicense->GetDateString();
|
|
if(bstrDate != NULL )
|
|
{
|
|
lstrcpyn(plvItem->pszText, bstrDate, plvItem->cchTextMax);
|
|
SysFreeString(bstrDate);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_PRODUCT:
|
|
lstrcpyn(plvItem->pszText, pLicense->m_strProduct, plvItem->cchTextMax);
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_QUANTITY:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pLicense->m_lQuantity);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_ADMINISTRATOR:
|
|
lstrcpyn(plvItem->pszText, pLicense->m_strUser, plvItem->cchTextMax);
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_COMMENT:
|
|
lstrcpyn(plvItem->pszText, pLicense->m_strDescription, plvItem->cchTextMax);
|
|
break;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnGetDispInfoProductList(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);
|
|
|
|
CProduct* pProduct = (CProduct*)plvItem->lParam;
|
|
VALIDATE_OBJECT(pProduct, CProduct);
|
|
|
|
switch (plvItem->iSubItem)
|
|
{
|
|
case LVID_PRODUCTS_VIEW_NAME:
|
|
plvItem->iImage = CalcProductBitmap(pProduct);
|
|
lstrcpyn(plvItem->pszText, pProduct->m_strName, plvItem->cchTextMax);
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SEAT_CONSUMED:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pProduct->m_lInUse);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SEAT_PURCHASED:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pProduct->m_lLimit);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SERVER_PURCHASED:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pProduct->m_lConcurrent);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SERVER_REACHED:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pProduct->m_lHighMark);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnGetDispInfoServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVN_GETDISPINFO.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
TV_ITEM* ptvItem = &((TV_DISPINFO*)pNMHDR)->item;
|
|
|
|
CCmdTarget *pObject = (CCmdTarget*)ptvItem->lParam;
|
|
VALIDATE_OBJECT(pObject, CCmdTarget);
|
|
|
|
if (pObject->IsKindOf(RUNTIME_CLASS(CDomain)))
|
|
{
|
|
lstrcpyn(ptvItem->pszText, ((CDomain*)pObject)->m_strName, ptvItem->cchTextMax);
|
|
|
|
ptvItem->iImage = BMPI_DOMAIN;
|
|
ptvItem->iSelectedImage = ptvItem->iImage;
|
|
}
|
|
else if (pObject->IsKindOf(RUNTIME_CLASS(CServer)))
|
|
{
|
|
lstrcpyn(ptvItem->pszText, ((CServer*)pObject)->m_strName, ptvItem->cchTextMax);
|
|
|
|
ptvItem->iImage = BMPI_SERVER;
|
|
ptvItem->iSelectedImage = ptvItem->iImage;
|
|
}
|
|
else if (pObject->IsKindOf(RUNTIME_CLASS(CService)))
|
|
{
|
|
BSTR bstrServiceName = ((CService*)pObject)->GetDisplayName();
|
|
lstrcpyn(ptvItem->pszText, bstrServiceName, ptvItem->cchTextMax);
|
|
SysFreeString(bstrServiceName);
|
|
|
|
ptvItem->iImage = CalcServiceBitmap((CService*)pObject);
|
|
ptvItem->iSelectedImage = ptvItem->iImage;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnGetDispInfoUserList(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);
|
|
|
|
CUser* pUser = (CUser*)plvItem->lParam;
|
|
VALIDATE_OBJECT(pUser, CUser);
|
|
|
|
switch (plvItem->iSubItem)
|
|
{
|
|
case LVID_PER_SEAT_CLIENTS_NAME:
|
|
plvItem->iImage = CalcUserBitmap(pUser);
|
|
lstrcpyn(plvItem->pszText, pUser->m_strName, plvItem->cchTextMax);
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_LICENSED_USAGE:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pUser->m_lInUse);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_UNLICENSED_USAGE:
|
|
{
|
|
CString strLabel;
|
|
strLabel.Format(_T("%ld"), pUser->m_lUnlicensed);
|
|
lstrcpyn(plvItem->pszText, strLabel, plvItem->cchTextMax);
|
|
}
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_SERVER_PRODUCTS:
|
|
lstrcpyn(plvItem->pszText, pUser->m_strProducts, plvItem->cchTextMax);
|
|
break;
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnItemExpandingServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVN_ITEMEXPANDING.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
TV_ITEM tvItem = pNMTreeView->itemNew;
|
|
|
|
if (!(tvItem.state & TVIS_EXPANDEDONCE))
|
|
{
|
|
BeginWaitCursor();
|
|
|
|
CCmdTarget* pParent = (CCmdTarget*)tvItem.lParam;
|
|
VALIDATE_OBJECT(pParent, CCmdTarget);
|
|
|
|
VARIANT va;
|
|
VariantInit(&va);
|
|
|
|
BOOL bIsInserted = FALSE;
|
|
BOOL bDisplayError = TRUE;
|
|
|
|
if (pParent->IsKindOf(RUNTIME_CLASS(CApplication)))
|
|
{
|
|
CDomains* pDomains = (CDomains*)MKOBJ(((CApplication*)pParent)->GetDomains(va));
|
|
|
|
if (pDomains)
|
|
{
|
|
if (::TvInsertObArray(&m_serverTree, tvItem.hItem, pDomains->m_pObArray))
|
|
{
|
|
bIsInserted = TRUE;
|
|
}
|
|
|
|
pDomains->InternalRelease(); // objects AddRef'd individually
|
|
}
|
|
}
|
|
else if (pParent->IsKindOf(RUNTIME_CLASS(CDomain)))
|
|
{
|
|
CServers* pServers = (CServers*)MKOBJ(((CDomain*)pParent)->GetServers(va));
|
|
|
|
if (pServers)
|
|
{
|
|
if (::TvInsertObArray(&m_serverTree, tvItem.hItem, pServers->m_pObArray))
|
|
{
|
|
bIsInserted = TRUE;
|
|
}
|
|
|
|
pServers->InternalRelease(); // objects AddRef'd individually
|
|
}
|
|
}
|
|
else if (pParent->IsKindOf(RUNTIME_CLASS(CServer)))
|
|
{
|
|
CServices* pServices = (CServices*)MKOBJ(((CServer*)pParent)->GetServices(va));
|
|
|
|
if (pServices)
|
|
{
|
|
if (::TvInsertObArray(&m_serverTree, tvItem.hItem, pServices->m_pObArray, FALSE))
|
|
{
|
|
bIsInserted = TRUE;
|
|
}
|
|
|
|
pServices->InternalRelease(); // objects AddRef'd individually
|
|
}
|
|
else if ( ( ERROR_FILE_NOT_FOUND == LlsGetLastStatus() )
|
|
|| ( STATUS_NOT_FOUND == LlsGetLastStatus() ) )
|
|
{
|
|
// license service not configured on the target server
|
|
AfxMessageBox( IDP_ERROR_SERVER_NOT_CONFIGURED, MB_OK | MB_ICONEXCLAMATION, 0 );
|
|
bDisplayError = FALSE;
|
|
}
|
|
}
|
|
|
|
EndWaitCursor();
|
|
|
|
if (!bIsInserted && bDisplayError)
|
|
{
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnInitialUpdate()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by framework after the view is first attached
|
|
to the document but before it is initially displayed.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (LlsGetApp()->IsConnected())
|
|
{
|
|
OnUpdate(this, UPDATE_MAIN_TABS, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnKeyDownLicenseList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_KEYDOWN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (((LV_KEYDOWN*)pNMHDR)->wVKey == VK_TAB)
|
|
{
|
|
m_tabCtrl.SetFocus();
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnKeyDownProductList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_KEYDOWN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (((LV_KEYDOWN*)pNMHDR)->wVKey == VK_TAB)
|
|
{
|
|
m_tabCtrl.SetFocus();
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnKeyDownServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVN_KEYDOWN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (((TV_KEYDOWN*)pNMHDR)->wVKey == VK_TAB)
|
|
{
|
|
m_tabCtrl.SetFocus();
|
|
}
|
|
|
|
*pResult = TRUE;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnKeyDownTabCtrl(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TCN_KEYDOWN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
TC_KEYDOWN* tcKeyDown = (TC_KEYDOWN*)pNMHDR;
|
|
|
|
if (tcKeyDown->wVKey == VK_TAB)
|
|
{
|
|
m_pTabEntry->pWnd->SetFocus();
|
|
}
|
|
else if ((tcKeyDown->wVKey == VK_LEFT) &&
|
|
(m_pTabEntry->iItem == TCID_PURCHASE_HISTORY))
|
|
{
|
|
PostMessage(WM_COMMAND, ID_VIEW_SERVERS);
|
|
}
|
|
else if ((tcKeyDown->wVKey == VK_RIGHT) &&
|
|
(m_pTabEntry->iItem == TCID_SERVER_BROWSER))
|
|
{
|
|
PostMessage(WM_COMMAND, ID_VIEW_LICENSES);
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnKeyDownUserList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for LVN_KEYDOWN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (((LV_KEYDOWN*)pNMHDR)->wVKey == VK_TAB)
|
|
{
|
|
m_tabCtrl.SetFocus();
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
|
|
void CLlsmgrView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_INITMENU.
|
|
|
|
Arguments:
|
|
|
|
pPopupMenu - menu object.
|
|
nIndex - menu position.
|
|
bSysMenu - true if system menu.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
#define SUBMENU_LICENSE 0
|
|
#define SUBMENU_LICENSE_DELETE 2
|
|
#define SUBMENU_LICENSE_PROPERTIES 3
|
|
#define SUBMENU_LICENSE_INSERT_MRU 7
|
|
|
|
#define SUBMENU_LICENSE_ITEM_ID0 ID_NEW_LICENSE
|
|
|
|
#define SUBMENU_OPTIONS 2
|
|
#define SUBMENU_OPTIONS_FORMAT 2
|
|
#define SUBMENU_OPTIONS_SORTBY 3
|
|
|
|
#define SUBMENU_OPTIONS_ITEM_ID0 ID_SELECT_FONT
|
|
|
|
#define SUBMENU_FORMAT_LARGE_ICON 0
|
|
#define SUBMENU_FORMAT_SMALL_ICON 1
|
|
#define SUBMENU_FORMAT_LIST 2
|
|
#define SUBMENU_FORMAT_DETAILS 3
|
|
|
|
if (bSysMenu)
|
|
return; // bail...
|
|
|
|
if ((nIndex != SUBMENU_LICENSE) && (nIndex != SUBMENU_OPTIONS))
|
|
return; // bail...
|
|
|
|
int nMenuItemId = pPopupMenu->GetMenuItemID(0); // check first item
|
|
|
|
if (nMenuItemId == SUBMENU_LICENSE_ITEM_ID0)
|
|
{
|
|
UINT CmdId;
|
|
UINT MenuId;
|
|
|
|
CmdId = ID_MRU_DOMAIN0;
|
|
while (pPopupMenu->RemoveMenu(CmdId++, MF_BYCOMMAND))
|
|
;
|
|
|
|
POSITION position;
|
|
position = m_mruDomainList.GetHeadPosition();
|
|
|
|
CmdId = ID_MRU_DOMAIN0;
|
|
MenuId = SUBMENU_LICENSE_INSERT_MRU;
|
|
|
|
while (position)
|
|
{
|
|
TCHAR num[10];
|
|
wsprintf(num, _T("&%d "), CmdId - ID_MRU_DOMAIN0 + 1);
|
|
|
|
CString strDomain = m_mruDomainList.GetNext(position);
|
|
pPopupMenu->InsertMenu(MenuId++, MF_BYPOSITION, CmdId++, CString(num) + strDomain);
|
|
}
|
|
}
|
|
else if (nMenuItemId == SUBMENU_OPTIONS_ITEM_ID0)
|
|
{
|
|
UINT fEnableFormat = IsFormatSupported(m_pTabEntry) ? MF_ENABLED : MF_GRAYED;
|
|
UINT fEnableSortBy = IsSortSupported(m_pTabEntry) ? MF_ENABLED : MF_GRAYED;
|
|
|
|
pPopupMenu->EnableMenuItem(SUBMENU_OPTIONS_FORMAT, MF_BYPOSITION|fEnableFormat);
|
|
pPopupMenu->EnableMenuItem(SUBMENU_OPTIONS_SORTBY, MF_BYPOSITION|fEnableSortBy);
|
|
|
|
if (fEnableSortBy == MF_ENABLED)
|
|
{
|
|
ASSERT(m_pTabEntry->plvColumnInfo);
|
|
PLV_COLUMN_ENTRY plvColumnEntry = m_pTabEntry->plvColumnInfo->lvColumnEntry;
|
|
|
|
CMenu* pSortByMenu = pPopupMenu->GetSubMenu(SUBMENU_OPTIONS_SORTBY);
|
|
|
|
while (pSortByMenu->RemoveMenu(0, MF_BYPOSITION))
|
|
;
|
|
|
|
int index;
|
|
int nStringId;
|
|
CString strMenu;
|
|
|
|
for (index = 0; index < m_pTabEntry->plvColumnInfo->nColumns; index++)
|
|
{
|
|
if (nStringId = plvColumnEntry->nMenuStringId)
|
|
{
|
|
strMenu.LoadString(nStringId);
|
|
pSortByMenu->AppendMenu(MF_STRING, ID_SORT_COLUMN0+index, strMenu);
|
|
}
|
|
|
|
plvColumnEntry++;
|
|
}
|
|
|
|
pSortByMenu->CheckMenuItem(ID_SORT_COLUMN0+m_pTabEntry->plvColumnInfo->nSortedItem, MF_BYCOMMAND|MF_CHECKED);
|
|
}
|
|
|
|
if (fEnableFormat == MF_ENABLED)
|
|
{
|
|
CMenu* pFormatMenu = pPopupMenu->GetSubMenu(SUBMENU_OPTIONS_FORMAT);
|
|
|
|
pFormatMenu->CheckMenuItem(SUBMENU_FORMAT_LARGE_ICON, MF_BYPOSITION|(IsFormatLargeIcons(m_pTabEntry) ? MF_CHECKED : MF_UNCHECKED));
|
|
pFormatMenu->CheckMenuItem(SUBMENU_FORMAT_SMALL_ICON, MF_BYPOSITION|(IsFormatSmallIcons(m_pTabEntry) ? MF_CHECKED : MF_UNCHECKED));
|
|
pFormatMenu->CheckMenuItem(SUBMENU_FORMAT_LIST , MF_BYPOSITION|(IsFormatList(m_pTabEntry) ? MF_CHECKED : MF_UNCHECKED));
|
|
pFormatMenu->CheckMenuItem(SUBMENU_FORMAT_DETAILS , MF_BYPOSITION|(IsFormatReport(m_pTabEntry) ? MF_CHECKED : MF_UNCHECKED));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnNewLicense()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_NEW_LICENSE.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
|
|
VALIDATE_OBJECT(pController, CController);
|
|
|
|
LPTSTR pszUniServerName = pController->GetName();
|
|
|
|
if ( NULL == pszUniServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
LPSTR pszAscServerName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniServerName ) );
|
|
|
|
if ( NULL == pszAscServerName )
|
|
{
|
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
|
}
|
|
else
|
|
{
|
|
wsprintfA( pszAscServerName, "%ls", pszUniServerName );
|
|
|
|
LPSTR pszAscProductName = NULL;
|
|
|
|
if ( m_pTabEntry->iItem == TCID_PRODUCTS_VIEW )
|
|
{
|
|
CProduct* pProduct = (CProduct*) ::LvGetSelObj(&m_productList);
|
|
|
|
if ( NULL != pProduct )
|
|
{
|
|
LPTSTR pszUniProductName = pProduct->GetName();
|
|
|
|
if ( NULL != pszUniProductName )
|
|
{
|
|
pszAscProductName = (LPSTR) LocalAlloc( LMEM_FIXED, 1 + lstrlen( pszUniProductName ) );
|
|
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
wsprintfA( pszAscProductName, "%ls", pszUniProductName );
|
|
}
|
|
|
|
SysFreeString( pszUniProductName );
|
|
}
|
|
}
|
|
}
|
|
|
|
DWORD dwError = CCFCertificateEnterUI( m_hWnd, pszAscServerName, pszAscProductName, pszAscProductName ? "Microsoft" : NULL, 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;
|
|
}
|
|
|
|
OnUpdate(this, fUpdateHint, NULL);
|
|
|
|
LocalFree( pszAscServerName );
|
|
if ( NULL != pszAscProductName )
|
|
{
|
|
LocalFree( pszAscProductName );
|
|
}
|
|
}
|
|
|
|
SysFreeString( pszUniServerName );
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnNewMapping()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_NEW_MAPPING.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CNewMappingDialog newmDlg;
|
|
newmDlg.DoModal();
|
|
|
|
OnUpdate(this, newmDlg.m_fUpdateHint, NULL);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnReturnProductList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_RETURN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ViewProductProperties();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnReturnServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_RETURN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ViewServerProperties();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnReturnUserList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_RETURN.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ViewUserProperties();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSaveSettings()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_SAVE_SETTINGS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
m_bSaveSettings = !m_bSaveSettings;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSelChangeTabCtrl(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TCN_SELCHANGE.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(TRUE);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSelChangingTabCtrl(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TCN_SELCHANGING.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(FALSE);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSelectDomain()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_SELECT_DOMAIN.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CSelectDomainDialog domainDlg;
|
|
domainDlg.DoModal();
|
|
|
|
OnUpdate(this, domainDlg.m_fUpdateHint, NULL);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSelectFont()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_SELECT_FONT.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
LOGFONT lFont = m_lFont;
|
|
|
|
CFontDialog fontDlg(&lFont, CF_SCREENFONTS|CF_LIMITSIZE, NULL, NULL);
|
|
|
|
fontDlg.m_cf.nSizeMin = 8;
|
|
fontDlg.m_cf.nSizeMax = 20;
|
|
|
|
if (fontDlg.DoModal() == IDOK)
|
|
{
|
|
CFont* pNewFont;
|
|
|
|
if (!*(m_lFont.lfFaceName))
|
|
lFont.lfCharSet = m_lFont.lfCharSet;
|
|
if (pNewFont = CFont::FromHandle(::CreateFontIndirect(&lFont)))
|
|
{
|
|
m_lFont = lFont;
|
|
|
|
BeginWaitCursor();
|
|
|
|
m_tabCtrl.SetFont(pNewFont);
|
|
m_licenseList.SetFont(pNewFont);
|
|
m_productList.SetFont(pNewFont);
|
|
m_userList.SetFont(pNewFont);
|
|
m_serverTree.SetFont(pNewFont);
|
|
|
|
EndWaitCursor();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::OnSelMruDomain(UINT nID)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_MRU_DOMAIN*.
|
|
|
|
Arguments:
|
|
|
|
nID - id of domain.
|
|
|
|
Return Values:
|
|
|
|
Returns true always.
|
|
|
|
--*/
|
|
|
|
{
|
|
POSITION position;
|
|
|
|
if (position = m_mruDomainList.FindIndex(nID - ID_MRU_DOMAIN0))
|
|
theApp.OpenDocumentFile(m_mruDomainList.GetAt(position));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSetFocusLicenseList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_SETFOCUS.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ClrTabInFocus(m_pTabEntry);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSetFocusProductList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_SETFOCUS.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ClrTabInFocus(m_pTabEntry);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSetFocusTabCtrl(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_SETFOCUS.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
SetTabInFocus(m_pTabEntry);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSetFocusServerTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_SETFOCUS.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ClrTabInFocus(m_pTabEntry);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSetFocusUserList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for NM_SETFOCUS.
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - notification header.
|
|
pResult - return code.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ClrTabInFocus(m_pTabEntry);
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSize(UINT nType, int cx, int cy)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for WM_SIZE.
|
|
|
|
Arguments:
|
|
|
|
nType - type of resizing.
|
|
cx - new width of client area.
|
|
cy - new height of client area.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
int x, y;
|
|
|
|
CView::OnSize(nType, cx, cy);
|
|
|
|
#define INDENT_FROM_FRAME 5
|
|
#define INDENT_FROM_TAB_CTRL 10
|
|
|
|
if (m_tabCtrl.GetSafeHwnd())
|
|
{
|
|
CRect clientRect;
|
|
GetClientRect(clientRect);
|
|
|
|
x = INDENT_FROM_FRAME;
|
|
y = INDENT_FROM_FRAME;
|
|
cx = clientRect.Width() - ((2 * x) + 1);
|
|
cy = clientRect.Height() - ((2 * y) + 1);
|
|
|
|
m_tabCtrl.MoveWindow(x, y, cx, cy, TRUE);
|
|
|
|
RECT tabRect;
|
|
m_tabCtrl.GetClientRect(clientRect);
|
|
m_tabCtrl.GetItemRect(0, &tabRect);
|
|
|
|
int tabHeight = tabRect.bottom - tabRect.top;
|
|
|
|
x = INDENT_FROM_TAB_CTRL;
|
|
y = (2 * tabHeight);
|
|
cx = clientRect.Width() - ((2 * x) + 1);
|
|
cy = clientRect.Height() - ((2 * tabHeight) + INDENT_FROM_TAB_CTRL + 1);
|
|
|
|
m_licenseList.MoveWindow(x, y, cx, cy, TRUE);
|
|
m_productList.MoveWindow(x, y, cx, cy, TRUE);
|
|
m_userList.MoveWindow (x, y, cx, cy, TRUE);
|
|
m_serverTree.MoveWindow (x, y, cx, cy, TRUE);
|
|
|
|
RecalcListColumns();
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnSortColumn(int iColumn)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Sort dispatcher.
|
|
|
|
Arguments:
|
|
|
|
iColumn - sort criteria.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
//BOOL bOrder = GetKeyState(VK_CONTROL) < 0;
|
|
|
|
|
|
|
|
switch (m_pTabEntry->iItem)
|
|
{
|
|
case TCID_PURCHASE_HISTORY:
|
|
g_licenseColumnInfo.bSortOrder = m_bOrder;
|
|
g_licenseColumnInfo.nSortedItem = iColumn;
|
|
m_licenseList.SortItems(CompareLicenses, 0); // use column info
|
|
break;
|
|
case TCID_PRODUCTS_VIEW:
|
|
g_productColumnInfo.bSortOrder = m_bOrder;
|
|
g_productColumnInfo.nSortedItem = iColumn;
|
|
m_productList.SortItems(CompareProducts, 0); // use column info
|
|
break;
|
|
case TCID_PER_SEAT_CLIENTS:
|
|
g_userColumnInfo.bSortOrder = m_bOrder;
|
|
g_userColumnInfo.nSortedItem = iColumn;
|
|
m_userList.SortItems(CompareUsers, 0); // use column info
|
|
break;
|
|
}
|
|
|
|
m_bOrder = !m_bOrder;
|
|
}
|
|
|
|
void CLlsmgrView::OnSortColumn0()
|
|
{ OnSortColumn(0); }
|
|
|
|
void CLlsmgrView::OnSortColumn1()
|
|
{ OnSortColumn(1); }
|
|
|
|
void CLlsmgrView::OnSortColumn2()
|
|
{ OnSortColumn(2); }
|
|
|
|
void CLlsmgrView::OnSortColumn3()
|
|
{ OnSortColumn(3); }
|
|
|
|
void CLlsmgrView::OnSortColumn4()
|
|
{ OnSortColumn(4); }
|
|
|
|
void CLlsmgrView::OnSortColumn5()
|
|
{ OnSortColumn(5); }
|
|
|
|
|
|
void CLlsmgrView::OnUpdate(CView* pSender, LPARAM fUpdateHint, CObject* pIgnore)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by framework when view needs to be refreshed.
|
|
|
|
Arguments:
|
|
|
|
pSender - view that modified document (only one).
|
|
fUpdateHint - hints about modifications.
|
|
pIgnore - not used.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ASSERT(pSender);
|
|
|
|
BeginWaitCursor();
|
|
|
|
if (IsLicenseInfoUpdated(fUpdateHint))
|
|
{
|
|
if (RefreshLicenseList())
|
|
{
|
|
SetTabUpdated(&g_tcTabInfo.tcTabEntry[TCID_PURCHASE_HISTORY]);
|
|
}
|
|
else
|
|
{
|
|
fUpdateHint = UPDATE_INFO_ABORT;
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
}
|
|
|
|
if (IsProductInfoUpdated(fUpdateHint))
|
|
{
|
|
if (RefreshProductList())
|
|
{
|
|
SetTabUpdated(&g_tcTabInfo.tcTabEntry[TCID_PRODUCTS_VIEW]);
|
|
}
|
|
else
|
|
{
|
|
fUpdateHint = UPDATE_INFO_ABORT;
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
}
|
|
|
|
if (IsUserInfoUpdated(fUpdateHint))
|
|
{
|
|
if (RefreshUserList())
|
|
{
|
|
SetTabUpdated(&g_tcTabInfo.tcTabEntry[TCID_PER_SEAT_CLIENTS]);
|
|
}
|
|
else
|
|
{
|
|
fUpdateHint = UPDATE_INFO_ABORT;
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
}
|
|
|
|
if (IsUpdateAborted(fUpdateHint))
|
|
{
|
|
ResetLicenseList();
|
|
ResetProductList();
|
|
ResetUserList();
|
|
|
|
CSelectDomainDialog sdomDlg;
|
|
|
|
if (sdomDlg.DoModal() != IDOK)
|
|
{
|
|
theApp.m_pMainWnd->PostMessage(WM_CLOSE);
|
|
}
|
|
}
|
|
else if (IsServerInfoUpdated(fUpdateHint))
|
|
{
|
|
if (RefreshServerTree())
|
|
{
|
|
SetTabUpdated(&g_tcTabInfo.tcTabEntry[TCID_SERVER_BROWSER]);
|
|
}
|
|
else
|
|
{
|
|
ResetServerTree();
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
}
|
|
|
|
EndWaitCursor();
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnUpdateSaveSettings(CCmdUI* pCmdUI)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for ID_SAVE_SETTINGS.
|
|
|
|
Arguments:
|
|
|
|
pCmdUI - interface for updating menu.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
pCmdUI->SetCheck(m_bSaveSettings);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnUpdateViewDelete(CCmdUI* pCmdUI)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for ID_VIEW_DELETE.
|
|
|
|
Arguments:
|
|
|
|
pCmdUI - interface for updating menu.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (!(IsItemSelected(m_pTabEntry) && IsDeleteSupported(m_pTabEntry)))
|
|
{
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
else if (m_pTabEntry->iItem == TCID_PRODUCTS_VIEW)
|
|
{
|
|
//
|
|
// Make sure they are licenses to delete...
|
|
//
|
|
|
|
CProduct* pProduct = (CProduct*)::LvGetSelObj(&m_productList);
|
|
VALIDATE_OBJECT(pProduct, CProduct);
|
|
|
|
if ( pProduct )
|
|
{
|
|
pCmdUI->Enable(pProduct->m_lLimit);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pCmdUI->Enable(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnUpdateViewProperties(CCmdUI* pCmdUI)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for ID_VIEW_PROPERTIES.
|
|
|
|
Arguments:
|
|
|
|
pCmdUI - interface for updating menu.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if (!(IsItemSelected(m_pTabEntry) && IsEditSupported(m_pTabEntry)))
|
|
{
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
else if (m_pTabEntry->iItem == TCID_SERVER_BROWSER)
|
|
{
|
|
//
|
|
// No properties for enterprise or domain...
|
|
//
|
|
|
|
CCmdTarget* pObject = (CCmdTarget*)::TvGetSelObj(&m_serverTree);
|
|
VALIDATE_OBJECT(pObject, CCmdTarget);
|
|
|
|
if ( pObject )
|
|
{
|
|
pCmdUI->Enable(pObject->IsKindOf(RUNTIME_CLASS(CServer)) ||
|
|
pObject->IsKindOf(RUNTIME_CLASS(CService)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pCmdUI->Enable(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewLicenses()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_LICENSES.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(FALSE);
|
|
m_tabCtrl.SetCurSel(TCID_PURCHASE_HISTORY);
|
|
EnableCurSelTab(TRUE);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewMappings()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_MAPPINGS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CLicenseGroupsDialog lgrpDlg;
|
|
lgrpDlg.DoModal();
|
|
|
|
OnUpdate(this, lgrpDlg.m_fUpdateHint, NULL);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewProducts()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_PRODUCTS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(FALSE);
|
|
m_tabCtrl.SetCurSel(TCID_PRODUCTS_VIEW);
|
|
EnableCurSelTab(TRUE);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewProperties()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
View the properties of selected object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
switch (m_pTabEntry->iItem)
|
|
{
|
|
case TCID_PRODUCTS_VIEW:
|
|
ViewProductProperties();
|
|
return;
|
|
case TCID_PER_SEAT_CLIENTS:
|
|
ViewUserProperties();
|
|
return;
|
|
case TCID_SERVER_BROWSER:
|
|
ViewServerProperties();
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewRefresh()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_REFRESH.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
GetDocument()->Update();
|
|
|
|
OnUpdate(
|
|
this,
|
|
(m_pTabEntry->iItem == TCID_SERVER_BROWSER)
|
|
? UPDATE_BROWSER_TAB
|
|
: UPDATE_MAIN_TABS,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewServers()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_SERVERS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(FALSE);
|
|
m_tabCtrl.SetCurSel(TCID_SERVER_BROWSER);
|
|
EnableCurSelTab(TRUE);
|
|
m_serverTree.SetFocus();
|
|
}
|
|
|
|
|
|
void CLlsmgrView::OnViewUsers()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Message handler for ID_VIEW_USERS.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
EnableCurSelTab(FALSE);
|
|
m_tabCtrl.SetCurSel(TCID_PER_SEAT_CLIENTS);
|
|
EnableCurSelTab(TRUE);
|
|
}
|
|
|
|
|
|
void CLlsmgrView::RecalcListColumns()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adjusts list columns to client area.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
::LvResizeColumns(&m_licenseList, &g_licenseColumnInfo);
|
|
::LvResizeColumns(&m_productList, &g_productColumnInfo);
|
|
::LvResizeColumns(&m_userList, &g_userColumnInfo);
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshLicenseList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs license list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if licenses successfully updated.
|
|
|
|
--*/
|
|
|
|
{
|
|
CLicenses* pLicenses;
|
|
|
|
if (pLicenses = GetDocument()->GetLicenses())
|
|
{
|
|
return ::LvRefreshObArray(
|
|
&m_licenseList,
|
|
&g_licenseColumnInfo,
|
|
pLicenses->m_pObArray
|
|
);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshProductList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs product list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if products successfully updated.
|
|
|
|
--*/
|
|
|
|
{
|
|
CProducts* pProducts;
|
|
|
|
if (pProducts = GetDocument()->GetProducts())
|
|
{
|
|
return ::LvRefreshObArray(
|
|
&m_productList,
|
|
&g_productColumnInfo,
|
|
pProducts->m_pObArray
|
|
);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshServerTree()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs server tree control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if servers successfully updated.
|
|
|
|
--*/
|
|
|
|
{
|
|
HTREEITEM hRoot;
|
|
HTREEITEM hDomain;
|
|
|
|
TV_ITEM tvItem = {0};
|
|
TV_INSERTSTRUCT tvInsert;
|
|
|
|
BOOL bIsRefreshed = FALSE;
|
|
|
|
if (hRoot = m_serverTree.GetRootItem())
|
|
{
|
|
VARIANT va;
|
|
VariantInit(&va);
|
|
|
|
CDomain* pDomain;
|
|
CDomains* pDomains = (CDomains*)MKOBJ(LlsGetApp()->GetDomains(va));
|
|
|
|
m_serverTree.SetRedraw( FALSE );
|
|
|
|
if (pDomains)
|
|
{
|
|
TV_EXPANDED_INFO tvExpandedInfo;
|
|
|
|
if (::TvRefreshObArray(
|
|
&m_serverTree,
|
|
hRoot,
|
|
pDomains->m_pObArray,
|
|
&tvExpandedInfo))
|
|
{
|
|
TV_EXPANDED_ITEM* pExpandedItem = tvExpandedInfo.pExpandedItems;
|
|
|
|
while (tvExpandedInfo.nExpandedItems--)
|
|
{
|
|
pDomain = (CDomain*)pExpandedItem->pObject;
|
|
VALIDATE_OBJECT(pDomain, CDomain);
|
|
|
|
if (hDomain = ::TvGetDomain(&m_serverTree, hRoot, pDomain))
|
|
{
|
|
::TvSwitchItem(&m_serverTree, hDomain, pExpandedItem);
|
|
|
|
if (!RefreshServerTreeServers(pExpandedItem->hItem))
|
|
{
|
|
::TvReleaseObArray(&m_serverTree, pExpandedItem->hItem);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
::TvReleaseObArray(&m_serverTree, pExpandedItem->hItem);
|
|
}
|
|
|
|
pDomain->InternalRelease(); // release now...
|
|
pExpandedItem++;
|
|
}
|
|
|
|
delete [] tvExpandedInfo.pExpandedItems;
|
|
|
|
bIsRefreshed = TRUE;
|
|
}
|
|
|
|
pDomains->InternalRelease(); // release now...
|
|
}
|
|
|
|
if (bIsRefreshed)
|
|
{
|
|
TV_SORTCB tvSortCB;
|
|
|
|
tvSortCB.hParent = hRoot;
|
|
tvSortCB.lpfnCompare = CompareDomains;
|
|
tvSortCB.lParam = 0L; // ignored...
|
|
|
|
m_serverTree.SortChildrenCB(&tvSortCB);
|
|
}
|
|
|
|
m_serverTree.SetRedraw( TRUE );
|
|
}
|
|
else
|
|
{
|
|
CString strLabel;
|
|
|
|
tvItem.mask = TVIF_TEXT|
|
|
TVIF_PARAM|
|
|
TVIF_CHILDREN|
|
|
TVIF_SELECTEDIMAGE|
|
|
TVIF_IMAGE;
|
|
|
|
tvItem.cChildren = TRUE;
|
|
tvItem.iImage = BMPI_ENTERPRISE;
|
|
tvItem.iSelectedImage = BMPI_ENTERPRISE;
|
|
|
|
strLabel.LoadString(IDS_ENTERPRISE);
|
|
tvItem.pszText = MKSTR(strLabel);
|
|
|
|
tvItem.lParam = (LPARAM)(LPVOID)LlsGetApp();
|
|
|
|
tvInsert.item = tvItem;
|
|
tvInsert.hInsertAfter = (HTREEITEM)TVI_ROOT;
|
|
tvInsert.hParent = (HTREEITEM)NULL;
|
|
|
|
if (hRoot = m_serverTree.InsertItem(&tvInsert))
|
|
{
|
|
hDomain = hRoot; // initialize...
|
|
|
|
if (m_serverTree.Expand(hRoot, TVE_EXPAND))
|
|
{
|
|
if (LlsGetApp()->IsFocusDomain())
|
|
{
|
|
CDomain* pActiveDomain = GetDocument()->GetDomain();
|
|
ASSERT(pActiveDomain);
|
|
|
|
if (hDomain = ::TvGetDomain(&m_serverTree, hRoot, pActiveDomain))
|
|
{
|
|
m_serverTree.Expand(hDomain, TVE_EXPAND);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
theApp.DisplayLastStatus(); // display warning...
|
|
}
|
|
|
|
VERIFY(m_serverTree.Select(hDomain, TVGN_FIRSTVISIBLE));
|
|
VERIFY(m_serverTree.Select(hDomain, TVGN_CARET));
|
|
|
|
bIsRefreshed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LlsSetLastStatus(STATUS_NO_MEMORY);
|
|
}
|
|
}
|
|
|
|
return bIsRefreshed;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshServerTreeServers(HTREEITEM hParent)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs servers of domain.
|
|
|
|
Arguments:
|
|
|
|
hParent - handle of expanded domain.
|
|
|
|
Return Values:
|
|
|
|
Returns true if successful.
|
|
|
|
--*/
|
|
|
|
{
|
|
TV_ITEM tvItem;
|
|
HTREEITEM hServer;
|
|
|
|
BOOL bIsRefreshed = FALSE;
|
|
|
|
VARIANT va;
|
|
VariantInit(&va);
|
|
|
|
tvItem.hItem = hParent;
|
|
tvItem.mask = LVIF_PARAM;
|
|
|
|
VERIFY(m_serverTree.GetItem(&tvItem));
|
|
|
|
CDomain* pDomain = (CDomain*)tvItem.lParam;
|
|
VALIDATE_OBJECT(pDomain, CDomain);
|
|
|
|
CServer* pServer;
|
|
CServers* pServers = (CServers*)MKOBJ(pDomain->GetServers(va));
|
|
|
|
if (pServers)
|
|
{
|
|
TV_EXPANDED_INFO tvExpandedInfo;
|
|
|
|
if (::TvRefreshObArray(
|
|
&m_serverTree,
|
|
hParent,
|
|
pServers->m_pObArray,
|
|
&tvExpandedInfo))
|
|
{
|
|
TV_EXPANDED_ITEM* pExpandedItem = tvExpandedInfo.pExpandedItems;
|
|
|
|
while (tvExpandedInfo.nExpandedItems--)
|
|
{
|
|
pServer = (CServer*)pExpandedItem->pObject;
|
|
VALIDATE_OBJECT(pServer, CServer);
|
|
|
|
if (hServer = ::TvGetServer(&m_serverTree, hParent, pServer))
|
|
{
|
|
::TvSwitchItem(&m_serverTree, hServer, pExpandedItem);
|
|
|
|
if (!RefreshServerTreeServices(pExpandedItem->hItem))
|
|
{
|
|
::TvReleaseObArray(&m_serverTree, pExpandedItem->hItem);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
::TvReleaseObArray(&m_serverTree, pExpandedItem->hItem);
|
|
}
|
|
|
|
pServer->InternalRelease(); // release now...
|
|
pExpandedItem++;
|
|
}
|
|
|
|
delete [] tvExpandedInfo.pExpandedItems;
|
|
bIsRefreshed = TRUE;
|
|
}
|
|
|
|
pServers->InternalRelease(); // release now...
|
|
}
|
|
|
|
if (bIsRefreshed)
|
|
{
|
|
TV_SORTCB tvSortCB;
|
|
|
|
tvSortCB.hParent = hParent;
|
|
tvSortCB.lpfnCompare = CompareServers;
|
|
tvSortCB.lParam = 0L; // ignored...
|
|
|
|
m_serverTree.SortChildrenCB(&tvSortCB);
|
|
}
|
|
else
|
|
{
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
|
|
return bIsRefreshed;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshServerTreeServices(HTREEITEM hParent)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs services of server.
|
|
|
|
Arguments:
|
|
|
|
hParent - handle of expanded server.
|
|
|
|
Return Values:
|
|
|
|
Returns true if successful.
|
|
|
|
--*/
|
|
|
|
{
|
|
TV_ITEM tvItem;
|
|
|
|
BOOL bIsRefreshed = FALSE;
|
|
|
|
VARIANT va;
|
|
VariantInit(&va);
|
|
|
|
tvItem.hItem = hParent;
|
|
tvItem.mask = LVIF_PARAM;
|
|
|
|
VERIFY(m_serverTree.GetItem(&tvItem));
|
|
|
|
CServer* pServer = (CServer*)tvItem.lParam;
|
|
VALIDATE_OBJECT(pServer, CServer);
|
|
|
|
CServices* pServices = (CServices*)MKOBJ(pServer->GetServices(va));
|
|
|
|
if (pServices)
|
|
{
|
|
TV_EXPANDED_INFO tvExpandedInfo;
|
|
|
|
if (::TvRefreshObArray(&m_serverTree, hParent, pServices->m_pObArray, &tvExpandedInfo))
|
|
{
|
|
ASSERT(!tvExpandedInfo.nExpandedItems);
|
|
ASSERT(!tvExpandedInfo.pExpandedItems);
|
|
|
|
bIsRefreshed = TRUE; // should be no expanded items...
|
|
}
|
|
|
|
pServices->InternalRelease(); // release now...
|
|
}
|
|
|
|
if (bIsRefreshed)
|
|
{
|
|
TV_SORTCB tvSortCB;
|
|
|
|
tvSortCB.hParent = hParent;
|
|
tvSortCB.lpfnCompare = CompareServices;
|
|
tvSortCB.lParam = 0L; // ignored...
|
|
|
|
m_serverTree.SortChildrenCB(&tvSortCB);
|
|
}
|
|
else
|
|
{
|
|
theApp.DisplayLastStatus();
|
|
}
|
|
|
|
return bIsRefreshed;
|
|
}
|
|
|
|
|
|
BOOL CLlsmgrView::RefreshUserList()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Refreshs user list control.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
Returns true if users successfully updated.
|
|
|
|
--*/
|
|
|
|
{
|
|
CUsers* pUsers;
|
|
|
|
if (pUsers = GetDocument()->GetUsers())
|
|
{
|
|
return ::LvRefreshObArray(
|
|
&m_userList,
|
|
&g_userColumnInfo,
|
|
pUsers->m_pObArray
|
|
);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void CLlsmgrView::SaveSettings()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save settings to registry.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
long Status;
|
|
HKEY hKeyLlsmgr;
|
|
|
|
DWORD dwDisposition;
|
|
|
|
Status = RegCreateKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
szRegKeyLlsmgr,
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&hKeyLlsmgr,
|
|
&dwDisposition
|
|
);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
//
|
|
// Save settings on exit
|
|
//
|
|
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrSaveSettings, 0, REG_DWORD, (LPBYTE)&m_bSaveSettings, sizeof(DWORD));
|
|
|
|
if (m_bSaveSettings)
|
|
{
|
|
//
|
|
// Save font information
|
|
//
|
|
|
|
long lValue;
|
|
|
|
lValue = (m_lFont.lfHeight < 0) ? -m_lFont.lfHeight : 0;
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontHeight, 0, REG_DWORD, (LPBYTE)&lValue, sizeof(DWORD));
|
|
|
|
lValue = (m_lFont.lfWeight > 0) ? m_lFont.lfWeight : 0;
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontWeight, 0, REG_DWORD, (LPBYTE)&lValue, sizeof(DWORD));
|
|
|
|
lValue = (m_lFont.lfItalic > 0) ? TRUE : FALSE;
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontItalic, 0, REG_DWORD, (LPBYTE)&lValue, sizeof(DWORD));
|
|
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontFaceName, 0, REG_SZ, (LPBYTE)m_lFont.lfFaceName, (lstrlen(m_lFont.lfFaceName) + 1) * sizeof(TCHAR));
|
|
|
|
lValue = (LONG)m_lFont.lfCharSet;
|
|
::RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrFontCharset, 0, REG_DWORD, (LPBYTE)&lValue, sizeof(DWORD));
|
|
|
|
//
|
|
// MRU domain list
|
|
//
|
|
|
|
TCHAR szValue[512];
|
|
LPTSTR pszValue = szValue;
|
|
|
|
DWORD cbValue = 2 * sizeof(TCHAR); // terminators
|
|
|
|
CString strDomain;
|
|
UINT cchDomain;
|
|
|
|
POSITION position;
|
|
position = m_mruDomainList.GetTailPosition();
|
|
|
|
while (position)
|
|
{
|
|
strDomain = m_mruDomainList.GetPrev(position);
|
|
cchDomain = strDomain.GetLength() + 1;
|
|
|
|
lstrcpyn(pszValue, strDomain, cchDomain);
|
|
|
|
pszValue += cchDomain;
|
|
cbValue += cchDomain * sizeof(TCHAR);
|
|
}
|
|
|
|
*pszValue = _T('\0');
|
|
*(pszValue+1) = _T('\0');
|
|
|
|
RegSetValueEx(hKeyLlsmgr, szRegKeyLlsmgrMruList, 0, REG_MULTI_SZ, (LPBYTE)szValue, cbValue);
|
|
}
|
|
|
|
RegCloseKey(hKeyLlsmgr);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::ViewProductProperties()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
View properties of selected product.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CProduct* pProduct;
|
|
|
|
if (pProduct = (CProduct*)::LvGetSelObj(&m_productList))
|
|
{
|
|
VALIDATE_OBJECT(pProduct, CProduct);
|
|
|
|
CString strTitle;
|
|
AfxFormatString1(strTitle, IDS_PROPERTIES_OF, pProduct->m_strName);
|
|
|
|
CProductPropertySheet productProperties(strTitle);
|
|
productProperties.InitPages(pProduct);
|
|
productProperties.DoModal();
|
|
|
|
OnUpdate(this, productProperties.m_fUpdateHint, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::ViewServerProperties()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
View properties of selected server.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CObject* pObject;
|
|
|
|
if (pObject = (CObject*)::TvGetSelObj(&m_serverTree))
|
|
{
|
|
CString strTitle;
|
|
|
|
ASSERT_VALID(pObject);
|
|
|
|
if (pObject->IsKindOf(RUNTIME_CLASS(CServer)))
|
|
{
|
|
CServer* pServer = (CServer*)pObject;
|
|
AfxFormatString1(strTitle, IDS_PROPERTIES_OF, pServer->m_strName);
|
|
|
|
CServerPropertySheet serverProperties(strTitle);
|
|
serverProperties.InitPages(pServer);
|
|
serverProperties.DoModal();
|
|
|
|
OnUpdate(this, serverProperties.m_fUpdateHint, NULL);
|
|
}
|
|
else if (pObject->IsKindOf(RUNTIME_CLASS(CService)))
|
|
{
|
|
CService* pService = (CService*)pObject;
|
|
|
|
CLicensingModeDialog lmodDlg;
|
|
lmodDlg.InitDialog(pService);
|
|
lmodDlg.DoModal();
|
|
|
|
if (lmodDlg.m_fUpdateHint)
|
|
{
|
|
TV_ITEM tvItem;
|
|
|
|
tvItem.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvItem.hItem = m_serverTree.GetSelectedItem();
|
|
tvItem.iImage = pService->IsPerServer() ? BMPI_PRODUCT_PER_SERVER : BMPI_PRODUCT_PER_SEAT;
|
|
tvItem.iSelectedImage = tvItem.iImage;
|
|
|
|
VERIFY(m_serverTree.SetItem(&tvItem));
|
|
VERIFY(m_serverTree.Select(tvItem.hItem, TVGN_CARET));
|
|
}
|
|
|
|
OnUpdate(this, lmodDlg.m_fUpdateHint, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CLlsmgrView::ViewUserProperties()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
View properties of selected user.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Values:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CUser* pUser;
|
|
|
|
if (pUser = (CUser*)::LvGetSelObj(&m_userList))
|
|
{
|
|
VALIDATE_OBJECT(pUser, CUser);
|
|
|
|
CString strTitle;
|
|
AfxFormatString1(strTitle, IDS_PROPERTIES_OF, pUser->m_strName);
|
|
|
|
CUserPropertySheet userProperties(strTitle);
|
|
userProperties.InitPages(pUser);
|
|
userProperties.DoModal();
|
|
|
|
OnUpdate(this, userProperties.m_fUpdateHint, NULL);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
int CALLBACK CompareLicenses(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_PURCHASE_HISTORY_DATE:
|
|
iResult = pLicense1->m_lDate - pLicense2->m_lDate;
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_PRODUCT:
|
|
iResult = pLicense1->m_strProduct.CompareNoCase(pLicense2->m_strProduct);
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_QUANTITY:
|
|
iResult = pLicense1->m_lQuantity - pLicense2->m_lQuantity;
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_ADMINISTRATOR:
|
|
iResult = pLicense1->m_strUser.CompareNoCase(pLicense2->m_strUser);
|
|
break;
|
|
|
|
case LVID_PURCHASE_HISTORY_COMMENT:
|
|
iResult = pLicense1->m_strDescription.CompareNoCase(pLicense2->m_strDescription);
|
|
break;
|
|
|
|
default:
|
|
iResult = 0;
|
|
break;
|
|
}
|
|
|
|
return g_licenseColumnInfo.bSortOrder ? -iResult : iResult;
|
|
}
|
|
|
|
|
|
int CALLBACK CompareProducts(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 pProduct1 ((CProduct*)lParam1)
|
|
#define pProduct2 ((CProduct*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pProduct1, CProduct);
|
|
VALIDATE_OBJECT(pProduct2, CProduct);
|
|
|
|
int iResult;
|
|
|
|
switch (g_productColumnInfo.nSortedItem)
|
|
{
|
|
case LVID_PRODUCTS_VIEW_NAME:
|
|
iResult = pProduct1->m_strName.CompareNoCase(pProduct2->m_strName);
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SEAT_CONSUMED:
|
|
iResult = pProduct1->m_lInUse - pProduct2->m_lInUse;
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SEAT_PURCHASED:
|
|
iResult = pProduct1->m_lLimit - pProduct2->m_lLimit;
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SERVER_PURCHASED:
|
|
iResult = pProduct1->m_lConcurrent - pProduct2->m_lConcurrent;
|
|
break;
|
|
|
|
case LVID_PRODUCTS_VIEW_PER_SERVER_REACHED:
|
|
iResult = pProduct1->m_lHighMark - pProduct2->m_lHighMark;
|
|
break;
|
|
|
|
default:
|
|
iResult = 0;
|
|
break;
|
|
}
|
|
|
|
return g_productColumnInfo.bSortOrder ? -iResult : iResult;
|
|
}
|
|
|
|
|
|
int CALLBACK CompareUsers(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 pUser1 ((CUser*)lParam1)
|
|
#define pUser2 ((CUser*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pUser1, CUser);
|
|
VALIDATE_OBJECT(pUser2, CUser);
|
|
|
|
int iResult;
|
|
|
|
switch (g_userColumnInfo.nSortedItem)
|
|
{
|
|
case LVID_PER_SEAT_CLIENTS_NAME:
|
|
iResult = pUser1->m_strName.CompareNoCase(pUser2->m_strName);
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_LICENSED_USAGE:
|
|
iResult = pUser1->m_lInUse - pUser2->m_lInUse;
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_UNLICENSED_USAGE:
|
|
iResult = pUser1->m_lUnlicensed - pUser2->m_lUnlicensed;
|
|
break;
|
|
|
|
case LVID_PER_SEAT_CLIENTS_SERVER_PRODUCTS:
|
|
iResult = pUser1->m_strProducts.CompareNoCase(pUser2->m_strProducts);
|
|
break;
|
|
|
|
default:
|
|
iResult = 0;
|
|
break;
|
|
}
|
|
|
|
return g_userColumnInfo.bSortOrder ? -iResult : iResult;
|
|
}
|
|
|
|
|
|
int CALLBACK CompareDomains(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVM_SORTCHILDRENCB.
|
|
|
|
Arguments:
|
|
|
|
lParam1 - object to sort.
|
|
lParam2 - object to sort.
|
|
lParamSort - sort criteria.
|
|
|
|
Return Values:
|
|
|
|
Same as lstrcmp.
|
|
|
|
--*/
|
|
|
|
{
|
|
#define pDomain1 ((CDomain*)lParam1)
|
|
#define pDomain2 ((CDomain*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pDomain1, CDomain);
|
|
VALIDATE_OBJECT(pDomain2, CDomain);
|
|
|
|
return pDomain1->m_strName.CompareNoCase(pDomain2->m_strName);
|
|
}
|
|
|
|
|
|
int CALLBACK CompareServers(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVM_SORTCHILDRENCB.
|
|
|
|
Arguments:
|
|
|
|
lParam1 - object to sort.
|
|
lParam2 - object to sort.
|
|
lParamSort - sort criteria.
|
|
|
|
Return Values:
|
|
|
|
Same as lstrcmp.
|
|
|
|
--*/
|
|
|
|
{
|
|
#define pServer1 ((CServer*)lParam1)
|
|
#define pServer2 ((CServer*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pServer1, CServer);
|
|
VALIDATE_OBJECT(pServer2, CServer);
|
|
|
|
return pServer1->m_strName.CompareNoCase(pServer2->m_strName);
|
|
}
|
|
|
|
|
|
int CALLBACK CompareServices(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notification handler for TVM_SORTCHILDRENCB.
|
|
|
|
Arguments:
|
|
|
|
lParam1 - object to sort.
|
|
lParam2 - object to sort.
|
|
lParamSort - sort criteria.
|
|
|
|
Return Values:
|
|
|
|
Same as lstrcmp.
|
|
|
|
--*/
|
|
|
|
{
|
|
#define pService1 ((CService*)lParam1)
|
|
#define pService2 ((CService*)lParam2)
|
|
|
|
VALIDATE_OBJECT(pService1, CService);
|
|
VALIDATE_OBJECT(pService2, CService);
|
|
|
|
return pService1->m_strName.CompareNoCase(pService2->m_strName);
|
|
}
|