///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-2000 Microsoft Corporation // // Module Name: // Network.cpp // // Abstract: // Implementation of the CNetwork class. // // Author: // David Potter (davidp) May 6, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CluAdmin.h" #include "ConstDef.h" #include "Network.h" #include "ClusItem.inl" #include "Cluster.h" #include "NetProp.h" #include "ExcOper.h" #include "TraceTag.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Global Variables ///////////////////////////////////////////////////////////////////////////// #ifdef _DEBUG CTraceTag g_tagNetwork(_T("Document"), _T("NETWORK"), 0); CTraceTag g_tagNetNotify(_T("Notify"), _T("NET NOTIFY"), 0); CTraceTag g_tagNetRegNotify(_T("Notify"), _T("NET REG NOTIFY"), 0); #endif ///////////////////////////////////////////////////////////////////////////// // CNetwork ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(CNetwork, CClusterItem) ///////////////////////////////////////////////////////////////////////////// // Message Maps BEGIN_MESSAGE_MAP(CNetwork, CClusterItem) //{{AFX_MSG_MAP(CNetwork) ON_UPDATE_COMMAND_UI(ID_FILE_PROPERTIES, OnUpdateProperties) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::CNetwork // // Routine Description: // Default constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CNetwork::CNetwork(void) : CClusterItem(NULL, IDS_ITEMTYPE_NETWORK) { CommonConstruct(); } //*** CResoruce::CNetwork() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::CommonConstruct // // Routine Description: // Common construction. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::CommonConstruct(void) { m_idmPopupMenu = IDM_NETWORK_POPUP; m_hnetwork = NULL; m_dwCharacteristics = CLUS_CHAR_UNKNOWN; m_dwFlags = 0; m_cnr = ClusterNetworkRoleNone; m_plpciNetInterfaces = NULL; // Set the object type image. m_iimgObjectType = GetClusterAdminApp()->Iimg(IMGLI_NETWORK); // Setup the property array. { m_rgProps[epropName].Set(CLUSREG_NAME_NET_NAME, m_strName, m_strName); m_rgProps[epropRole].Set(CLUSREG_NAME_NET_ROLE, (DWORD &) m_cnr, (DWORD &) m_cnr); m_rgProps[epropAddress].Set(CLUSREG_NAME_NET_ADDRESS, m_strAddress, m_strAddress); m_rgProps[epropAddressMask].Set(CLUSREG_NAME_NET_ADDRESS_MASK, m_strAddressMask, m_strAddressMask); m_rgProps[epropDescription].Set(CLUSREG_NAME_NET_DESC, m_strDescription, m_strDescription); } // Setup the property array } //*** CNetwork::CommonConstruct() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::~CNetwork // // Routine Description: // Destructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CNetwork::~CNetwork(void) { // Cleanup this object. Cleanup(); delete m_plpciNetInterfaces; // Close the network handle. if (Hnetwork() != NULL) CloseClusterNetwork(Hnetwork()); } //*** CNetwork::~CNetwork ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::Cleanup // // Routine Description: // Cleanup the item. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::Cleanup(void) { // Delete the Network Interface list. if (m_plpciNetInterfaces != NULL) m_plpciNetInterfaces->RemoveAll(); // Remove the item from the network list. { POSITION posPci; posPci = Pdoc()->LpciNetworks().Find(this); if (posPci != NULL) { Pdoc()->LpciNetworks().RemoveAt(posPci); } // if: found in the document's list } // Remove the item from the network list } //*** CNetwork::Cleanup() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::Init // // Routine Description: // Initialize the item. // // Arguments: // pdoc [IN OUT] Document to which this item belongs. // lpszName [IN] Name of the item. // // Return Value: // None. // // Exceptions Thrown: // CNTException Errors from OpenClusterNetwork or GetClusterNetworkKey. // Any exceptions thrown by new. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::Init(IN OUT CClusterDoc * pdoc, IN LPCTSTR lpszName) { DWORD dwStatus = ERROR_SUCCESS; LONG lResult; CString strName(lpszName); // Required if built non-Unicode CWaitCursor wc; ASSERT(Hnetwork() == NULL); ASSERT(Hkey() == NULL); // Call the base class method. CClusterItem::Init(pdoc, lpszName); try { // Open the network. m_hnetwork = OpenClusterNetwork(Hcluster(), strName); if (Hnetwork() == NULL) { dwStatus = GetLastError(); ThrowStaticException(dwStatus, IDS_OPEN_NETWORK_ERROR, lpszName); } // if: error opening the cluster network // Get the network registry key. m_hkey = GetClusterNetworkKey(Hnetwork(), MAXIMUM_ALLOWED); // if (Hkey() == NULL) // ThrowStaticException(GetLastError(), IDS_GET_NETWORK_KEY_ERROR, lpszName); if (BDocObj()) { ASSERT(Pcnk() != NULL); Trace(g_tagClusItemNotify, _T("CNetwork::Init() - Registering for network notifications (%08.8x) for '%s'"), Pcnk(), StrName()); // Register for network notifications. lResult = RegisterClusterNotify( GetClusterAdminApp()->HchangeNotifyPort(), ( CLUSTER_CHANGE_NETWORK_STATE | CLUSTER_CHANGE_NETWORK_DELETED | CLUSTER_CHANGE_NETWORK_PROPERTY), Hnetwork(), (DWORD_PTR) Pcnk() ); if (lResult != ERROR_SUCCESS) { dwStatus = lResult; ThrowStaticException(dwStatus, IDS_RES_NOTIF_REG_ERROR, lpszName); } // if: error registering for network notifications // Register for registry notifications. if (m_hkey != NULL) { lResult = RegisterClusterNotify( GetClusterAdminApp()->HchangeNotifyPort(), (CLUSTER_CHANGE_REGISTRY_NAME | CLUSTER_CHANGE_REGISTRY_ATTRIBUTES | CLUSTER_CHANGE_REGISTRY_VALUE | CLUSTER_CHANGE_REGISTRY_SUBTREE), Hkey(), (DWORD_PTR) Pcnk() ); if (lResult != ERROR_SUCCESS) { dwStatus = lResult; ThrowStaticException(dwStatus, IDS_RES_NOTIF_REG_ERROR, lpszName); } // if: error registering for registry notifications } // if: there is a key } // if: document object // Allocate lists. m_plpciNetInterfaces = new CNetInterfaceList; if ( m_plpciNetInterfaces == NULL ) { AfxThrowMemoryException(); } // if: error allocating the network interface list // Read the initial state. UpdateState(); } // try catch (CException *) { if (Hkey() != NULL) { ClusterRegCloseKey(Hkey()); m_hkey = NULL; } // if: registry key opened if (Hnetwork() != NULL) { CloseClusterNetwork(Hnetwork()); m_hnetwork = NULL; } // if: network opened m_bReadOnly = TRUE; throw; } // catch: CException } //*** CNetwork::Init() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::ReadItem // // Routine Description: // Read the item parameters from the cluster database. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // CNTException Errors from CClusterItem::DwReadValue(). // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::ReadItem(void) { DWORD dwStatus; DWORD dwRetStatus = ERROR_SUCCESS; CString strOldName; CWaitCursor wc; ASSERT_VALID(this); if (Hnetwork() != NULL) { m_rgProps[epropDescription].m_value.pstr = &m_strDescription; m_rgProps[epropRole].m_value.pdw = (DWORD *) &m_cnr; // Save the name so we can detect changes. strOldName = StrName(); // Call the base class method. CClusterItem::ReadItem(); // Read and parse the common properties. { CClusPropList cpl; dwStatus = cpl.ScGetNetworkProperties( Hnetwork(), CLUSCTL_NETWORK_GET_COMMON_PROPERTIES ); if (dwStatus == ERROR_SUCCESS) dwStatus = DwParseProperties(cpl); if (dwStatus != ERROR_SUCCESS) dwRetStatus = dwStatus; } // Read and parse the common properties // Read and parse the read-only common properties. if (dwRetStatus == ERROR_SUCCESS) { CClusPropList cpl; dwStatus = cpl.ScGetNetworkProperties( Hnetwork(), CLUSCTL_NETWORK_GET_RO_COMMON_PROPERTIES ); if (dwStatus == ERROR_SUCCESS) dwStatus = DwParseProperties(cpl); if (dwStatus != ERROR_SUCCESS) dwRetStatus = dwStatus; } // if: no error yet // Read the characteristics. if (dwRetStatus == ERROR_SUCCESS) { DWORD cbReturned; dwStatus = ClusterNetworkControl( Hnetwork(), NULL, CLUSCTL_NETWORK_GET_CHARACTERISTICS, NULL, NULL, &m_dwCharacteristics, sizeof(m_dwCharacteristics), &cbReturned ); if (dwStatus != ERROR_SUCCESS) dwRetStatus = dwStatus; else { ASSERT(cbReturned == sizeof(m_dwCharacteristics)); } // else: data retrieved successfully } // if: no error yet // Read the flags. if (dwRetStatus == ERROR_SUCCESS) { DWORD cbReturned; dwStatus = ClusterNetworkControl( Hnetwork(), NULL, CLUSCTL_NETWORK_GET_FLAGS, NULL, NULL, &m_dwFlags, sizeof(m_dwFlags), &cbReturned ); if (dwStatus != ERROR_SUCCESS) dwRetStatus = dwStatus; else { ASSERT(cbReturned == sizeof(m_dwFlags)); } // else: data retrieved successfully } // if: no error yet // Construct the list of extensions. ReadExtensions(); // If the name changed, update all the network interfaces. if ( (m_plpciNetInterfaces != NULL) && (StrName() != strOldName) ) { POSITION posPciNetIFaces; CNetInterface * pciNetIFace; posPciNetIFaces = m_plpciNetInterfaces->GetHeadPosition(); while ( posPciNetIFaces != NULL ) { pciNetIFace = reinterpret_cast< CNetInterface * >( m_plpciNetInterfaces->GetNext(posPciNetIFaces) ); ASSERT_VALID(pciNetIFace); ASSERT_KINDOF(CNetInterface, pciNetIFace); pciNetIFace->ReadItem(); } // while: more items in the list } // if: list exists and name changed } // if: network is available // Read the initial state. UpdateState(); // If any errors occurred, throw an exception. if (dwRetStatus != ERROR_SUCCESS) { m_bReadOnly = TRUE; // if (dwRetStatus != ERROR_FILE_NOT_FOUND) ThrowStaticException(dwRetStatus, IDS_READ_NETWORK_PROPS_ERROR, StrName()); } // if: error reading properties MarkAsChanged(FALSE); } //*** CNetwork::ReadItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::ReadExtensions // // Routine Description: // Read extension lists. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::ReadExtensions(void) { } //*** CNetwork::ReadExtensions() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::PlstrExtension // // Routine Description: // Return the list of admin extensions. // // Arguments: // None. // // Return Value: // plstr List of extensions. // NULL No extension associated with this object. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// const CStringList * CNetwork::PlstrExtensions(void) const { return &Pdoc()->PciCluster()->LstrNetworkExtensions(); } //*** CNetwork::PlstrExtensions() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::CollectInterfaces // // Routine Description: // Construct a list of interfaces connected to this network. // // Arguments: // plpci [IN OUT] List to fill. // // Return Value: // None. // // Exceptions Thrown: // CNTException Errors from ClusterNetworkOpenEnum() or // ClusterNetworkEnum(). // Any exceptions thrown by new or CList::AddTail(). // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::CollectInterfaces(IN OUT CNetInterfaceList * plpci) const { DWORD dwStatus; HNETWORKENUM hnetenum; int ienum; LPWSTR pwszName = NULL; DWORD cchName; DWORD cchmacName; DWORD dwRetType; CNetInterface * pciNetIFace; CWaitCursor wc; ASSERT_VALID(Pdoc()); ASSERT(Hnetwork() != NULL); if (plpci == NULL) plpci = m_plpciNetInterfaces; ASSERT(plpci != NULL); // Remove the previous contents of the list. plpci->RemoveAll(); if (Hnetwork() != NULL) { // Open the enumeration. hnetenum = ClusterNetworkOpenEnum(Hnetwork(), CLUSTER_NETWORK_ENUM_NETINTERFACES); if (hnetenum == NULL) ThrowStaticException(GetLastError(), IDS_ENUM_NETWORK_INTERFACES_ERROR, StrName()); try { // Allocate a name buffer. cchmacName = 128; pwszName = new WCHAR[cchmacName]; if ( pwszName == NULL ) { AfxThrowMemoryException(); } // if: error allocating name buffer // Loop through the enumeration and add each interface to the list. for (ienum = 0 ; ; ienum++) { // Get the next item in the enumeration. cchName = cchmacName; dwStatus = ClusterNetworkEnum(hnetenum, ienum, &dwRetType, pwszName, &cchName); if (dwStatus == ERROR_MORE_DATA) { delete [] pwszName; cchmacName = ++cchName; pwszName = new WCHAR[cchmacName]; if ( pwszName == NULL ) { AfxThrowMemoryException(); } // if: error allocating name buffer dwStatus = ClusterNetworkEnum(hnetenum, ienum, &dwRetType, pwszName, &cchName); } // if: name buffer was too small if (dwStatus == ERROR_NO_MORE_ITEMS) break; else if (dwStatus != ERROR_SUCCESS) ThrowStaticException(dwStatus, IDS_ENUM_NETWORK_INTERFACES_ERROR, StrName()); ASSERT(dwRetType == CLUSTER_NETWORK_ENUM_NETINTERFACES); // Find the item in the list of networks on the document. pciNetIFace = Pdoc()->LpciNetInterfaces().PciNetInterfaceFromName(pwszName); ASSERT_VALID(pciNetIFace); // Add the interface to the list. if (pciNetIFace != NULL) { plpci->AddTail(pciNetIFace); } // if: found node in list } // for: each network interface connected to this network delete [] pwszName; ClusterNetworkCloseEnum(hnetenum); } // try catch (CException *) { delete [] pwszName; ClusterNetworkCloseEnum(hnetenum); throw; } // catch: any exception } // if: network is available } //*** CNetwork::CollecPossibleOwners() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::AddNetInterface // // Routine Description: // Add a network interface to the list of interaces connected to this // network. // // Arguments: // pciNetIFace [IN OUT] New network interface. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::AddNetInterface(IN OUT CNetInterface * pciNetIFace) { POSITION posPci; ASSERT_VALID(pciNetIFace); Trace(g_tagNetwork, _T("(%s) (%s (%x)) - Adding network interface '%s'"), Pdoc()->StrNode(), StrName(), this, pciNetIFace->StrName()); // Make sure the network interface is not already in the list. VERIFY((posPci = LpciNetInterfaces().Find(pciNetIFace)) == NULL); if (posPci == NULL) { POSITION posPtiNetwork; CTreeItem * ptiNetwork; // Loop through each tree item to update the Network list. posPtiNetwork = LptiBackPointers().GetHeadPosition(); while (posPtiNetwork != NULL) { ptiNetwork = LptiBackPointers().GetNext(posPtiNetwork); ASSERT_VALID(ptiNetwork); // Add the new network interface. VERIFY(ptiNetwork->PliAddChild(pciNetIFace) != NULL); } // while: more tree items for this network m_plpciNetInterfaces->AddTail(pciNetIFace); } // if: network interface not in the list yet } //*** CNetwork::AddNetInterface() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::RemoveNetInterface // // Routine Description: // Remove a network interface from the list of interfaces connected to // this network // // Arguments: // pciNetIFace [IN OUT] Network interface that is no longer // connected to this network. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::RemoveNetInterface(IN OUT CNetInterface * pciNetIFace) { POSITION posPci; ASSERT_VALID(pciNetIFace); Trace(g_tagNetwork, _T("(%s) (%s (%x)) - Removing network interface '%s'"), Pdoc()->StrNode(), StrName(), this, pciNetIFace->StrName()); // Make sure the network interface is in the list. VERIFY((posPci = LpciNetInterfaces().Find(pciNetIFace)) != NULL); if (posPci != NULL) { POSITION posPtiNetwork; CTreeItem * ptiNetwork; // Loop through each tree item to update the Network list. posPtiNetwork = LptiBackPointers().GetHeadPosition(); while (posPtiNetwork != NULL) { ptiNetwork = LptiBackPointers().GetNext(posPtiNetwork); ASSERT_VALID(ptiNetwork); // Remove the network interface. ptiNetwork->RemoveChild(pciNetIFace); } // while: more tree items for this network m_plpciNetInterfaces->RemoveAt(posPci); } // if: network interface in the list } //*** CNetwork::RemoveNetInterface() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::SetName // // Routine Description: // Set the name of this network. // // Arguments: // pszName [IN] New name of the network. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions thrown by Rename(). //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::SetName(IN LPCTSTR pszName) { Rename(pszName); } //*** CNetwork::SetName() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::SetCommonProperties // // Routine Description: // Set the common properties for this network in the cluster database. // // Arguments: // rstrDesc [IN] Description string. // cnr [IN] Network role. // bValidateOnly [IN] Only validate the data. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions thrown by CClusterItem::SetCommonProperties(). // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::SetCommonProperties( IN const CString & rstrDesc, IN CLUSTER_NETWORK_ROLE cnr, IN BOOL bValidateOnly ) { CNTException nte(ERROR_SUCCESS, 0, NULL, NULL, FALSE /*bAutoDelete*/); m_rgProps[epropDescription].m_value.pstr = (CString *) &rstrDesc; m_rgProps[epropRole].m_value.pdw = (DWORD *) &cnr; try { CClusterItem::SetCommonProperties(bValidateOnly); } // try catch (CNTException * pnte) { nte.SetOperation( pnte->Sc(), pnte->IdsOperation(), pnte->PszOperArg1(), pnte->PszOperArg2() ); } // catch: CNTException m_rgProps[epropDescription].m_value.pstr = &m_strDescription; m_rgProps[epropRole].m_value.pdw = (DWORD *) &m_cnr; if (nte.Sc() != ERROR_SUCCESS) ThrowStaticException( nte.Sc(), nte.IdsOperation(), nte.PszOperArg1(), nte.PszOperArg2() ); } //*** CNetwork::SetCommonProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::DwSetCommonProperties // // Routine Description: // Set the common properties for this network in the cluster database. // // Arguments: // rcpl [IN] Property list to set. // bValidateOnly [IN] Only validate the data. // // Return Value: // Any status returned by ClusterNetworkControl(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CNetwork::DwSetCommonProperties( IN const CClusPropList & rcpl, IN BOOL bValidateOnly ) { DWORD dwStatus; CWaitCursor wc; ASSERT(Hnetwork()); if ((rcpl.PbPropList() != NULL) && (rcpl.CbPropList() > 0)) { DWORD cbProps; DWORD dwControl; if (bValidateOnly) dwControl = CLUSCTL_NETWORK_VALIDATE_COMMON_PROPERTIES; else dwControl = CLUSCTL_NETWORK_SET_COMMON_PROPERTIES; // Set common properties. dwStatus = ClusterNetworkControl( Hnetwork(), NULL, // hNode dwControl, rcpl.PbPropList(), rcpl.CbPropList(), NULL, // lpOutBuffer 0, // nOutBufferSize &cbProps ); } // if: there is data to set else dwStatus = ERROR_SUCCESS; return dwStatus; } //*** CNetwork::DwSetCommonProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::UpdateState // // Routine Description: // Update the current state of the item. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::UpdateState(void) { CClusterAdminApp * papp = GetClusterAdminApp(); Trace(g_tagNetwork, _T("(%s) (%s (%x)) - Updating state"), Pdoc()->StrNode(), StrName(), this); // Get the current state of the network. if (Hnetwork() == NULL) m_cns = ClusterNetworkStateUnknown; else { CWaitCursor wc; m_cns = GetClusterNetworkState(Hnetwork()); } // else: network is available // Save the current state image index. switch (Cns()) { case ClusterNetworkStateUnknown: case ClusterNetworkUnavailable: m_iimgState = papp->Iimg(IMGLI_NETWORK_UNKNOWN); break; case ClusterNetworkUp: m_iimgState = papp->Iimg(IMGLI_NETWORK); break; case ClusterNetworkPartitioned: m_iimgState = papp->Iimg(IMGLI_NETWORK_PARTITIONED); break; case ClusterNetworkDown: m_iimgState = papp->Iimg(IMGLI_NETWORK_DOWN); break; default: Trace(g_tagNetwork, _T("(%s) (%s (%x)) - UpdateState: Unknown state '%d' for network '%s'"), Pdoc()->StrNode(), StrName(), this, Cns(), StrName()); m_iimgState = (UINT) -1; break; } // switch: Crs() // Call the base class method. CClusterItem::UpdateState(); } //*** CNetwork::UpdateState() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::BGetColumnData // // Routine Description: // Returns a string with the column data. // // Arguments: // colid [IN] Column ID. // rstrText [OUT] String in which to return the text for the column. // // Return Value: // TRUE Column data returned. // FALSE Column ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CNetwork::BGetColumnData(IN COLID colid, OUT CString & rstrText) { BOOL bSuccess; switch (colid) { case IDS_COLTEXT_STATE: GetStateName(rstrText); bSuccess = TRUE; break; case IDS_COLTEXT_ROLE: GetRoleName(rstrText); bSuccess = TRUE; break; case IDS_COLTEXT_ADDRESS: rstrText = m_strAddress; bSuccess = TRUE; break; case IDS_COLTEXT_MASK: rstrText = m_strAddressMask; bSuccess = TRUE; break; default: bSuccess = CClusterItem::BGetColumnData(colid, rstrText); break; } // switch: colid return bSuccess; } //*** CNetwork::BGetColumnData() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::GetTreeName // // Routine Description: // Returns a string to be used in a tree control. // // Arguments: // rstrName [OUT] String in which to return the name. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// #ifdef _DISPLAY_STATE_TEXT_IN_TREE void CNetwork::GetTreeName(OUT CString & rstrName) const { CString strState; GetStateName(strState); rstrName.Format(_T("%s (%s)"), StrName(), strState); } //*** CNetwork::GetTreeName() #endif ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::GetStateName // // Routine Description: // Returns a string with the name of the current state. // // Arguments: // rstrState [OUT] String in which to return the name of the current state. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::GetStateName(OUT CString & rstrState) const { switch (Cns()) { case ClusterNetworkStateUnknown: rstrState.LoadString(IDS_UNKNOWN); break; case ClusterNetworkUp: rstrState.LoadString(IDS_UP); break; case ClusterNetworkPartitioned: rstrState.LoadString(IDS_PARTITIONED); break; case ClusterNetworkDown: rstrState.LoadString(IDS_DOWN); break; case ClusterNetworkUnavailable: rstrState.LoadString(IDS_UNAVAILABLE); break; default: rstrState.Empty(); break; } // switch: Crs() } //*** CNetwork::GetStateName() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::GetRoleName // // Routine Description: // Returns a string with the name of the current network role. // // Arguments: // rstrRole [OUT] String in which to return the name of the current role. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::GetRoleName(OUT CString & rstrRole) const { switch (Cnr()) { case ClusterNetworkRoleInternalAndClient: rstrRole.LoadString(IDS_CLIENT_AND_CLUSTER); break; case ClusterNetworkRoleClientAccess: rstrRole.LoadString(IDS_CLIENT_ONLY); break; case ClusterNetworkRoleInternalUse: rstrRole.LoadString(IDS_CLUSTER_ONLY); break; case ClusterNetworkRoleNone: rstrRole.LoadString(IDS_DONT_USE); break; default: rstrRole.Empty(); break; } // switch: Cnr() } //*** CNetwork::GetRoleName() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::BCanBeEdited // // Routine Description: // Determines if the network can be renamed. // // Arguments: // None. // // Return Value: // TRUE Network can be renamed. // FALSE Network cannot be renamed. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CNetwork::BCanBeEdited(void) const { BOOL bCanBeEdited; if ( (Cns() == ClusterNetworkStateUnknown) || BReadOnly()) bCanBeEdited = FALSE; else bCanBeEdited = TRUE; return bCanBeEdited; } //*** CNetwork::BCanBeEdited() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::Rename // // Routine Description: // Rename the network. // // Arguments: // pszName [IN] New name to give to the network. // // Return Value: // None. // // Exceptions Thrown: // CNTException Errors returned from SetClusterNetwName(). // Any exceptions thrown by SetClusterNetworkName(). // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::Rename(IN LPCTSTR pszName) { DWORD dwStatus; CWaitCursor wc; ASSERT(Hnetwork() != NULL); if (StrName() != pszName) { // Validate the name. if (!NcIsValidConnectionName(pszName)) { ThrowStaticException((IDS) IDS_INVALID_NETWORK_CONNECTION_NAME); } // if: error validating the name dwStatus = SetClusterNetworkName(Hnetwork(), pszName); if (dwStatus != ERROR_SUCCESS) ThrowStaticException(dwStatus, IDS_RENAME_NETWORK_ERROR, StrName(), pszName); } // if: the name changed } //*** CNetwork::Rename() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::OnBeginLabelEdit // // Routine Description: // Prepare an edit control in a view for editing the cluster name. // // Arguments: // pedit [IN OUT] Edit control to prepare. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::OnBeginLabelEdit(IN OUT CEdit * pedit) { ASSERT_VALID(pedit); pedit->SetLimitText(NETCON_MAX_NAME_LEN); } //*** CNetwork::OnBeginLabelEdit() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::OnUpdateProperties // // Routine Description: // Determines whether menu items corresponding to ID_FILE_PROPERTIES // should be enabled or not. // // Arguments: // pCmdUI [IN OUT] Command routing object. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CNetwork::OnUpdateProperties(CCmdUI * pCmdUI) { pCmdUI->Enable(TRUE); } //*** CNetwork::OnUpdateProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::BDisplayProperties // // Routine Description: // Display properties for the object. // // Arguments: // bReadOnly [IN] Don't allow edits to the object properties. // // Return Value: // TRUE OK pressed. // FALSE OK not pressed. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CNetwork::BDisplayProperties(IN BOOL bReadOnly) { BOOL bChanged = FALSE; CNetworkPropSheet sht(AfxGetMainWnd()); // Do this in case this object is deleted while we are operating on it. AddRef(); // If the object has changed, read it. if (BChanged()) ReadItem(); // Display the property sheet. try { sht.SetReadOnly(bReadOnly); if (sht.BInit(this, IimgObjectType())) bChanged = ((sht.DoModal() == IDOK) && !bReadOnly); } // try catch (CException * pe) { pe->Delete(); } // catch: CException Release(); return bChanged; } //*** CNetwork::BDisplayProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CNetwork::OnClusterNotify // // Routine Description: // Handler for the WM_CAM_CLUSTER_NOTIFY message. // Processes cluster notifications for this object. // // Arguments: // pnotify [IN OUT] Object describing the notification. // // Return Value: // Value returned from the application method. // //-- ///////////////////////////////////////////////////////////////////////////// LRESULT CNetwork::OnClusterNotify(IN OUT CClusterNotify * pnotify) { ASSERT(pnotify != NULL); ASSERT_VALID(this); try { switch (pnotify->m_dwFilterType) { case CLUSTER_CHANGE_NETWORK_STATE: Trace(g_tagNetNotify, _T("(%s) - Network '%s' (%x) state changed (%s)"), Pdoc()->StrNode(), StrName(), this, pnotify->m_strName); UpdateState(); break; case CLUSTER_CHANGE_NETWORK_DELETED: Trace(g_tagNetNotify, _T("(%s) - Network '%s' (%x) deleted (%s)"), Pdoc()->StrNode(), StrName(), this, pnotify->m_strName); if (Pdoc()->BClusterAvailable()) Delete(); break; case CLUSTER_CHANGE_NETWORK_PROPERTY: Trace(g_tagNetNotify, _T("(%s) - Network '%s' (%x) properties changed (%s)"), Pdoc()->StrNode(), StrName(), this, pnotify->m_strName); if (Pdoc()->BClusterAvailable()) ReadItem(); break; case CLUSTER_CHANGE_REGISTRY_NAME: Trace(g_tagNetRegNotify, _T("(%s) - Registry namespace '%s' changed (%s %s (%x))"), Pdoc()->StrNode(), pnotify->m_strName, StrType(), StrName(), this); MarkAsChanged(); break; case CLUSTER_CHANGE_REGISTRY_ATTRIBUTES: Trace(g_tagNetRegNotify, _T("(%s) - Registry attributes for '%s' changed (%s %s (%x))"), Pdoc()->StrNode(), pnotify->m_strName, StrType(), StrName(), this); MarkAsChanged(); break; case CLUSTER_CHANGE_REGISTRY_VALUE: Trace(g_tagNetRegNotify, _T("(%s) - Registry value '%s' changed (%s %s (%x))"), Pdoc()->StrNode(), pnotify->m_strName, StrType(), StrName(), this); MarkAsChanged(); break; default: Trace(g_tagNetNotify, _T("(%s) - Unknown network notification (%x) for '%s' (%x) (%s)"), Pdoc()->StrNode(), pnotify->m_dwFilterType, StrName(), this, pnotify->m_strName); } // switch: dwFilterType } // try catch (CException * pe) { // Don't display anything on notification errors. // If it's really a problem, the user will see it when // refreshing the view. //pe->ReportError(); pe->Delete(); } // catch: CException delete pnotify; return 0; } //*** CNetwork::OnClusterNotify() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // Global Functions ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // DeleteAllItemData // // Routine Description: // Deletes all item data in a CList. // // Arguments: // rlp [IN OUT] List whose data is to be deleted. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// #ifdef NEVER void DeleteAllItemData(IN OUT CNetworkList & rlp) { POSITION pos; CNetwork * pci; // Delete all the items in the Contained list. pos = rlp.GetHeadPosition(); while (pos != NULL) { pci = rlp.GetNext(pos); ASSERT_VALID(pci); // Trace(g_tagClusItemDelete, _T("DeleteAllItemData(rlp) - Deleting network cluster item '%s' (%x)"), pci->StrName(), pci); pci->Delete(); } // while: more items in the list } //*** DeleteAllItemData() #endif