//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: snapdata.cpp // //-------------------------------------------------------------------------- #include "pch.h" #include #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& nodeList) { BOOL bFound = FALSE; POSITION pos; for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; ) { CTreeNode* pNode = m_containerChildList.GetNext(pos); CADSIEditConnectionNode* pConnectNode = dynamic_cast(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(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 spUnknown; CComPtr 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(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(pNode); ASSERT(pConnectNode != NULL); CNodeList nodeList; nodeList.AddTail(pNode); pConnectNode->OnRefresh(pComponentData, &nodeList); } bRet = TRUE; } return bRet; }