443 lines
10 KiB
C++
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;
|
||
|
}
|
||
|
|