windows-nt/Source/XPSP1/NT/net/config/shell/advcfg/acbind.h
2020-09-26 16:20:57 +08:00

328 lines
9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: A D V C F G P . H
//
// Contents: Private header for Advanced Configuration dialog
//
// Notes:
//
// Author: danielwe 20 Nov 1997
//
//----------------------------------------------------------------------------
#pragma once
#include "nsbase.h"
#include "ncatlps.h"
#include "netcfgx.h"
#include "resource.h"
//
// image state entries
//
enum SELS_MASKS
{
SELS_CHECKED = 0x1,
SELS_UNCHECKED = 0x2,
SELS_FIXEDBINDING_DISABLED = 0x3,
SELS_FIXEDBINDING_ENABLED = 0x4,
};
enum MAB_DIRECTION
{
MAB_UP = 1,
MAB_DOWN = 2,
};
class CSortableBindPath;
typedef list<CSortableBindPath> SBP_LIST;
enum ASSOCIATE_FLAGS
{
ASSCF_ON_ENABLE = 0x1,
ASSCF_ON_DISABLE = 0x2,
ASSCF_ANCESTORS = 0x8,
};
struct BIND_PATH_INFO
{
INetCfgBindingPath * pncbp;
DWORD dwLength;
};
typedef list<BIND_PATH_INFO *> BPIP_LIST;
typedef list<INetCfgComponent *> NCC_LIST;
typedef list<INetCfgBindingPath *> NCBP_LIST;
struct TREE_ITEM_DATA
{
INetCfgComponent * pncc;
BPIP_LIST listbpipOnEnable;
BPIP_LIST listbpipOnDisable;
BOOL fOrdered;
};
struct HTREEITEMP
{
HTREEITEM hti;
};
typedef list<HTREEITEMP> HTI_LIST;
//
// CBindingsDlg
//
class CBindingsDlg: public CPropSheetPage
{
BEGIN_MSG_MAP(CBindingsDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_HELP, OnHelp)
NOTIFY_CODE_HANDLER(PSN_APPLY, OnOk)
COMMAND_ID_HANDLER(PSB_Adapter_Up, OnAdapterUp)
COMMAND_ID_HANDLER(PSB_Adapter_Down, OnAdapterDown)
COMMAND_ID_HANDLER(PSB_Binding_Up, OnBindingUp)
COMMAND_ID_HANDLER(PSB_Binding_Down, OnBindingDown)
NOTIFY_CODE_HANDLER(TVN_DELETEITEM, OnTreeDeleteItem)
NOTIFY_CODE_HANDLER(TVN_KEYDOWN, OnTreeKeyDown)
NOTIFY_CODE_HANDLER(TVN_ITEMEXPANDING, OnTreeItemExpanding)
NOTIFY_CODE_HANDLER(TVN_SELCHANGED, OnTreeItemChanged)
NOTIFY_CODE_HANDLER(LVN_DELETEITEM, OnListDeleteItem)
NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED, OnListItemChanged)
NOTIFY_CODE_HANDLER(NM_DBLCLK, OnDoubleClick)
NOTIFY_CODE_HANDLER(NM_CLICK, OnClick)
END_MSG_MAP()
enum {IDD = IDD_Advanced_Config};
CBindingsDlg(INetCfg *pnc)
{
AddRefObj(m_pnc = pnc);
m_hiconUpArrow = NULL;
m_hiconDownArrow = NULL;
m_iItemSel = -1;
m_hilItemIcons = NULL;
m_hilCheckIcons = NULL;
m_fWanBindingsFirst = FALSE;
}
~CBindingsDlg();
BOOL FShowPage()
{
return TRUE;
}
private:
INetCfg * m_pnc;
HWND m_hwndLV;
HWND m_hwndTV;
HICON m_hiconUpArrow;
HICON m_hiconDownArrow;
HIMAGELIST m_hilItemIcons;
HIMAGELIST m_hilCheckIcons;
INT m_iItemSel;
BOOL m_fWanBindingsFirst;
INT m_nIndexLan;
//
// Message handlers
//
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled);
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled);
LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
LRESULT OnAdapterUp(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL& bHandled);
LRESULT OnAdapterDown(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL& bHandled);
LRESULT OnBindingUp(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL& bHandled);
LRESULT OnBindingDown(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL& bHandled);
VOID OnAdapterUpDown(BOOL fUp);
LRESULT OnListItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
LRESULT OnTreeItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
LRESULT OnTreeDeleteItem(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
LRESULT OnListDeleteItem(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
LRESULT OnTreeItemExpanding(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
LRESULT OnTreeKeyDown(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
LRESULT OnClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
LRESULT OnDoubleClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled);
//
// Adapter list functions
//
VOID OnAdapterChange(INT iItem);
HRESULT HrBuildAdapterList(VOID);
HRESULT HrGetAdapters(INetCfgComponent *pncc, NCC_LIST *plistNcc);
VOID SetAdapterButtons();
VOID AddListViewItem(INetCfgComponent *pncc, INT ipos, INT nIndex,
PCWSTR pszConnName);
BOOL FIsWanBinding(INT iItem);
VOID GetWanOrdering(VOID);
VOID SetWanOrdering(VOID);
//
// Bindings tree functions
//
VOID SetCheckboxStates(VOID);
VOID ToggleCheckbox(HTREEITEM hti);
VOID OnBindingUpDown(BOOL fUp);
HRESULT HrOrderSubItems(VOID);
HRESULT HrOrderDisableLists(VOID);
HRESULT HrOrderDisableList(TREE_ITEM_DATA *ptid);
HTREEITEM HtiMoveTreeItemAfter(HTREEITEM htiParent, HTREEITEM htiDest,
HTREEITEM htiSrc);
VOID BuildBindingsList(INetCfgComponent *pncc);
HRESULT HrHandleSubpath(SBP_LIST &listsbp, INetCfgBindingPath *pncbpSub);
HRESULT HrHandleSubItem(INetCfgBindingPath *pncbpThis,
INetCfgBindingPath *pncbpMatch,
TREE_ITEM_DATA *ptid,
HTREEITEM htiMatchItem);
HRESULT HrHandleValidSubItem(INetCfgBindingPath *pncbpThis,
INetCfgBindingPath *pncbpMatch,
INetCfgComponent *pnccThisOwner,
HTREEITEM htiMatchItem,
TREE_ITEM_DATA *ptid);
HRESULT HrHandleTopLevel(INetCfgBindingPath *pncbpSub);
HRESULT HrComponentIsHidden(INetCfgBindingPath *pncbp, DWORD iComp);
HTREEITEM HtiAddTreeViewItem(INetCfgComponent * pnccOwner,
HTREEITEM htiParent);
VOID AssociateBinding(INetCfgBindingPath *pncbpThis, HTREEITEM hti,
DWORD dwFlags);
HTREEITEM HtiIsSubItem(INetCfgComponent *pncc, HTREEITEM hti);
VOID MoveAdapterBindings(INetCfgComponent *pnccSrc,
INetCfgComponent *pnccDst,
MAB_DIRECTION mabDir);
LRESULT OnClickOrDoubleClick(int idCtrl, LPNMHDR pnmh, BOOL fDoubleClick);
};
DWORD
GetDepthSpecialCase (
INetCfgBindingPath* pPath);
class CSortableBindPath
{
public:
CSortableBindPath()
{
AssertSzH(FALSE,"Don't use this constructor!");
}
CSortableBindPath(INetCfgBindingPath *pncbp)
{
m_pncbp = pncbp;
}
bool operator<(const CSortableBindPath &refsbp) const;
VOID GetDepth(DWORD *pdwDepth) const
{
*pdwDepth = GetDepthSpecialCase (m_pncbp);
}
INetCfgBindingPath *GetPath() const
{
return m_pncbp;
}
private:
INetCfgBindingPath * m_pncbp;
};
class CIterTreeView
{
public:
CIterTreeView(HWND hwndTV)
{
m_hwndTV = hwndTV;
Reset();
}
HTREEITEM HtiNext();
VOID Reset()
{
HTREEITEM hti;
EraseAndDeleteAll();
hti = TreeView_GetRoot(m_hwndTV);
if (hti)
{
HTREEITEMP htip = {hti};
m_stackHti.push_front(htip);
}
}
HTREEITEM Front()
{
HTREEITEMP htip;
if (m_stackHti.empty())
{
return NULL;
}
htip = m_stackHti.front();
return htip.hti;
}
VOID PopAndDelete()
{
m_stackHti.pop_front();
}
VOID PushAndAlloc(HTREEITEM hti)
{
AssertSzH(hti, "Pushing NULL? Shame on you!");
HTREEITEMP htip = {hti};
m_stackHti.push_front(htip);
}
VOID EraseAndDeleteAll()
{
while (!m_stackHti.empty())
{
PopAndDelete();
}
}
private:
HWND m_hwndTV;
HTI_LIST m_stackHti;
};
BOOL FIsHidden(INetCfgComponent *pncc);
BOOL FDontExposeLower(INetCfgComponent *pncc);
VOID AddToListIfNotAlreadyAdded(BPIP_LIST &bpipList, BIND_PATH_INFO *pbpi);
VOID FreeBindPathInfoList(BPIP_LIST &listbpip);
HRESULT HrCountDontExposeLower(INetCfgBindingPath *pncbp, DWORD *pcItems);
BOOL FEqualComponents(INetCfgComponent *pnccA, INetCfgComponent *pnccB);
VOID ChangeTreeItemParam(HWND hwndTV, HTREEITEM hitem, LPARAM lparam);
BIND_PATH_INFO *BpiFindBindPathInList(INetCfgBindingPath *pncbp,
BPIP_LIST &listBpip);
VOID ChangeListItemParam(HWND hwndLV, INT iItem, LPARAM lParam);
#ifdef ENABLETRACE
VOID DbgDumpBindPath(INetCfgBindingPath *pncbp);
VOID DbgDumpTreeViewItem(HWND hwndTV, HTREEITEM hti);
#else
#define DbgDumpBindPath(x)
#define DbgDumpTreeViewItem(x,y)
#endif