windows-nt/Source/XPSP1/NT/admin/snapin/adsiedit/snapdata.cpp
2020-09-26 16:20:57 +08:00

443 lines
10 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: snapdata.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#include <SnapBase.h>
#include "resource.h"
#include "adsiedit.h"
#include "editor.h"
#include "connection.h"
#include "connectionui.h"
#include "snapdata.h"
#ifdef DEBUG_ALLOCATOR
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#endif
BEGIN_MENU(CADSIEditRootMenuHolder)
BEGIN_CTX
CTX_ENTRY_TOP(IDM_CONNECT_TO, L"_ADSIEDIT_CONNECTTO")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_CONNECT_TO)
END_RES
END_MENU
BEGIN_MENU(CADSIEditConnectMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_FILTER, L"_ADSIEDIT_FILTER")
CTX_ENTRY_TOP(IDM_SETTINGS_CONNECTION, L"_ADSIEDIT_SETTINGS")
CTX_ENTRY_TOP(IDM_REMOVE_CONNECTION, L"_ADSIEDIT_REMOVE")
CTX_ENTRY_TOP(IDM_UPDATE_SCHEMA, L"_ADSIEDIT_UPDATE")
CTX_ENTRY_NEW(IDM_NEW_QUERY, L"_ADSIEDIT_NEWQUERY")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_FILTER)
RES_ENTRY(IDS_SETTINGS_CONNECTION)
RES_ENTRY(IDS_REMOVE_CONNECTION)
RES_ENTRY(IDS_UPDATE_SCHEMA)
RES_ENTRY(IDS_NEW_QUERY)
END_RES
END_MENU
BEGIN_MENU(CADSIEditContainerMenuHolder)
BEGIN_CTX
CTX_ENTRY_NEW(IDM_NEW_OBJECT, L"_ADSIEDIT_NEWOBJECT")
CTX_ENTRY_TOP(IDM_MOVE, L"_ADSIEDIT_MOVE")
CTX_ENTRY_TOP(IDM_NEW_CONNECT_FROM_HERE, L"_ADSIEDIT_CONNECTFROMHERE")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_NEW_OBJECT)
RES_ENTRY(IDS_MOVE)
RES_ENTRY(IDS_NEW_CONNECT_FROM_HERE)
END_RES
END_MENU
BEGIN_MENU(CADSIEditLeafMenuHolder)
BEGIN_CTX
CTX_ENTRY_TOP(IDM_MOVE, L"_ADSIEDIT_MOVE")
CTX_ENTRY_TOP(IDM_NEW_NC_CONNECT_FROM_HERE, L"_ADSIEDIT_CONNECTTONCFROMHERE")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_MOVE)
RES_ENTRY(IDS_NEW_CONNECT_TO_NC_FROM_HERE)
END_RES
END_MENU
BEGIN_MENU(CADSIEditQueryMenuHolder)
BEGIN_CTX
CTX_ENTRY_TOP(IDM_SETTINGS_QUERY, L"_ADSIEDIT_QUERYSETTINGS")
CTX_ENTRY_TOP(IDM_REMOVE_QUERY, L"_ADSIEDIT_REMOVE")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SETTINGS_QUERY)
RES_ENTRY(IDS_REMOVE_QUERY)
END_RES
END_MENU
//////////////////////////////////////////////////////////////////////
// CADSIEditRootData
// {D4F3374F-052F-11d2-97B0-00A0C9A06D2D}
const GUID CADSIEditRootData::NodeTypeGUID =
{ 0xd4f3374f, 0x52f, 0x11d2, { 0x97, 0xb0, 0x0, 0xa0, 0xc9, 0xa0, 0x6d, 0x2d } };
CADSIEditRootData::CADSIEditRootData(CComponentDataObject* pComponentData)
: CRootData(pComponentData)
{
m_szDescriptionText = L"";
}
CADSIEditRootData::~CADSIEditRootData()
{
TRACE(_T("~CADSIEditRootData(), name <%s>\n"),GetDisplayName());
}
HRESULT CADSIEditRootData::LoadMRUs(IStream* pStm)
{
HRESULT hr = LoadStringListFromStream(pStm, m_sDNMRU);
if (FAILED(hr))
{
return hr;
}
hr = LoadStringListFromStream(pStm, m_sServerMRU);
return hr;
}
HRESULT CADSIEditRootData::SaveMRUs(IStream* pStm)
{
HRESULT hr = SaveStringListToStream(pStm, m_sDNMRU);
if (FAILED(hr))
{
return hr;
}
hr = SaveStringListToStream(pStm, m_sServerMRU);
return hr;
}
BOOL CADSIEditRootData::FindNode(LPCWSTR lpszPath, CList<CTreeNode*, CTreeNode*>& nodeList)
{
BOOL bFound = FALSE;
POSITION pos;
for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
{
CTreeNode* pNode = m_containerChildList.GetNext(pos);
CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
ASSERT(pConnectNode != NULL);
CTreeNode* pFoundNode;
BOOL bTemp;
bTemp = pConnectNode->FindNode(lpszPath, nodeList);
if (!bFound)
{
bFound = bTemp;
}
}
return bFound;
}
BOOL CADSIEditRootData::OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem,
long *pInsertionAllowed)
{
//
// Single selection
//
if (pContextMenuItem->lCommandID == IDM_CONNECT_TO)
{
return TRUE;
}
return FALSE;
}
BOOL CADSIEditRootData::OnSetRefreshVerbState(DATA_OBJECT_TYPES type,
BOOL* pbHide,
CNodeList* pNodeList)
{
*pbHide = FALSE;
return !IsThreadLocked();
}
HRESULT CADSIEditRootData::OnCommand(long nCommandID,
DATA_OBJECT_TYPES type,
CComponentDataObject* pComponentData,
CNodeList* pNodeList)
{
if (pNodeList->GetCount() == 1) // single selection
{
switch (nCommandID)
{
case IDM_CONNECT_TO :
OnConnectTo(pComponentData);
break;
default:
ASSERT(FALSE); // Unknown command!
return E_FAIL;
}
}
else if (pNodeList->GetCount() > 1) // multiple selection
{
switch (nCommandID)
{
case IDM_REMOVE_CONNECTION :
{
POSITION pos = pNodeList->GetHeadPosition();
while (pos != NULL)
{
CTreeNode* pNode = pNodeList->GetNext(pos);
ASSERT(pNode != NULL);
CADSIEditConnectionNode* pConnectionNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
ASSERT(pConnectionNode != NULL);
pConnectionNode->OnRemove(pComponentData);
}
break;
}
default :
ASSERT(FALSE);
return E_FAIL;
}
}
return S_OK;
}
void CADSIEditRootData::OnConnectTo(CComponentDataObject* pComponentData)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString s, sPath;
BSTR bstrPath;
CConnectionData* pConnectData = NULL;
CADSIEditConnectDialog pConnectDialog(NULL,
this,
pComponentData,
pConnectData);
pConnectDialog.DoModal();
//Change the result pane if this is the first child being added
pComponentData->UpdateResultPaneView(this);
}
HRESULT CADSIEditRootData::GetResultViewType(LPOLESTR* ppViewType, long* pViewOptions)
{
HRESULT hr = S_FALSE;
if (m_containerChildList.IsEmpty() && m_leafChildList.IsEmpty())
{
*pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
LPOLESTR psz = NULL;
StringFromCLSID(CLSID_MessageView, &psz);
USES_CONVERSION;
if (psz != NULL)
{
*ppViewType = psz;
hr = S_OK;
}
}
else
{
*pViewOptions = MMC_VIEW_OPTIONS_MULTISELECT;
*ppViewType = NULL;
hr = S_FALSE;
}
return hr;
}
HRESULT CADSIEditRootData::OnShow(LPCONSOLE lpConsole)
{
CComPtr<IUnknown> spUnknown;
CComPtr<IMessageView> spMessageView;
HRESULT hr = lpConsole->QueryResultView(&spUnknown);
if (FAILED(hr))
return S_OK;
hr = spUnknown->QueryInterface(IID_IMessageView, (PVOID*)&spMessageView);
if (SUCCEEDED(hr))
{
CString szTitle, szMessage;
IconIdentifier iconID;
VERIFY(szTitle.LoadString(IDS_MESSAGE_VIEW_NO_CONNECTIONS_TITLE));
VERIFY(szMessage.LoadString(IDS_MESSAGE_VIEW_NO_CONNECTIONS_MESSAGE));
iconID = Icon_Information;
spMessageView->SetTitleText(szTitle);
spMessageView->SetBodyText(szMessage);
spMessageView->SetIcon(iconID);
}
return S_OK;
}
#define ADSIEDIT_STREAM_VERSION (12)
// IStream manipulation helpers overrides
HRESULT CADSIEditRootData::Load(IStream* pStm)
{
//
// assume never get multiple loads
//
if(!m_containerChildList.IsEmpty() || !m_leafChildList.IsEmpty())
return E_FAIL;
WCHAR szBuffer[256]; // REVIEW_MARCOC: hardcoded
ULONG nLen; // WCHAR counting NULL
UINT nCount;
ULONG cbRead;
// read the version ##
DWORD dwVersion;
VERIFY(SUCCEEDED(pStm->Read((void*)&dwVersion,sizeof(DWORD), &cbRead)));
ASSERT(cbRead == sizeof(DWORD));
if (dwVersion != ADSIEDIT_STREAM_VERSION)
return E_FAIL;
HRESULT hr = LoadMRUs(pStm);
if (FAILED(hr))
{
return hr;
}
// load the list of connections
VERIFY(SUCCEEDED(pStm->Read((void*)&nCount,sizeof(UINT), &cbRead)));
ASSERT(cbRead == sizeof(UINT));
CComponentDataObject* pComponentData = GetComponentDataObject();
for (int k=0; k< (int)nCount; k++)
{
CADSIEditConnectionNode* p = NULL;
VERIFY(SUCCEEDED(CADSIEditConnectionNode::CreateFromStream(pStm, &p)));
ASSERT(p != NULL);
VERIFY(AddChildToList(p));
}
if (nCount > 0)
MarkEnumerated();
ASSERT(m_containerChildList.GetCount() == (int)nCount);
return S_OK;
}
HRESULT CADSIEditRootData::Save(IStream* pStm, BOOL fClearDirty)
{
UINT nCount;
ULONG cbWrite;
// write the version ##
DWORD dwVersion = ADSIEDIT_STREAM_VERSION;
VERIFY(SUCCEEDED(pStm->Write((void*)&dwVersion, sizeof(DWORD),&cbWrite)));
ASSERT(cbWrite == sizeof(DWORD));
HRESULT hr = SaveMRUs(pStm);
if (FAILED(hr))
{
return hr;
}
// write # of servers
nCount = (UINT)m_containerChildList.GetCount();
VERIFY(SUCCEEDED(pStm->Write((void*)&nCount, sizeof(UINT),&cbWrite)));
ASSERT(cbWrite == sizeof(UINT));
// loop through the list of connections and serialize them
POSITION pos;
for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
{
CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(m_containerChildList.GetNext(pos));
ASSERT(pConnectNode != NULL);
VERIFY(SUCCEEDED(pConnectNode->SaveToStream(pStm)));
}
if (fClearDirty)
SetDirtyFlag(FALSE);
return S_OK;
}
HRESULT CADSIEditRootData::IsDirty()
{
return CRootData::IsDirty();
}
BOOL CADSIEditRootData::CanCloseSheets()
{
//
// We can't do this with the new property page since it is not derived
// from the base class in MTFRMWK.
//
//return (IDCANCEL != ADSIEditMessageBox(IDS_MSG_RECORD_CLOSE_SHEET, MB_OKCANCEL));
ADSIEditMessageBox(IDS_MSG_RECORD_SHEET_LOCKED, MB_OK);
return FALSE;
}
BOOL CADSIEditRootData::OnRefresh(CComponentDataObject* pComponentData,
CNodeList* pNodeList)
{
BOOL bRet = TRUE;
if (pNodeList->GetCount() > 1) //multiple selection
{
POSITION pos = pNodeList->GetHeadPosition();
while (pos != NULL)
{
CTreeNode* pNode = pNodeList->GetNext(pos);
ASSERT(pNode != NULL);
CNodeList nodeList;
nodeList.AddTail(pNode);
if (!pNode->OnRefresh(pComponentData, &nodeList))
{
bRet = FALSE;
}
}
}
else if (pNodeList->GetCount() == 1) // single selection
{
if (IsSheetLocked())
{
if (!CanCloseSheets())
return FALSE;
pComponentData->GetPropertyPageHolderTable()->DeleteSheetsOfNode(this);
}
ASSERT(!IsSheetLocked());
POSITION pos;
for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
{
CTreeNode* pNode = m_containerChildList.GetNext(pos);
CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
ASSERT(pConnectNode != NULL);
CNodeList nodeList;
nodeList.AddTail(pNode);
pConnectNode->OnRefresh(pComponentData, &nodeList);
}
bRet = TRUE;
}
return bRet;
}