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.
366 lines
10 KiB
366 lines
10 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: L A N W I Z . C P P
|
|
//
|
|
// Contents: Implementation of the LAN wizard page
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: tongl 16 Oct 1997
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "devdatatip.h"
|
|
#include "lanwiz.h"
|
|
#include "ncsetup.h"
|
|
#include "util.h"
|
|
#include "ncui.h"
|
|
|
|
// Constructor and Destructor
|
|
CLanWizPage::CLanWizPage(IUnknown * punk)
|
|
{
|
|
Assert(punk);
|
|
m_punk = punk;
|
|
|
|
m_pnc = NULL;
|
|
m_pnccAdapter = NULL;
|
|
m_hwndList = NULL;
|
|
m_hilCheckIcons = NULL;
|
|
m_fReadOnly = FALSE;
|
|
m_hwndDataTip = NULL;
|
|
}
|
|
|
|
// Methods that set the Netcfg interfaces the dialog needs.
|
|
// Should be only by INetLanConnectionWizardUi->SetDeviceComponent
|
|
// and right before initializing the wizard dialog each time
|
|
HRESULT CLanWizPage::SetNetcfg(INetCfg * pnc)
|
|
{
|
|
Assert(pnc);
|
|
|
|
if (m_pnc)
|
|
{
|
|
// Release it
|
|
ReleaseObj(m_pnc);
|
|
}
|
|
|
|
m_pnc = pnc;
|
|
AddRefObj(pnc);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CLanWizPage::SetAdapter(INetCfgComponent * pnccAdapter)
|
|
{
|
|
Assert(pnccAdapter);
|
|
|
|
if (m_pnccAdapter)
|
|
{
|
|
// Release it
|
|
ReleaseObj(m_pnccAdapter);
|
|
}
|
|
|
|
m_pnccAdapter = pnccAdapter;
|
|
AddRefObj(pnccAdapter);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// Initialize dialog
|
|
LRESULT CLanWizPage::OnInitDialog(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
m_hwndList = GetDlgItem(IDC_LVW_COMPLIST);
|
|
|
|
m_Handles.m_hList = m_hwndList;
|
|
m_Handles.m_hAdd = GetDlgItem(IDC_PSH_ADD);
|
|
m_Handles.m_hRemove = GetDlgItem(IDC_PSH_REMOVE);
|
|
m_Handles.m_hProperty = GetDlgItem(IDC_PSH_PROPERTIES);
|
|
m_Handles.m_hDescription = GetDlgItem(IDC_TXT_COMPDESC);
|
|
|
|
// set the font of the device description: IDC_DEVICE_DESC to bold
|
|
HFONT hCurFont = (HFONT)::SendMessage(GetDlgItem(IDC_DEVICE_DESC), WM_GETFONT, 0,0);
|
|
|
|
if (hCurFont) // if not using system font
|
|
{
|
|
int cbBuffer;
|
|
cbBuffer = GetObject(hCurFont, 0, NULL);
|
|
|
|
if (cbBuffer)
|
|
{
|
|
void * lpvObject = new BYTE[cbBuffer];
|
|
|
|
if (lpvObject)
|
|
{
|
|
int nRet = GetObject(hCurFont, cbBuffer, lpvObject);
|
|
|
|
if (nRet)
|
|
{
|
|
LOGFONT * pLogFont =
|
|
reinterpret_cast<LOGFONT *>(lpvObject);
|
|
|
|
pLogFont->lfWeight = FW_BOLD;
|
|
|
|
HFONT hNewFont = CreateFontIndirect(pLogFont);
|
|
|
|
if (hNewFont)
|
|
{
|
|
::SendMessage(GetDlgItem(IDC_DEVICE_DESC), WM_SETFONT, (WPARAM)hNewFont, TRUE);
|
|
}
|
|
}
|
|
|
|
delete[] lpvObject;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Destroy dialog
|
|
LRESULT CLanWizPage::OnDestroyDialog(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
// Release netcfg interfaces, they should be reinitialized
|
|
// the next time the dialog is brought up
|
|
ReleaseObj(m_pnc);
|
|
ReleaseObj(m_pnccAdapter);
|
|
|
|
UninitListView(m_hwndList);
|
|
|
|
// Destroy our check icons
|
|
if (m_hilCheckIcons)
|
|
{
|
|
ImageList_Destroy(m_hilCheckIcons);
|
|
}
|
|
|
|
// release binding path objects and component objects we kept
|
|
ReleaseAll(m_hwndList, &m_listBindingPaths);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Wizard page notification handlers
|
|
LRESULT CLanWizPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// Fill in the adapter description
|
|
AssertSz(m_pnccAdapter, "We don't have a valid adapter!");
|
|
|
|
if (m_pnccAdapter)
|
|
{
|
|
PWSTR pszwDeviceName;
|
|
|
|
hr = m_pnccAdapter->GetDisplayName(&pszwDeviceName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
SetDlgItemText(IDC_DEVICE_DESC, pszwDeviceName);
|
|
|
|
CoTaskMemFree(pszwDeviceName);
|
|
}
|
|
|
|
// Create a data tip for the device to display location
|
|
// info and MAc address.
|
|
//
|
|
PWSTR pszDevNodeId = NULL;
|
|
PWSTR pszBindName = NULL;
|
|
|
|
// Get the pnp instance id of the device.
|
|
(VOID) m_pnccAdapter->GetPnpDevNodeId (&pszDevNodeId);
|
|
|
|
// Get the device's bind name
|
|
(VOID) m_pnccAdapter->GetBindName (&pszBindName);
|
|
|
|
// Create the tip and associate it with the description control.
|
|
// Note if the tip was already created, then only the text
|
|
// will be modified.
|
|
//
|
|
CreateDeviceDataTip (m_hWnd, &m_hwndDataTip, IDC_DEVICE_DESC,
|
|
pszDevNodeId, pszBindName);
|
|
|
|
CoTaskMemFree (pszDevNodeId);
|
|
CoTaskMemFree (pszBindName);
|
|
}
|
|
|
|
// refresh the listview for the new adapter
|
|
// Now setup the BindingPathObj collection and List view
|
|
hr = HrInitListView(m_hwndList, m_pnc, m_pnccAdapter,
|
|
&m_listBindingPaths, &m_hilCheckIcons);
|
|
|
|
// now set the buttons
|
|
LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk);
|
|
|
|
::PostMessage(::GetParent(m_hWnd),
|
|
PSM_SETWIZBUTTONS,
|
|
(WPARAM)0,
|
|
(LPARAM)(PSWIZB_BACK | PSWIZB_NEXT));
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
BOOL fError;
|
|
|
|
fError = FValidatePageContents( m_hWnd,
|
|
m_Handles.m_hList,
|
|
m_pnc,
|
|
m_pnccAdapter,
|
|
&m_listBindingPaths
|
|
);
|
|
|
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, fError);
|
|
return fError;
|
|
}
|
|
|
|
// Push button handlers
|
|
LRESULT CLanWizPage::OnAdd(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// $REVIEW(tongl 1/7/99): We can't let user do anything till this
|
|
// is returned (Raid #258690)
|
|
|
|
// disable all buttons on this dialog
|
|
static const int nrgIdc[] = {IDC_PSB_Add,
|
|
IDC_PSB_Remove,
|
|
IDC_PSB_Properties};
|
|
|
|
EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE);
|
|
|
|
// disable wizard buttons till we are done
|
|
::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, 0);
|
|
|
|
hr = HrLvAdd(m_hwndList, m_hWnd, m_pnc, m_pnccAdapter, &m_listBindingPaths);
|
|
|
|
// Reset the buttons and the description text based on the changed selection
|
|
LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk);
|
|
|
|
::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, (LPARAM)(PSWIZB_NEXT | PSWIZB_BACK));
|
|
|
|
TraceError("CLanWizPage::OnAdd", hr);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnRemove(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// $REVIEW(tongl 1/7/99): We can't let user do anything till this
|
|
// is returned (Raid #258690)
|
|
|
|
// disable all buttons on this dialog
|
|
static const int nrgIdc[] = {IDC_PSB_Add,
|
|
IDC_PSB_Remove,
|
|
IDC_PSB_Properties};
|
|
|
|
EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE);
|
|
|
|
hr = HrLvRemove(m_hwndList, m_hWnd, m_pnc, m_pnccAdapter,
|
|
&m_listBindingPaths);
|
|
|
|
if (NETCFG_S_REBOOT == hr)
|
|
{
|
|
// tell the user the component they removed cannot be re-added until
|
|
// setup completes
|
|
//$REVIEW - scottbri - Notifing the user maybe optional,
|
|
//$REVIEW as little can be done on their part
|
|
}
|
|
|
|
// Reset the buttons and the description text based on the changed selection
|
|
LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk);
|
|
|
|
TraceError("CLanWizPage::OnRemove", hr);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnProperties(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// $REVIEW(tongl 1/7/99): We can't let user do anything till this
|
|
// is returned (Raid #258690)
|
|
|
|
// disable all buttons on this dialog
|
|
static const int nrgIdc[] = {IDC_PSB_Add,
|
|
IDC_PSB_Remove,
|
|
IDC_PSB_Properties};
|
|
|
|
EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE);
|
|
|
|
// disable wizard buttons till we are done
|
|
::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, 0);
|
|
|
|
hr = HrLvProperties(m_hwndList, m_hWnd, m_pnc, m_punk,
|
|
m_pnccAdapter, &m_listBindingPaths, NULL);
|
|
|
|
// Reset the buttons and the description text based on the changed selection
|
|
LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk);
|
|
|
|
::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, (LPARAM)(PSWIZB_NEXT | PSWIZB_BACK));
|
|
|
|
TraceError("CLanWizPage::OnProperties", hr);
|
|
return 0;
|
|
}
|
|
|
|
// List view handlers
|
|
LRESULT CLanWizPage::OnClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
if (idCtrl == IDC_LVW_COMPLIST)
|
|
{
|
|
OnListClick(m_hwndList, m_hWnd, m_pnc, m_punk,
|
|
m_pnccAdapter, &m_listBindingPaths, FALSE);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnDbClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
if (idCtrl == IDC_LVW_COMPLIST)
|
|
{
|
|
// If we're in read-only mode, treat a double click as a single click
|
|
//
|
|
OnListClick(m_hwndList, m_hWnd, m_pnc, m_punk,
|
|
m_pnccAdapter, &m_listBindingPaths, !m_fReadOnly);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnKeyDown(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
if (idCtrl == IDC_LVW_COMPLIST)
|
|
{
|
|
LV_KEYDOWN* plvkd = (LV_KEYDOWN*)pnmh;
|
|
OnListKeyDown(m_hwndList, &m_listBindingPaths, plvkd->wVKey);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
|
{
|
|
// Reset the buttons and the description text based on the changed selection
|
|
LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk);
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CLanWizPage::OnDeleteItem(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
|
|
{
|
|
NM_LISTVIEW * pnmlv = reinterpret_cast<NM_LISTVIEW *>(pnmh);
|
|
LvDeleteItem(m_hwndList, pnmlv->iItem);
|
|
|
|
return 0;
|
|
}
|
|
|