779 lines
22 KiB
C++
779 lines
22 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: S M T L P S P . C P P
|
||
|
//
|
||
|
// Contents: The rendering of the UI for the network status monitor
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: CWill 10/06/1997
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "sminc.h"
|
||
|
#include "smpsh.h"
|
||
|
#include "smutil.h"
|
||
|
#include "ncnetcon.h"
|
||
|
|
||
|
//
|
||
|
// External data
|
||
|
//
|
||
|
|
||
|
extern const WCHAR c_szSpace[];
|
||
|
|
||
|
//
|
||
|
// Global Data
|
||
|
//
|
||
|
|
||
|
WCHAR c_szCmdLineFlagPrefix[] = L" -";
|
||
|
|
||
|
// The tool flags we can have registered
|
||
|
//
|
||
|
SM_TOOL_FLAGS g_asmtfMap[] =
|
||
|
{
|
||
|
{SCLF_CONNECTION, L"connection"},
|
||
|
{SCLF_ADAPTER, L"adapter"},
|
||
|
};
|
||
|
INT c_cAsmtfMap = celems(g_asmtfMap);
|
||
|
|
||
|
|
||
|
// The strings associated with the connection media type
|
||
|
//
|
||
|
WCHAR* g_pszNcmMap[] =
|
||
|
{
|
||
|
L"NCT_NONE",
|
||
|
L"NCT_DIRECT",
|
||
|
L"NCT_ISDN",
|
||
|
L"NCT_LAN",
|
||
|
L"NCT_PHONE",
|
||
|
L"NCT_TUNNEL"
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::CPspStatusMonitorTool
|
||
|
//
|
||
|
// Purpose: Creator
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
// Returns: Nil
|
||
|
//
|
||
|
CPspStatusMonitorTool::CPspStatusMonitorTool(VOID) :
|
||
|
m_hwndToolList(NULL)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::~CPspStatusMonitorTool
|
||
|
//
|
||
|
// Purpose: Destructor
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
// Returns: Nil
|
||
|
//
|
||
|
CPspStatusMonitorTool::~CPspStatusMonitorTool(VOID)
|
||
|
{
|
||
|
// Note : We don't want to try and destroy the objects in m_lstpsmte as
|
||
|
// they are owned by g_ncsCentral
|
||
|
|
||
|
//
|
||
|
// Free the items we own
|
||
|
//
|
||
|
::FreeCollectionAndItem(m_lstpstrCompIds);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrInitToolPage
|
||
|
//
|
||
|
// Purpose: Initialize the tools page class before the page has been
|
||
|
// created
|
||
|
//
|
||
|
// Arguments: pncInit - The connection associated with this monitor
|
||
|
//
|
||
|
// Returns: Error code
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrInitToolPage(INetConnection* pncInit,
|
||
|
const DWORD * adwHelpIDs)
|
||
|
{
|
||
|
// set context help ID
|
||
|
m_adwHelpIDs = adwHelpIDs;
|
||
|
|
||
|
// Find out what media type the connection is over
|
||
|
//
|
||
|
NETCON_PROPERTIES* pProps;
|
||
|
HRESULT hr = pncInit->GetProperties(&pProps);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
m_guidId = pProps->guidId;
|
||
|
m_dwCharacter = pProps->dwCharacter;
|
||
|
|
||
|
FreeNetconProperties(pProps);
|
||
|
pProps = NULL;
|
||
|
|
||
|
// Initialize m_strDeviceType
|
||
|
hr = HrGetDeviceType(pncInit);
|
||
|
if (S_OK != hr)
|
||
|
{
|
||
|
TraceError("CPspStatusMonitorTool::HrInitToolPage did not get MediaType info", hr);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
// Now choose what tools should be in the list
|
||
|
//
|
||
|
hr = HrCreateToolList(pncInit);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = HrInitToolPageType(pncInit);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrInitToolPage",hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrCreateToolList
|
||
|
//
|
||
|
// Purpose: From the global list of all possible tools, select the ones
|
||
|
// that should be shown in this monitor
|
||
|
//
|
||
|
// Arguments: pncInit The connection we are showing status on
|
||
|
//
|
||
|
// Returns: Nil
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrCreateToolList(INetConnection* pncInit)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
list<CStatMonToolEntry*>* plstpsmteCent = NULL;
|
||
|
list<CStatMonToolEntry*>::iterator iterPsmte;
|
||
|
|
||
|
CNetStatisticsCentral * pnsc = NULL;
|
||
|
|
||
|
hr = CNetStatisticsCentral::HrGetNetStatisticsCentral(&pnsc, FALSE);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
// Get the list of all the possible tools
|
||
|
//
|
||
|
plstpsmteCent = pnsc->PlstsmteRegEntries();
|
||
|
AssertSz(plstpsmteCent, "We should have a plstpsmteCent");
|
||
|
|
||
|
// Find out what tools should be in the dialog
|
||
|
//
|
||
|
if (plstpsmteCent->size() >0) // if at least one tool is registered
|
||
|
{
|
||
|
// Initialize m_lstpstrCompIds
|
||
|
// We should only do this if some of the tools do have a component list
|
||
|
BOOL fGetComponentList = FALSE;
|
||
|
|
||
|
iterPsmte = plstpsmteCent->begin();
|
||
|
while (!fGetComponentList && (iterPsmte != plstpsmteCent->end()))
|
||
|
{
|
||
|
if ((*iterPsmte)->lstpstrComponentID.size()>0)
|
||
|
fGetComponentList = TRUE;
|
||
|
|
||
|
iterPsmte++;
|
||
|
}
|
||
|
|
||
|
if (fGetComponentList)
|
||
|
{
|
||
|
hr = HrGetComponentList(pncInit);
|
||
|
if (S_OK != hr)
|
||
|
{
|
||
|
TraceError("CPspStatusMonitorTool::HrCreateToolList did not get Component list", hr);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
iterPsmte = plstpsmteCent->begin();
|
||
|
while (iterPsmte != plstpsmteCent->end())
|
||
|
{
|
||
|
// If this is a tool we should show in this dialog, add it to the
|
||
|
// tool page's list.
|
||
|
//
|
||
|
if (FToolToAddToList(*iterPsmte))
|
||
|
{
|
||
|
// Note : There is no ownership on this list, the central
|
||
|
// structure is responsible for destroying the tool objects
|
||
|
//
|
||
|
m_lstpsmte.push_back(*iterPsmte);
|
||
|
}
|
||
|
|
||
|
iterPsmte++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
::ReleaseObj(pnsc);
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrCreateToolList",hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::FToolToAddToList
|
||
|
//
|
||
|
// Purpose: Determines wheither a tool should validly be added to the
|
||
|
// tool list for this particular monitor
|
||
|
//
|
||
|
// Arguments: psmteTest - The tool entry that is to be tested to see if it
|
||
|
// matches the criteria to be added to the list
|
||
|
//
|
||
|
// Returns: TRUE if the tool should be added, FALSE if it should not
|
||
|
//
|
||
|
BOOL CPspStatusMonitorTool::FToolToAddToList(CStatMonToolEntry* psmteTest)
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
AssertSz(psmteTest, "We should have a psmteTest");
|
||
|
|
||
|
// 1) Check connection type
|
||
|
AssertSz(((NCM_NONE == 0)
|
||
|
&& (NCM_DIRECT == NCM_NONE + 1)
|
||
|
&& (NCM_ISDN == NCM_DIRECT + 1)
|
||
|
&& (NCM_LAN == NCM_ISDN + 1)
|
||
|
&& (NCM_PHONE == NCM_LAN + 1)
|
||
|
&& (NCM_TUNNEL == NCM_PHONE + 1)),
|
||
|
"Someone has been mucking with NETCON_MEDIATYPE");
|
||
|
|
||
|
// See if this tools should only be on certain connections. If no
|
||
|
// specific connection is listed, the tool is valid for all
|
||
|
//
|
||
|
if (!(psmteTest->lstpstrConnectionType).empty())
|
||
|
{
|
||
|
fRet = ::FIsStringInList(&(psmteTest->lstpstrConnectionType),
|
||
|
g_pszNcmMap[m_ncmType]);
|
||
|
}
|
||
|
|
||
|
// 2) Check device type
|
||
|
//
|
||
|
if ((fRet) && !(psmteTest->lstpstrConnectionType).empty())
|
||
|
{
|
||
|
fRet = ::FIsStringInList(&(psmteTest->lstpstrMediaType),
|
||
|
m_strDeviceType.c_str());
|
||
|
}
|
||
|
|
||
|
// 3) Check component list
|
||
|
//
|
||
|
if ((fRet) && !(psmteTest->lstpstrComponentID).empty())
|
||
|
{
|
||
|
BOOL fValid = FALSE;
|
||
|
list<tstring*>::iterator iterLstpstr;
|
||
|
|
||
|
iterLstpstr = m_lstpstrCompIds.begin();
|
||
|
while ((!fValid)
|
||
|
&& (iterLstpstr != m_lstpstrCompIds.end()))
|
||
|
{
|
||
|
// See if the component is also on the tools component list
|
||
|
//
|
||
|
fValid = ::FIsStringInList(&(psmteTest->lstpstrComponentID),
|
||
|
(*iterLstpstr)->c_str());
|
||
|
|
||
|
iterLstpstr++;
|
||
|
}
|
||
|
|
||
|
// Give back the result
|
||
|
//
|
||
|
fRet = fValid;
|
||
|
}
|
||
|
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnInitDialog
|
||
|
//
|
||
|
// Purpose: Do the initialization required when the page has just been created
|
||
|
//
|
||
|
// Arguments: Standard window messsage parameters
|
||
|
//
|
||
|
// Returns: Standard window message return value
|
||
|
//
|
||
|
LRESULT CPspStatusMonitorTool::OnInitDialog(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& bHandled)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LVCOLUMN lvcTemp = { 0 };
|
||
|
RECT rectToolList;
|
||
|
|
||
|
m_hwndToolList = GetDlgItem(IDC_LST_SM_TOOLS);
|
||
|
AssertSz(m_hwndToolList, "We don't have a tool list window");
|
||
|
|
||
|
//
|
||
|
// Set up the column
|
||
|
//
|
||
|
|
||
|
lvcTemp.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;
|
||
|
lvcTemp.fmt = LVCFMT_LEFT;
|
||
|
|
||
|
// Set the width of the column to the width of the window (minus a bit
|
||
|
// for the borders)
|
||
|
//
|
||
|
::GetWindowRect(m_hwndToolList, &rectToolList);
|
||
|
lvcTemp.cx = (rectToolList.right - rectToolList.left - 4);
|
||
|
|
||
|
// lvcTemp.pszText = NULL;
|
||
|
// lvcTemp.cchTextMax = 0;
|
||
|
// lvcTemp.iSubItem = 0;
|
||
|
// lvcTemp.iImage = 0;
|
||
|
// lvcTemp.iOrder = 0;
|
||
|
|
||
|
// Add the column to the list
|
||
|
//
|
||
|
if (-1 == ListView_InsertColumn(m_hwndToolList, 0, &lvcTemp))
|
||
|
{
|
||
|
hr = ::HrFromLastWin32Error();
|
||
|
}
|
||
|
|
||
|
// Fill out the dialog
|
||
|
//
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = HrFillToolList();
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::OnInitDialog", hr);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrFillToolList
|
||
|
//
|
||
|
// Purpose: Fills the tool list with correct items
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
// Returns: Error code
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrFillToolList(VOID)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
INT iItem = 0;
|
||
|
list<CStatMonToolEntry*>::iterator iterSmte;
|
||
|
|
||
|
// Tell the control how many items are being inserted so it can do a
|
||
|
// better job allocating internal structures.
|
||
|
ListView_SetItemCount(m_hwndToolList, m_lstpsmte.size());
|
||
|
|
||
|
//
|
||
|
// Fill in the combo box with subnet entries.
|
||
|
//
|
||
|
|
||
|
iterSmte = m_lstpsmte.begin();
|
||
|
|
||
|
while ((SUCCEEDED(hr)) && (iterSmte != m_lstpsmte.end()))
|
||
|
{
|
||
|
// Save some indirections
|
||
|
hr = HrAddOneEntryToToolList(*iterSmte, iItem);
|
||
|
|
||
|
// Move on the the next person.
|
||
|
iterSmte++;
|
||
|
iItem++;
|
||
|
}
|
||
|
|
||
|
// Selete the first item
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
ListView_SetItemState(m_hwndToolList, 0, LVIS_FOCUSED, LVIS_FOCUSED);
|
||
|
}
|
||
|
|
||
|
// Enable/Disable the "Open" button based on whether tools are present
|
||
|
//
|
||
|
::EnableWindow(GetDlgItem(IDC_BTN_SM_TOOLS_OPEN), (0 != iItem));
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrFillToolList", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrAddOneEntryToToolList
|
||
|
//
|
||
|
// Purpose: Take a tool associated with the connection and put it
|
||
|
// in the listview control
|
||
|
//
|
||
|
// Arguments: psmteAdd - The tool to add
|
||
|
// iItem - Where to put in in the list control
|
||
|
//
|
||
|
// Returns: Error code.
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrAddOneEntryToToolList(
|
||
|
CStatMonToolEntry* psmteAdd, INT iItem)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LVITEM lviTemp;
|
||
|
|
||
|
lviTemp.mask = LVIF_TEXT | LVIF_PARAM;
|
||
|
lviTemp.iItem = iItem;
|
||
|
lviTemp.iSubItem = 0;
|
||
|
lviTemp.state = 0;
|
||
|
lviTemp.stateMask = 0;
|
||
|
lviTemp.pszText = const_cast<PWSTR>(
|
||
|
psmteAdd->strDisplayName.c_str());
|
||
|
lviTemp.cchTextMax = psmteAdd->strDisplayName.length();
|
||
|
lviTemp.iImage = -1;
|
||
|
lviTemp.lParam = reinterpret_cast<LPARAM>(psmteAdd);
|
||
|
lviTemp.iIndent = 0;
|
||
|
|
||
|
//$ REVIEW : CWill : 10/16/97 : Return values
|
||
|
|
||
|
// Set up the item
|
||
|
//
|
||
|
ListView_InsertItem(m_hwndToolList, &lviTemp);
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrAddOneEntryToToolList", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnContextMenu
|
||
|
//
|
||
|
// Purpose: When right click a control, bring up help
|
||
|
//
|
||
|
// Arguments: Standard command parameters
|
||
|
//
|
||
|
// Returns: Standard return
|
||
|
//
|
||
|
LRESULT
|
||
|
CPspStatusMonitorTool::OnContextMenu(UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam,
|
||
|
BOOL& fHandled)
|
||
|
{
|
||
|
if (m_adwHelpIDs != NULL)
|
||
|
{
|
||
|
::WinHelp(m_hWnd,
|
||
|
c_szNetCfgHelpFile,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(ULONG_PTR)m_adwHelpIDs);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnHelp
|
||
|
//
|
||
|
// Purpose: When drag context help icon over a control, bring up help
|
||
|
//
|
||
|
// Arguments: Standard command parameters
|
||
|
//
|
||
|
// Returns: Standard return
|
||
|
//
|
||
|
LRESULT
|
||
|
CPspStatusMonitorTool::OnHelp(UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam,
|
||
|
BOOL& fHandled)
|
||
|
{
|
||
|
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
|
||
|
Assert(lphi);
|
||
|
|
||
|
if ((m_adwHelpIDs != NULL) && (HELPINFO_WINDOW == lphi->iContextType))
|
||
|
{
|
||
|
::WinHelp(static_cast<HWND>(lphi->hItemHandle),
|
||
|
c_szNetCfgHelpFile,
|
||
|
HELP_WM_HELP,
|
||
|
(ULONG_PTR)m_adwHelpIDs);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnDestroy
|
||
|
//
|
||
|
// Purpose: Clean up the dialog before the window goes away
|
||
|
//
|
||
|
// Arguments: Standard window messsage parameters
|
||
|
//
|
||
|
// Returns: Standard window message return value
|
||
|
//
|
||
|
LRESULT CPspStatusMonitorTool::OnDestroy(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& bHandled)
|
||
|
{
|
||
|
// Clean out the old items when the dialog closes
|
||
|
//
|
||
|
::FreeCollectionAndItem(m_lstpstrCompIds);
|
||
|
|
||
|
// Don't free the entries, because we don't own them
|
||
|
//
|
||
|
m_lstpsmte.erase(m_lstpsmte.begin(), m_lstpsmte.end());
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnToolOpen
|
||
|
//
|
||
|
// Purpose: Open the tool that is selected
|
||
|
//
|
||
|
// Arguments: Standard window message
|
||
|
//
|
||
|
// Returns: Standard return.
|
||
|
//
|
||
|
LRESULT CPspStatusMonitorTool::OnToolOpen(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
switch (wNotifyCode)
|
||
|
{
|
||
|
case BN_CLICKED:
|
||
|
hr = HrLaunchTool();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnItemActivate
|
||
|
//
|
||
|
// Purpose: When an item is acivated in the tool list, launch the tool
|
||
|
//
|
||
|
// Arguments: Standard notification messages
|
||
|
//
|
||
|
// Returns: Stadard return
|
||
|
//
|
||
|
LRESULT CPspStatusMonitorTool::OnItemActivate(INT idCtrl, LPNMHDR pnmh,
|
||
|
BOOL& bHandled)
|
||
|
{
|
||
|
// Launch the tool
|
||
|
//
|
||
|
HRESULT hr = HrLaunchTool();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::OnItemChanged
|
||
|
//
|
||
|
// Purpose: When one of the items change, see if it is the focus and set
|
||
|
// the description accordingly
|
||
|
//
|
||
|
// Arguments: Standard notification messages
|
||
|
//
|
||
|
// Returns: Stadard return
|
||
|
//
|
||
|
LRESULT CPspStatusMonitorTool::OnItemChanged(INT idCtrl, LPNMHDR pnmh,
|
||
|
BOOL& bHandled)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
NMLISTVIEW* pnmlvChange = NULL;
|
||
|
|
||
|
// Cast to the right header
|
||
|
//
|
||
|
pnmlvChange = reinterpret_cast<NMLISTVIEW*>(pnmh);
|
||
|
|
||
|
// If the item now has the focus, display its description
|
||
|
//
|
||
|
if (LVIS_FOCUSED & pnmlvChange->uNewState)
|
||
|
{
|
||
|
CStatMonToolEntry* psmteItem = NULL;
|
||
|
|
||
|
psmteItem = reinterpret_cast<CStatMonToolEntry*>(pnmlvChange->lParam);
|
||
|
AssertSz(psmteItem, "We haven't got any data in changing item");
|
||
|
|
||
|
// Set the manufacturer
|
||
|
SetDlgItemText(IDC_TXT_SM_TOOL_MAN,
|
||
|
psmteItem->strManufacturer.c_str());
|
||
|
|
||
|
// Set the commandline
|
||
|
//
|
||
|
tstring strCommandLineAndFlags = psmteItem->strCommandLine;
|
||
|
tstring strFlags;
|
||
|
|
||
|
hr = HrAddAllCommandLineFlags(&strFlags, psmteItem);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
strCommandLineAndFlags.append(c_szSpace);;
|
||
|
strCommandLineAndFlags += strFlags;
|
||
|
}
|
||
|
|
||
|
SetDlgItemText(IDC_TXT_SM_TOOL_COMMAND,
|
||
|
strCommandLineAndFlags.c_str());
|
||
|
|
||
|
// Show the description
|
||
|
SetDlgItemText( IDC_TXT_SM_TOOL_DESC,
|
||
|
psmteItem->strDescription.c_str());
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::OnItemChanged", hr);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrLaunchTool
|
||
|
//
|
||
|
// Purpose: Launches the tool that is selected in the tools list
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
// Returns: Error code
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrLaunchTool(VOID)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
// We can only launch one tool at a time
|
||
|
//
|
||
|
if (1 == ListView_GetSelectedCount(m_hwndToolList))
|
||
|
{
|
||
|
INT iSelect = -1;
|
||
|
LV_ITEM lviTemp = { 0 };
|
||
|
CStatMonToolEntry* psmteSelection = NULL;
|
||
|
tstring strFlags;
|
||
|
|
||
|
//
|
||
|
// Extract the data associated with the selection.
|
||
|
//
|
||
|
|
||
|
iSelect = ListView_GetSelectionMark(m_hwndToolList);
|
||
|
AssertSz((0 <= iSelect), "I thought we were supposed to have a selection");
|
||
|
|
||
|
// Set up the data item to get back to the parameter
|
||
|
//
|
||
|
lviTemp.iItem = iSelect;
|
||
|
lviTemp.mask = LVIF_PARAM;
|
||
|
|
||
|
ListView_GetItem(m_hwndToolList, &lviTemp);
|
||
|
|
||
|
psmteSelection = reinterpret_cast<CStatMonToolEntry*>(lviTemp.lParam);
|
||
|
AssertSz(psmteSelection, "We haven't got any data in a selection");
|
||
|
|
||
|
// Get all the flags
|
||
|
//
|
||
|
hr = HrAddAllCommandLineFlags(&strFlags, psmteSelection);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
SHELLEXECUTEINFO seiTemp = { 0 };
|
||
|
|
||
|
//
|
||
|
// Fill in the data structure
|
||
|
//
|
||
|
|
||
|
seiTemp.cbSize = sizeof(SHELLEXECUTEINFO);
|
||
|
seiTemp.fMask = SEE_MASK_DOENVSUBST;
|
||
|
seiTemp.hwnd = NULL;
|
||
|
seiTemp.lpVerb = NULL;
|
||
|
seiTemp.lpFile = psmteSelection->strCommandLine.c_str();
|
||
|
seiTemp.lpParameters = strFlags.c_str();
|
||
|
seiTemp.lpDirectory = NULL;
|
||
|
seiTemp.nShow = SW_SHOW;
|
||
|
seiTemp.hInstApp = NULL;
|
||
|
seiTemp.hProcess = NULL;
|
||
|
|
||
|
// Launch the tool
|
||
|
//
|
||
|
if (!::ShellExecuteEx(&seiTemp))
|
||
|
{
|
||
|
hr = ::HrFromLastWin32Error();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrLaunchTool", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrAddAllCommandLineFlags
|
||
|
//
|
||
|
// Purpose: Adds the flags for this selection to the command line for the
|
||
|
// tool being launched. Include the private and the connection
|
||
|
// specific flags.
|
||
|
//
|
||
|
// Arguments: pstrFlags - The command line that the flags have to be
|
||
|
// appended to
|
||
|
// psmteSel - The tool entry associated with this selection
|
||
|
//
|
||
|
// Returns: Error code
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrAddAllCommandLineFlags(tstring* pstrFlags,
|
||
|
CStatMonToolEntry* psmteSel)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
//$ REVIEW : CWill : 02/24/98 : Will there be default command line flags
|
||
|
//$ REVIEW : that the user will want to have to launch the tool? If so,
|
||
|
//$ REIVEW : an entry should be added to as a REG_SZ to the tools subkey.
|
||
|
|
||
|
// Add both the commom and the conneciton specific command line flags
|
||
|
//
|
||
|
hr = HrAddCommonCommandLineFlags(pstrFlags, psmteSel);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = HrAddCommandLineFlags(pstrFlags, psmteSel);
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrAddCommandLineFlags", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPspStatusMonitorTool::HrAddCommonCommandLineFlags
|
||
|
//
|
||
|
// Purpose: Adds the flags that all types of connections share.
|
||
|
//
|
||
|
// Arguments: pstrFlags - The command line that the flags have to be
|
||
|
// appended to
|
||
|
// psmteSel - The tool entry associated with this selection
|
||
|
//
|
||
|
// Returns: Error code
|
||
|
//
|
||
|
HRESULT CPspStatusMonitorTool::HrAddCommonCommandLineFlags(tstring* pstrFlags,
|
||
|
CStatMonToolEntry* psmteSel)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD dwFlags = 0x0;
|
||
|
|
||
|
// Same some indirections
|
||
|
//
|
||
|
dwFlags = psmteSel->dwFlags;
|
||
|
|
||
|
//
|
||
|
// Check what flags are asked for and provide them if we can
|
||
|
//
|
||
|
|
||
|
if (SCLF_CONNECTION & dwFlags)
|
||
|
{
|
||
|
WCHAR achConnGuid[c_cchGuidWithTerm];
|
||
|
|
||
|
pstrFlags->append(c_szCmdLineFlagPrefix);
|
||
|
pstrFlags->append(g_asmtfMap[STFI_CONNECTION].pszFlag);
|
||
|
pstrFlags->append(c_szSpace);
|
||
|
|
||
|
// Make a GUID string
|
||
|
//
|
||
|
::StringFromGUID2 (m_guidId, achConnGuid,
|
||
|
c_cchGuidWithTerm);
|
||
|
|
||
|
pstrFlags->append(achConnGuid);
|
||
|
}
|
||
|
|
||
|
TraceError("CPspStatusMonitorTool::HrAddCommandLineFlags", hr);
|
||
|
return hr;
|
||
|
}
|