//============================================================================ // 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; }