windows-nt/Source/XPSP1/NT/net/mmc/rtrlib/add.cpp
2020-09-26 16:20:57 +08:00

1024 lines
30 KiB
C++

//============================================================================
// Copyright (C) 1996, Microsoft Corp.
//
// File: add.cpp
//
// History:
// Abolade-Gbadegesin Mar-15-1996 Created
//
// Contains implementation for dialogs listing components for addition
// to the router. All of the dialogs consists of a listview and two buttons,
// labelled "OK" and "Cancel".
//============================================================================
#include "stdafx.h"
#include "rtrres.h" // RTRLIB resource header
#include "info.h"
#include "dialog.h" // common code dialog class
#include "add.h"
#include "rtrui.h" // common router UI utility functions
#include "rtrstr.h" // common router strings
#include "mprapi.h"
#include "rtrcomn.h" // common router utilities
#include "format.h"
#include "rtrutil.h" // for smart pointers
#include "routprot.h" // routing protocol IDs
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//----------------------------------------------------------------------------
// Class: CRmAddInterface
//
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Function: CRmAddInterface::DoDataExchange
//----------------------------------------------------------------------------
CRmAddInterface::~CRmAddInterface()
{
while (!m_pIfList.IsEmpty())
{
m_pIfList.RemoveTail()->Release();
}
}
VOID
CRmAddInterface::DoDataExchange(
CDataExchange* pDX
) {
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRmAddInterface)
DDX_Control(pDX, IDC_ADD_LIST, m_listCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRmAddInterface, CBaseDialog)
//{{AFX_MSG_MAP(CRmAddInterface)
ON_NOTIFY(NM_DBLCLK, IDC_ADD_LIST, OnDblclkListctrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
DWORD CRmAddInterface::m_dwHelpMap[] =
{
// IDC_ADD_PROMPT, HIDC_ADD_PROMPT,
// IDC_ADD_LISTTITLE, HIDC_ADD_LISTTITLE,
// IDC_ADD_LISTCTRL, HIDC_ADD_LISTCTRL,
0,0
};
//----------------------------------------------------------------------------
// Function: CRmAddInterface::OnInitDialog
//----------------------------------------------------------------------------
BOOL
CRmAddInterface::OnInitDialog(
) {
CBaseDialog::OnInitDialog();
//
// Set the window title, the list-title, prompt-text, and icon.
//
HICON hIcon;
CString sItem;
CStringList stIpxIfList;
DWORD dwIfType;
InterfaceCB ifcb;
sItem.FormatMessage(IDS_SELECT_INTERFACE_FOR, m_spRtrMgrInfo->GetTitle());
SetWindowText(sItem);
sItem.LoadString(IDS_ADD_INTERFACES);
SetDlgItemText(IDC_ADD_TEXT_TITLE, sItem);
sItem.LoadString(IDS_CLICK_RMINTERFACE);
SetDlgItemText(IDC_ADD_TEXT_PROMPT, sItem);
//
// Set the list-view's imagelist
//
CreateRtrLibImageList(&m_imageList);
m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL);
ListView_SetExtendedListViewStyle(m_listCtrl.m_hWnd, LVS_EX_FULLROWSELECT);
//
// Insert the single column in the listview
//
RECT rc;
m_listCtrl.GetClientRect(&rc);
rc.right -= ::GetSystemMetrics(SM_CXVSCROLL);
m_listCtrl.InsertColumn(0, c_szEmpty, LVCFMT_LEFT, rc.right);
//
// Get a list of the interfaces available
//
SPIEnumInterfaceInfo spEnumIf;
SPIInterfaceInfo spIf;
DWORD dwTransportId;
m_spRouterInfo->EnumInterface(&spEnumIf);
dwTransportId = m_spRtrMgrInfo->GetTransportId();
// Make an initial pass to look for the IPX interfaces
if (dwTransportId == PID_IPX)
{
CString stBaseId;
int iPos;
for (; spEnumIf->Next(1, &spIf, NULL) == hrOK; spIf.Release())
{
if ((iPos = IfInterfaceIdHasIpxExtensions((LPCTSTR) spIf->GetId())))
{
// We've found one, add the base Id (w/o) the extension
// to the stIpxIfList
stBaseId = spIf->GetId();
// Cut off the IPX extension
stBaseId.SetAt(iPos, 0);
// If it's NOT in the list, add it
if (!stIpxIfList.Find(stBaseId))
stIpxIfList.AddTail(stBaseId);
}
}
spEnumIf->Reset();
}
for (; spEnumIf->Next(1, &spIf, NULL) == hrOK ; spIf.Release())
{
//
// Windows NT Bugs 103770
//
// We will need to filter out the interfaces depending on
// the transport. If IP, filter out the IPX frame types.
if (dwTransportId != PID_IPX)
{
// If we found one of these IPX interfaces, skip it
if (IfInterfaceIdHasIpxExtensions((LPCTSTR) spIf->GetId()))
continue;
}
else
{
// If we are in IPX we should make sure that if these
// interfaces exist in the list (already) than we need
// to get rid of the general interface.
if (stIpxIfList.Find(spIf->GetId()))
continue;
}
dwIfType = spIf->GetInterfaceType();
// If the interface is already added or is an internal
// interface, continue
if ((dwIfType == ROUTER_IF_TYPE_INTERNAL) ||
(dwIfType == ROUTER_IF_TYPE_HOME_ROUTER))
continue;
// IPX should not show loopback or tunnel interfaces
if ((dwTransportId == PID_IPX) &&
((dwIfType == ROUTER_IF_TYPE_LOOPBACK) ||
(dwIfType == ROUTER_IF_TYPE_TUNNEL1) ))
continue;
if (spIf->FindRtrMgrInterface(dwTransportId, NULL) == hrOK)
continue;
// Windows NT Bug : 273424
// check the bind state of the adapter.
// ------------------------------------------------------------
spIf->CopyCB(&ifcb);
// If we are adding to IP and IP is not bound, continue.
// ------------------------------------------------------------
if ((dwTransportId == PID_IP) && !(ifcb.dwBindFlags & InterfaceCB_BindToIp))
continue;
// Similarly for IPX
// ------------------------------------------------------------
if ((dwTransportId == PID_IPX) && !(ifcb.dwBindFlags & InterfaceCB_BindToIpx))
continue;
//
// Insert a list-item for the interface
//
// We need to ensure that the interface is live.
m_pIfList.AddTail(spIf);
spIf->AddRef();
m_listCtrl.InsertItem(
LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE,
0,
spIf->GetTitle(),
0,
0,
spIf->GetInterfaceType() == (DWORD)ROUTER_IF_TYPE_DEDICATED ?
ILI_RTRLIB_NETCARD
: ILI_RTRLIB_MODEM,
(LPARAM) (IInterfaceInfo *) spIf
);
}
//
// If there are no items, explain this and end the dialog
//
if (!m_listCtrl.GetItemCount())
{
::AfxMessageBox(IDS_ERR_NOINTERFACES, MB_OK|MB_ICONINFORMATION);
OnCancel(); return FALSE;
}
//
// Select the first item
//
m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
return TRUE;
}
//----------------------------------------------------------------------------
// Function: CRmAddInterface::OnDblclkListctrl
//----------------------------------------------------------------------------
VOID
CRmAddInterface::OnDblclkListctrl(
NMHDR* pNMHDR,
LRESULT* pResult
) {
OnOK();
*pResult = 0;
}
//----------------------------------------------------------------------------
// Function: CRmAddInterface::OnOK
//----------------------------------------------------------------------------
VOID
CRmAddInterface::OnOK(
) {
//
// Get the currently selected item
//
INT iSel = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);
if (iSel == -1) { return; }
//
// Get the item's data, which is a IInterfaceInfo pointer
//
IInterfaceInfo *pIf = (IInterfaceInfo *) m_listCtrl.GetItemData(iSel);
//
// Construct a new CRmInterfaceInfo object
//
CreateRtrMgrInterfaceInfo(m_ppRtrMgrInterfaceInfo,
m_spRtrMgrInfo->GetId(),
m_spRtrMgrInfo->GetTransportId(),
pIf->GetId(),
pIf->GetInterfaceType()
);
if (!*m_ppRtrMgrInterfaceInfo) { OnCancel(); return; }
(*m_ppRtrMgrInterfaceInfo)->SetTitle(pIf->GetTitle());
(*m_ppRtrMgrInterfaceInfo)->SetMachineName(m_spRouterInfo->GetMachineName());
CBaseDialog::OnOK();
}
//----------------------------------------------------------------------------
// Class: CRpAddInterface
//
//----------------------------------------------------------------------------
CRpAddInterface::CRpAddInterface(IRouterInfo *pRouterInfo,
IRtrMgrProtocolInfo *pRmProt,
IRtrMgrProtocolInterfaceInfo **ppRmProtIf,
CWnd *pParent)
: CBaseDialog(CRpAddInterface::IDD, pParent)
{
m_spRouterInfo.Set(pRouterInfo);
m_spRmProt.Set(pRmProt);
m_ppRmProtIf = ppRmProtIf;
}
CRpAddInterface::~CRpAddInterface()
{
while (!m_pIfList.IsEmpty())
{
m_pIfList.RemoveTail()->Release();
}
}
//----------------------------------------------------------------------------
// Function: CRpAddInterface::DoDataExchange
//----------------------------------------------------------------------------
VOID
CRpAddInterface::DoDataExchange(
CDataExchange* pDX
) {
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRpAddInterface)
DDX_Control(pDX, IDC_ADD_LIST, m_listCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRpAddInterface, CBaseDialog)
//{{AFX_MSG_MAP(CRpAddInterface)
ON_NOTIFY(NM_DBLCLK, IDC_ADD_LIST, OnDblclkListctrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
DWORD CRpAddInterface::m_dwHelpMap[] =
{
// IDC_ADD_PROMPT, HIDC_ADD_PROMPT,
// IDC_ADD_LISTTITLE, HIDC_ADD_LISTTITLE,
// IDC_ADD_LISTCTRL, HIDC_ADD_LISTCTRL,
0,0
};
//----------------------------------------------------------------------------
// Function: CRpAddInterface::OnInitDialog
//----------------------------------------------------------------------------
BOOL
CRpAddInterface::OnInitDialog(
) {
SPIEnumInterfaceInfo spEnumIf;
SPIInterfaceInfo spIf;
HRESULT hr = hrOK;
DWORD dwIfType;
DWORD dwProtocolId;
UINT idi;
CBaseDialog::OnInitDialog();
//
// Set the window title, the list-title, prompt-text, and icon.
//
HICON hIcon;
CString sItem;
// increase the deafault buffer size (128) first to accomodate
// longer strings
sItem.GetBuffer(512);
sItem.ReleaseBuffer();
// display the protocol name in the window title
sItem.FormatMessage(IDS_SELECT_INTERFACE_FOR, m_spRmProt->GetTitle());
SetWindowText(sItem);
sItem.LoadString(IDS_ADD_INTERFACES);
SetDlgItemText(IDC_ADD_TEXT_TITLE, sItem);
sItem.LoadString(IDS_CLICK_RPINTERFACE);
SetDlgItemText(IDC_ADD_TEXT_PROMPT, sItem);
//
// Set the imagelist for the listview
//
CreateRtrLibImageList(&m_imageList);
m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL);
ListView_SetExtendedListViewStyle(m_listCtrl.m_hWnd, LVS_EX_FULLROWSELECT);
//
// Insert the single column in the listview
//
RECT rc;
m_listCtrl.GetClientRect(&rc);
rc.right -= ::GetSystemMetrics(SM_CXVSCROLL);
m_listCtrl.InsertColumn(0, c_szEmpty, LVCFMT_LEFT, rc.right);
//
// Get a list of the interfaces available on our router-manager
//
m_spRouterInfo->EnumInterface(&spEnumIf);
for ( ; spEnumIf->Next(1, &spIf, NULL) == hrOK; spIf.Release())
{
dwIfType = spIf->GetInterfaceType();
//
// Only allow if this is not a loopback interface
//
if ((dwIfType == ROUTER_IF_TYPE_LOOPBACK) ||
(dwIfType == ROUTER_IF_TYPE_HOME_ROUTER))
continue;
// Get the protocol id
dwProtocolId = m_spRmProt->GetProtocolId();
//
// The only protocols that we can add the internal interface
// to are BOOTP and IGMP.
//
if (dwIfType == ROUTER_IF_TYPE_INTERNAL)
{
if ((dwProtocolId != MS_IP_BOOTP) &&
(dwProtocolId != MS_IP_IGMP) &&
(dwProtocolId != MS_IP_NAT))
continue;
}
//
// Only list adapters which have IP
//
if (spIf->FindRtrMgrInterface(PID_IP, NULL) != hrOK)
continue;
// Windows NT Bug : 234696
// Tunnels can only be added to IGMP
if (dwIfType == ROUTER_IF_TYPE_TUNNEL1)
{
if (dwProtocolId != MS_IP_IGMP)
continue;
}
//
// Fill the list with the adapters which haven't been added already
//
CORg( LookupRtrMgrProtocolInterface(spIf,
m_spRmProt->GetTransportId(),
m_spRmProt->GetProtocolId(),
NULL));
// This interface has this protocol, so try the next interface
if (FHrOk(hr))
continue;
Assert(hr == hrFalse);
//
// Insert a list-item for the protocol
//
m_pIfList.AddTail(spIf);
spIf->AddRef();
if (!IsWanInterface(dwIfType))
idi = ILI_RTRLIB_NETCARD;
else
idi = ILI_RTRLIB_MODEM;
m_listCtrl.InsertItem(
LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE, 0, spIf->GetTitle(), 0, 0,
idi, (LPARAM)(IInterfaceInfo *) spIf);
}
//
// If there are no items, explain this and end the dialog
//
if (!m_listCtrl.GetItemCount()) {
::AfxMessageBox(IDS_ERR_NOINTERFACES, MB_OK|MB_ICONINFORMATION);
OnCancel(); return FALSE;
}
//
// Select the first item
//
m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
Error:
return TRUE;
}
//----------------------------------------------------------------------------
// Function: CRpAddInterface::OnDblclkListctrl
//----------------------------------------------------------------------------
VOID
CRpAddInterface::OnDblclkListctrl(
NMHDR* pNMHDR,
LRESULT* pResult
) {
OnOK();
*pResult = 0;
}
//----------------------------------------------------------------------------
// Function: CRpAddInterface::OnOK
//----------------------------------------------------------------------------
VOID
CRpAddInterface::OnOK(
) {
//
// Get the currently selected item
//
INT iSel = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);
if (iSel == -1) { return; }
//
// Get the item's data, which is a CInterfaceInfo pointer
//
IInterfaceInfo *pIf = (IInterfaceInfo *)m_listCtrl.GetItemData(iSel);
//
// Construct a new CRmProtInterfaceInfo object
//
RtrMgrProtocolInterfaceCB RmProtIfCB;
RtrMgrProtocolCB RmProtCB;
m_spRmProt->CopyCB(&RmProtCB);
RmProtIfCB.dwProtocolId = RmProtCB.dwProtocolId;
StrnCpyW(RmProtIfCB.szId, RmProtCB.szId, RTR_ID_MAX);
RmProtIfCB.dwTransportId = RmProtCB.dwTransportId;
StrnCpyW(RmProtIfCB.szRtrMgrId, RmProtCB.szRtrMgrId, RTR_ID_MAX);
StrnCpyW(RmProtIfCB.szInterfaceId, pIf->GetId(), RTR_ID_MAX);
RmProtIfCB.dwIfType = pIf->GetInterfaceType();
RmProtIfCB.szTitle[0] = 0;
CreateRtrMgrProtocolInterfaceInfo(m_ppRmProtIf,
&RmProtIfCB);
if (!*m_ppRmProtIf) { OnCancel(); return; }
(*m_ppRmProtIf)->SetTitle(pIf->GetTitle());
CBaseDialog::OnOK();
}
//----------------------------------------------------------------------------
// Class: CAddRoutingProtocol
//
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Function: CAddRoutingProtocol::~CAddRoutingProtocol
//----------------------------------------------------------------------------
CAddRoutingProtocol::~CAddRoutingProtocol(
)
{
}
//----------------------------------------------------------------------------
// Function: CAddRoutingProtocol::DoDataExchange
//----------------------------------------------------------------------------
VOID
CAddRoutingProtocol::DoDataExchange(
CDataExchange* pDX
) {
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddRoutingProtocol)
DDX_Control(pDX, IDC_ADD_LIST, m_listCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAddRoutingProtocol, CBaseDialog)
//{{AFX_MSG_MAP(CAddRoutingProtocol)
ON_NOTIFY(NM_DBLCLK, IDC_ADD_LIST, OnDblclkListctrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// This should be merged with all of the other IDD_ADD dialogs but we
// could actually add different help topics here, so I'll leave them
// separated.
DWORD CAddRoutingProtocol::m_dwHelpMap[] =
{
// IDC_ADD_PROMPT, HIDC_ADD_PROMPT,
// IDC_ADD_LISTTITLE, HIDC_ADD_LISTTITLE,
// IDC_ADD_LISTCTRL, HIDC_ADD_LISTCTRL,
0,0
};
//----------------------------------------------------------------------------
// Function: CAddRoutingProtocol::OnInitDialog
//----------------------------------------------------------------------------
BOOL
CAddRoutingProtocol::OnInitDialog(
) {
CBaseDialog::OnInitDialog();
//
// Set the window title, the list-title, prompt-text, and icon.
//
HICON hIcon;
CString sItem;
SPIEnumRtrMgrProtocolCB spEnumRmProtCB;
RtrMgrProtocolCB rmprotCB;
sItem.LoadString(IDS_SELECT_PROTOCOL);
SetWindowText(sItem);
sItem.LoadString(IDS_ADD_PROTOCOL);
SetDlgItemText(IDC_ADD_TEXT_TITLE, sItem);
sItem.LoadString(IDS_CLICK_PROTOCOL);
SetDlgItemText(IDC_ADD_TEXT_PROMPT, sItem);
//
// Set the list-view's imagelist
//
CreateRtrLibImageList(&m_imageList);
m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL);
ListView_SetExtendedListViewStyle(m_listCtrl.m_hWnd, LVS_EX_FULLROWSELECT);
//
// Insert the single column in the listview
//
RECT rc;
m_listCtrl.GetClientRect(&rc);
rc.right -= ::GetSystemMetrics(SM_CXVSCROLL);
m_listCtrl.InsertColumn(0, c_szEmpty, LVCFMT_LEFT, rc.right);
//
// Get a list of the routing-protocols available for this router-manager
//
m_spRouter->EnumRtrMgrProtocolCB(&spEnumRmProtCB);
while (spEnumRmProtCB->Next(1, &rmprotCB, NULL) == hrOK)
{
//
// Fill the list with the protocols that aren't already added
//
// If this is the wrong mgr, skip it
if (m_spRm->GetTransportId() != rmprotCB.dwTransportId)
continue;
// If the protocol is hidden, don't show it
if (rmprotCB.dwFlags & RtrMgrProtocolCBFlagHidden)
continue;
//
// If the protocol is already added, continue
//
if (m_spRm->FindRtrMgrProtocol(rmprotCB.dwProtocolId, NULL) == hrOK)
continue;
//
// Insert a list-item for the protocol
//
m_listCtrl.InsertItem(
LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE, 0, (LPCTSTR)rmprotCB.szTitle,
0, 0, ILI_RTRLIB_PROTOCOL, (LPARAM) rmprotCB.dwProtocolId
);
}
//
// If there are no items, explain this and end the dialog
//
if (!m_listCtrl.GetItemCount()) {
::AfxMessageBox(IDS_ERR_NOROUTINGPROTOCOLS, MB_OK|MB_ICONINFORMATION);
OnCancel(); return FALSE;
}
//
// Select the first item
//
m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
return TRUE;
}
//----------------------------------------------------------------------------
// Function: CAddRoutingProtocol::OnDblclkListctrl
//----------------------------------------------------------------------------
VOID
CAddRoutingProtocol::OnDblclkListctrl(
NMHDR* pNMHDR,
LRESULT* pResult
) {
OnOK();
*pResult = 0;
}
//----------------------------------------------------------------------------
// Function: CAddRoutingProtocol::OnOK
//----------------------------------------------------------------------------
VOID
CAddRoutingProtocol::OnOK(
) {
SPIEnumRtrMgrProtocolCB spEnumRmProtCB;
RtrMgrProtocolCB rmprotCB;
RtrMgrProtocolCB oldrmprotCB;
SPIEnumRtrMgrProtocolInfo spEnumRmProt;
SPIRtrMgrProtocolInfo spRmProt;
DWORD_PTR dwData;
HRESULT hr = hrOK;
CString stFormat;
SPIRtrMgrProtocolInfo spRmProtReturn;
//
// Get the currently selected item
// ----------------------------------------------------------------
INT iSel = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);
if (iSel == -1) { return; }
// Retrieve its data, which is the protocol ID
// ----------------------------------------------------------------
// Look up the protocol ID in the protocol list
// ----------------------------------------------------------------
m_spRouter->EnumRtrMgrProtocolCB(&spEnumRmProtCB);
dwData = (DWORD)(m_listCtrl.GetItemData(iSel));
// Construct a routing-protocol item
// ----------------------------------------------------------------
while (spEnumRmProtCB->Next(1, &rmprotCB, NULL) == hrOK)
{
if (rmprotCB.dwProtocolId == dwData)
{
hr = CreateRtrMgrProtocolInfo(&spRmProtReturn,
&rmprotCB);
if (!FHrSucceeded(hr))
{
OnCancel();
return;
}
break;
}
}
// What happens if we can't find the matching item
// ----------------------------------------------------------------
if (spRmProtReturn == NULL)
{
//$ Todo: what error message do we want to put up here?
// ------------------------------------------------------------
return;
}
// Now check to see if there are any protocol conflicts
// ----------------------------------------------------------------
stFormat.LoadString(IDS_WARN_ADD_PROTOCOL_CONFLICT);
m_spRm->EnumRtrMgrProtocol(&spEnumRmProt);
for (;spEnumRmProt->Next(1, &spRmProt, NULL) == hrOK; spRmProt.Release())
{
if (PROTO_FROM_PROTOCOL_ID(spRmProt->GetProtocolId()) ==
PROTO_FROM_PROTOCOL_ID(dwData))
{
SPIRouterProtocolConfig spRouterConfig;
TCHAR szWarning[2048];
DWORD_PTR rgArgs[4];
// There is a conflict, ask the user if they
// wish to remove this protocol, if yes then
// we have to remove the protocol from our internal
// router info and from the actual router.
// --------------------------------------------------------
spRmProt->CopyCB(&oldrmprotCB);
rgArgs[0] = (DWORD_PTR) oldrmprotCB.szTitle;
rgArgs[1] = (DWORD_PTR) oldrmprotCB.szVendorName;
rgArgs[2] = (DWORD_PTR) rmprotCB.szTitle;
rgArgs[3] = (DWORD_PTR) rmprotCB.szVendorName;
// This may be the same protocol, but installed again
// due to some timing problems.
// --------------------------------------------------------
if ((dwData == spRmProt->GetProtocolId()) &&
(StriCmp((LPCTSTR) oldrmprotCB.szVendorName,
(LPCTSTR) rmprotCB.szVendorName) == 0) &&
(StriCmp((LPCTSTR) oldrmprotCB.szTitle,
(LPCTSTR) rmprotCB.szTitle) == 0))
{
CString stMultipleProtocol;
// Ok, this may be the same protocol, warn
// the user about this potentially confusing
// situation.
// ----------------------------------------------------
stMultipleProtocol.LoadString(IDS_WARN_PROTOCOL_ALREADY_INSTALLED);
::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ARGUMENT_ARRAY,
(LPCTSTR) stMultipleProtocol,
0,
0,
szWarning,
DimensionOf(szWarning),
(va_list *) rgArgs);
if (AfxMessageBox(szWarning, MB_YESNO) == IDNO)
return;
}
else
{
::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ARGUMENT_ARRAY,
(LPCTSTR) stFormat,
0,
0,
szWarning,
DimensionOf(szWarning),
(va_list *) rgArgs);
if (AfxMessageBox(szWarning, MB_YESNO) == IDNO)
return;
}
// Remove the protocol from the RtrMgr
// --------------------------------------------------------
hr = m_spRm->DeleteRtrMgrProtocol(spRmProt->GetProtocolId(), TRUE);
if (!FHrSucceeded(hr))
{
DisplayIdErrorMessage2(GetSafeHwnd(),
IDS_ERR_UNABLE_TO_REMOVE_PROTOCOL, hr);
return;
}
// Instantiate the configuration object
// and tell it to remove the protocol
// --------------------------------------------------------
hr = CoCreateProtocolConfig(oldrmprotCB.guidConfig,
m_spRouter,
spRmProt->GetTransportId(),
spRmProt->GetProtocolId(),
&spRouterConfig);
if (!FHrSucceeded(hr))
{
//$ Todo: what error do we want to put up here?
// What can the user do at this point?
// ----------------------------------------------------
DisplayErrorMessage(GetSafeHwnd(), hr);
continue;
}
// Note that we can return success for CoCreateProtocolConfig
// and have a NULL spRouterConfig.
// --------------------------------------------------------
if (spRouterConfig)
hr = spRouterConfig->RemoveProtocol(m_spRm->GetMachineName(),
spRmProt->GetTransportId(),
spRmProt->GetProtocolId(),
GetSafeHwnd(),
0,
m_spRouter,
0);
//$ Todo: if the Uninstall failed, we should warn the
// user that something failed, what would the text of
// the error message be?
// --------------------------------------------------------
if (!FHrSucceeded(hr))
DisplayErrorMessage(GetSafeHwnd(), hr);
}
}
(*m_ppRmProt) = spRmProtReturn.Transfer();
CBaseDialog::OnOK();
}
/*!--------------------------------------------------------------------------
AddRoutingProtocol
This will take RtrMgr (that is being added to) and a
RtrMgrProtocol (the protocol that is being added) and will add it.
Author: KennT
---------------------------------------------------------------------------*/
HRESULT AddRoutingProtocol(IRtrMgrInfo *pRm, IRtrMgrProtocolInfo *pRmProt, HWND hWnd)
{
RtrMgrProtocolCB rmprotCB;
HRESULT hr = hrOK;
SPIRouterProtocolConfig spRouterConfig;
SPIRouterInfo spRouter;
// Create the configuration object
// ----------------------------------------------------------------
CORg( pRmProt->CopyCB(&rmprotCB) );
// We can ignore any error code.
// ----------------------------------------------------------------
pRm->GetParentRouterInfo(&spRouter);
// Create the actual configuration object.
// ----------------------------------------------------------------
hr = CoCreateProtocolConfig(rmprotCB.guidConfig,
spRouter,
pRmProt->GetTransportId(),
pRmProt->GetProtocolId(),
&spRouterConfig);
CORg( hr );
// Go ahead and add the protocol.
// ----------------------------------------------------------------
if (spRouterConfig)
hr = spRouterConfig->AddProtocol(pRm->GetMachineName(),
pRmProt->GetTransportId(),
pRmProt->GetProtocolId(),
hWnd,
0,
spRouter,
0);
CORg( hr );
Error:
return hr;
}