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

355 lines
8.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
snappp.h
Brings up the Snapin property page
FILE HISTORY:
*/
// Snappp.cpp : implementation file
//
#include "stdafx.h"
#include "Snappp.h"
#include "root.h"
#include "server.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MILLISEC_PER_MINUTE 60 * 1000
/////////////////////////////////////////////////////////////////////////////
// CSnapinPropGeneral property page
IMPLEMENT_DYNCREATE(CSnapinPropGeneral, CPropertyPageBase)
CSnapinPropGeneral::CSnapinPropGeneral() : CPropertyPageBase(CSnapinPropGeneral::IDD)
{
//{{AFX_DATA_INIT(CSnapinPropGeneral)
m_fLongName = FALSE;
m_nOrderByName = 0;
m_fValidateServers = FALSE;
//}}AFX_DATA_INIT
}
CSnapinPropGeneral::~CSnapinPropGeneral()
{
}
void CSnapinPropGeneral::DoDataExchange(CDataExchange* pDX)
{
CPropertyPageBase::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSnapinPropGeneral)
DDX_Control(pDX, IDC_CHECK2, m_checkValidateServers);
DDX_Check(pDX, IDC_CHECK1, m_fLongName);
DDX_Radio(pDX, IDC_RADIO1, m_nOrderByName);
DDX_Control(pDX, IDC_CHECK1, m_checkLongName);
DDX_Control(pDX, IDC_RADIO1, m_buttonSortByName);
DDX_Control(pDX, IDC_RADIO2, m_buttonSortByIP);
DDX_Check(pDX, IDC_CHECK2, m_fValidateServers);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSnapinPropGeneral, CPropertyPageBase)
//{{AFX_MSG_MAP(CSnapinPropGeneral)
ON_BN_CLICKED(IDC_CHECK2, OnChange)
ON_BN_CLICKED(IDC_CHECK1, OnChange)
ON_BN_CLICKED(IDC_RADIO1, OnChange)
ON_BN_CLICKED(IDC_RADIO2, OnChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSnapinPropGeneral message handlers
BOOL CSnapinPropGeneral::OnApply()
{
if(!IsDirty())
return TRUE;
UpdateData();
GetHolder()->EnablePeekMessageDuringNotifyConsole(TRUE);
// get the root node
SPITFSNode spRootNode;
CWinsRootHandler * pRoot;
spRootNode = ((CSnapinProperties*)(GetHolder()))->GetNode();
pRoot = GETHANDLER(CWinsRootHandler, spRootNode);
// set the values in the root handler
if (m_fValidateServers)
pRoot->m_dwFlags |= FLAG_VALIDATE_CACHE;
else
pRoot->m_dwFlags &= ~FLAG_VALIDATE_CACHE;
// need to do this bcoz' changing the server order and the display name takes a
// long time
BOOL fOrderByName = (m_nOrderByName == 0) ? TRUE : FALSE;
m_bDisplayServerOrderChanged = (fOrderByName == pRoot->GetOrderByName()) ? FALSE : TRUE;
m_bDisplayFQDNChanged = (m_fLongName == pRoot->GetShowLongName()) ? FALSE : TRUE;
// don't do anything, if the properties remained the same
if (!m_bDisplayFQDNChanged && !m_bDisplayServerOrderChanged)
return TRUE;
// set the servername of the rootnode to the one updated
pRoot->SetShowLongName(m_fLongName);
pRoot->SetOrderByName(fOrderByName);
spRootNode->SetData(TFS_DATA_DIRTY, TRUE);
return CPropertyPageBase::OnApply();
}
BOOL CSnapinPropGeneral::OnInitDialog()
{
CPropertyPageBase::OnInitDialog();
// get the root node
// now add the node to the tree
SPITFSNode spRootNode;
CWinsRootHandler * pRoot;
spRootNode = ((CSnapinProperties*)(GetHolder()))->GetNode();
pRoot = GETHANDLER(CWinsRootHandler, spRootNode);
m_uImage = (UINT) spRootNode->GetData(TFS_DATA_IMAGEINDEX);
m_fLongName = pRoot->GetShowLongName();
BOOL fOrderByName = pRoot->GetOrderByName();
m_nOrderByName = (fOrderByName) ? 0 : 1;
if (m_fLongName)
m_checkLongName.SetCheck(TRUE);
else
m_checkLongName.SetCheck(FALSE);
if (m_nOrderByName == 0)
{
m_buttonSortByName.SetCheck(TRUE);
m_buttonSortByIP.SetCheck(FALSE);
}
else
{
m_buttonSortByName.SetCheck(FALSE);
m_buttonSortByIP.SetCheck(TRUE);
}
if (pRoot->m_dwFlags & FLAG_VALIDATE_CACHE)
m_checkValidateServers.SetCheck(TRUE);
else
m_checkValidateServers.SetCheck(FALSE);
// load the correct icon
for (int i = 0; i < ICON_IDX_MAX; i++)
{
if (g_uIconMap[i][1] == m_uImage)
{
HICON hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(g_uIconMap[i][0]));
if (hIcon)
((CStatic *) GetDlgItem(IDC_STATIC_ICON))->SetIcon(hIcon);
break;
}
}
SetDirty(FALSE);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// CSnapinProperties holder
//
/////////////////////////////////////////////////////////////////////////////
CSnapinProperties::CSnapinProperties
(
ITFSNode * pNode,
IComponentData * pComponentData,
ITFSComponentData * pTFSCompData,
LPCTSTR pszSheetName
) : CPropertyPageHolderBase(pNode, pComponentData, pszSheetName)
{
m_bAutoDeletePages = FALSE; // we have the pages as embedded members
AddPageToList((CPropertyPageBase*) &m_pageGeneral);
Assert(pTFSCompData != NULL);
m_spTFSCompData.Set(pTFSCompData);
}
CSnapinProperties::~CSnapinProperties()
{
RemovePageFromList((CPropertyPageBase*) &m_pageGeneral, FALSE);
}
BOOL
CSnapinPropGeneral::OnPropertyChange(BOOL bScope, LONG_PTR * ChangeMask)
{
SPITFSNode spRootNode;
CWinsRootHandler * pRoot;
spRootNode = ((CSnapinProperties*)(GetHolder()))->GetNode();
pRoot = GETHANDLER(CWinsRootHandler, spRootNode);
// enumerate thro' all the nodes
HRESULT hr = hrOK;
SPITFSNodeEnum spNodeEnum;
SPITFSNodeEnum spNodeEnumAdd;
SPITFSNode spCurrentNode;
ULONG nNumReturned = 0;
BEGIN_WAIT_CURSOR;
if (m_bDisplayFQDNChanged)
{
CHAR szStringName[MAX_PATH] = {0};
// get the enumerator for this node
spRootNode->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
while (nNumReturned)
{
// if the status node is encountered, just ignore
const GUID *pGuid;
pGuid = spCurrentNode->GetNodeType();
if(*pGuid == GUID_WinsServerStatusNodeType)
{
spCurrentNode.Release();
// get the next Server in the list
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
continue;
}
// walk the list of servers
CWinsServerHandler * pServer = GETHANDLER(CWinsServerHandler, spCurrentNode);
pServer->SetDisplay(spCurrentNode, m_fLongName);
spCurrentNode.Release();
// get the next Server in the list
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
}// while
}
END_WAIT_CURSOR;
BOOL fValidate = pRoot->m_fValidate;
// turn off validation if it is on.
pRoot->m_fValidate = FALSE;
if (spNodeEnum)
spNodeEnum.Set(NULL);
if (m_bDisplayServerOrderChanged)
{
const GUID *pGuid;
CTFSNodeList tfsNodeList;
// get the enumerator for this node
spRootNode->GetEnum(&spNodeEnum);
// first remove all of the server nodes from the UI
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
while (nNumReturned)
{
pGuid = spCurrentNode->GetNodeType();
if (*pGuid == GUID_WinsServerStatusNodeType)
{
spCurrentNode.Release();
// get the next Server in the list
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
continue;
}
// remove from the UI
spRootNode->ExtractChild(spCurrentNode);
// add ref the pointer since we need to put it on the list
// and adding it to the list doesn't addref
spCurrentNode->AddRef();
tfsNodeList.AddTail(spCurrentNode);
// reset our smart pointer
spCurrentNode.Set(NULL);
// get the next Server in the list
spNodeEnum->Next(1, &spCurrentNode, &nNumReturned);
}
// Next put them back in sorted
while (tfsNodeList.GetCount() > 0)
{
// get the next Server in the list
spCurrentNode = tfsNodeList.RemoveHead();
// if the status node is encountered, just ignore
pGuid = spCurrentNode->GetNodeType();
if (*pGuid == GUID_WinsServerStatusNodeType)
{
spCurrentNode.Release();
continue;
}
// walk the list of servers
CWinsServerHandler *pServer = GETHANDLER(CWinsServerHandler, spCurrentNode);
pRoot->AddServer(pServer->m_strServerAddress,
FALSE,
pServer->m_dwIPAdd,
pServer->GetConnected(),
pServer->m_dwFlags,
pServer->m_dwRefreshInterval);
// releasing here destroys the object
spCurrentNode.Release();
}
}
// restore the flag
pRoot->m_fValidate = fValidate;
return FALSE;
}
void CSnapinPropGeneral::OnChange()
{
SetDirty(TRUE);
}