Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

444 lines
11 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1998 - 1999
  6. //
  7. // File: snapdata.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. #include "pch.h"
  11. #include <SnapBase.h>
  12. #include "resource.h"
  13. #include "adsiedit.h"
  14. #include "editor.h"
  15. #include "connection.h"
  16. #include "connectionui.h"
  17. #include "snapdata.h"
  18. #ifdef DEBUG_ALLOCATOR
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. #endif
  25. BEGIN_MENU(CADSIEditRootMenuHolder)
  26. BEGIN_CTX
  27. CTX_ENTRY_TOP(IDM_CONNECT_TO, L"_ADSIEDIT_CONNECTTO")
  28. END_CTX
  29. BEGIN_RES
  30. RES_ENTRY(IDS_CONNECT_TO)
  31. END_RES
  32. END_MENU
  33. BEGIN_MENU(CADSIEditConnectMenuHolder)
  34. BEGIN_CTX
  35. CTX_ENTRY_VIEW(IDM_FILTER, L"_ADSIEDIT_FILTER")
  36. CTX_ENTRY_TOP(IDM_SETTINGS_CONNECTION, L"_ADSIEDIT_SETTINGS")
  37. CTX_ENTRY_TOP(IDM_REMOVE_CONNECTION, L"_ADSIEDIT_REMOVE")
  38. CTX_ENTRY_TOP(IDM_UPDATE_SCHEMA, L"_ADSIEDIT_UPDATE")
  39. CTX_ENTRY_NEW(IDM_NEW_QUERY, L"_ADSIEDIT_NEWQUERY")
  40. END_CTX
  41. BEGIN_RES
  42. RES_ENTRY(IDS_FILTER)
  43. RES_ENTRY(IDS_SETTINGS_CONNECTION)
  44. RES_ENTRY(IDS_REMOVE_CONNECTION)
  45. RES_ENTRY(IDS_UPDATE_SCHEMA)
  46. RES_ENTRY(IDS_NEW_QUERY)
  47. END_RES
  48. END_MENU
  49. BEGIN_MENU(CADSIEditContainerMenuHolder)
  50. BEGIN_CTX
  51. CTX_ENTRY_NEW(IDM_NEW_OBJECT, L"_ADSIEDIT_NEWOBJECT")
  52. CTX_ENTRY_TOP(IDM_MOVE, L"_ADSIEDIT_MOVE")
  53. CTX_ENTRY_TOP(IDM_NEW_CONNECT_FROM_HERE, L"_ADSIEDIT_CONNECTFROMHERE")
  54. END_CTX
  55. BEGIN_RES
  56. RES_ENTRY(IDS_NEW_OBJECT)
  57. RES_ENTRY(IDS_MOVE)
  58. RES_ENTRY(IDS_NEW_CONNECT_FROM_HERE)
  59. END_RES
  60. END_MENU
  61. BEGIN_MENU(CADSIEditLeafMenuHolder)
  62. BEGIN_CTX
  63. CTX_ENTRY_TOP(IDM_MOVE, L"_ADSIEDIT_MOVE")
  64. CTX_ENTRY_TOP(IDM_NEW_NC_CONNECT_FROM_HERE, L"_ADSIEDIT_CONNECTTONCFROMHERE")
  65. END_CTX
  66. BEGIN_RES
  67. RES_ENTRY(IDS_MOVE)
  68. RES_ENTRY(IDS_NEW_CONNECT_TO_NC_FROM_HERE)
  69. END_RES
  70. END_MENU
  71. BEGIN_MENU(CADSIEditQueryMenuHolder)
  72. BEGIN_CTX
  73. CTX_ENTRY_TOP(IDM_SETTINGS_QUERY, L"_ADSIEDIT_QUERYSETTINGS")
  74. CTX_ENTRY_TOP(IDM_REMOVE_QUERY, L"_ADSIEDIT_REMOVE")
  75. END_CTX
  76. BEGIN_RES
  77. RES_ENTRY(IDS_SETTINGS_QUERY)
  78. RES_ENTRY(IDS_REMOVE_QUERY)
  79. END_RES
  80. END_MENU
  81. //////////////////////////////////////////////////////////////////////
  82. // CADSIEditRootData
  83. // {D4F3374F-052F-11d2-97B0-00A0C9A06D2D}
  84. const GUID CADSIEditRootData::NodeTypeGUID =
  85. { 0xd4f3374f, 0x52f, 0x11d2, { 0x97, 0xb0, 0x0, 0xa0, 0xc9, 0xa0, 0x6d, 0x2d } };
  86. CADSIEditRootData::CADSIEditRootData(CComponentDataObject* pComponentData)
  87. : CRootData(pComponentData)
  88. {
  89. m_szDescriptionText = L"";
  90. }
  91. CADSIEditRootData::~CADSIEditRootData()
  92. {
  93. TRACE(_T("~CADSIEditRootData(), name <%s>\n"),GetDisplayName());
  94. }
  95. HRESULT CADSIEditRootData::LoadMRUs(IStream* pStm)
  96. {
  97. HRESULT hr = LoadStringListFromStream(pStm, m_sDNMRU);
  98. if (FAILED(hr))
  99. {
  100. return hr;
  101. }
  102. hr = LoadStringListFromStream(pStm, m_sServerMRU);
  103. return hr;
  104. }
  105. HRESULT CADSIEditRootData::SaveMRUs(IStream* pStm)
  106. {
  107. HRESULT hr = SaveStringListToStream(pStm, m_sDNMRU);
  108. if (FAILED(hr))
  109. {
  110. return hr;
  111. }
  112. hr = SaveStringListToStream(pStm, m_sServerMRU);
  113. return hr;
  114. }
  115. BOOL CADSIEditRootData::FindNode(LPCWSTR lpszPath, CList<CTreeNode*, CTreeNode*>& nodeList)
  116. {
  117. BOOL bFound = FALSE;
  118. POSITION pos;
  119. for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
  120. {
  121. CTreeNode* pNode = m_containerChildList.GetNext(pos);
  122. CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
  123. ASSERT(pConnectNode != NULL);
  124. CTreeNode* pFoundNode;
  125. BOOL bTemp;
  126. bTemp = pConnectNode->FindNode(lpszPath, nodeList);
  127. if (!bFound)
  128. {
  129. bFound = bTemp;
  130. }
  131. }
  132. return bFound;
  133. }
  134. BOOL CADSIEditRootData::OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem,
  135. long *pInsertionAllowed)
  136. {
  137. //
  138. // Single selection
  139. //
  140. if (pContextMenuItem->lCommandID == IDM_CONNECT_TO)
  141. {
  142. return TRUE;
  143. }
  144. return FALSE;
  145. }
  146. BOOL CADSIEditRootData::OnSetRefreshVerbState(DATA_OBJECT_TYPES type,
  147. BOOL* pbHide,
  148. CNodeList* pNodeList)
  149. {
  150. *pbHide = FALSE;
  151. return !IsThreadLocked();
  152. }
  153. HRESULT CADSIEditRootData::OnCommand(long nCommandID,
  154. DATA_OBJECT_TYPES type,
  155. CComponentDataObject* pComponentData,
  156. CNodeList* pNodeList)
  157. {
  158. if (pNodeList->GetCount() == 1) // single selection
  159. {
  160. switch (nCommandID)
  161. {
  162. case IDM_CONNECT_TO :
  163. OnConnectTo(pComponentData);
  164. break;
  165. default:
  166. ASSERT(FALSE); // Unknown command!
  167. return E_FAIL;
  168. }
  169. }
  170. else if (pNodeList->GetCount() > 1) // multiple selection
  171. {
  172. switch (nCommandID)
  173. {
  174. case IDM_REMOVE_CONNECTION :
  175. {
  176. POSITION pos = pNodeList->GetHeadPosition();
  177. while (pos != NULL)
  178. {
  179. CTreeNode* pNode = pNodeList->GetNext(pos);
  180. ASSERT(pNode != NULL);
  181. CADSIEditConnectionNode* pConnectionNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
  182. ASSERT(pConnectionNode != NULL);
  183. pConnectionNode->OnRemove(pComponentData);
  184. }
  185. break;
  186. }
  187. default :
  188. ASSERT(FALSE);
  189. return E_FAIL;
  190. }
  191. }
  192. return S_OK;
  193. }
  194. void CADSIEditRootData::OnConnectTo(CComponentDataObject* pComponentData)
  195. {
  196. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  197. CThemeContextActivator activator;
  198. CString s, sPath;
  199. BSTR bstrPath;
  200. CConnectionData* pConnectData = NULL;
  201. CADSIEditConnectDialog pConnectDialog(NULL,
  202. this,
  203. pComponentData,
  204. pConnectData);
  205. pConnectDialog.DoModal();
  206. //Change the result pane if this is the first child being added
  207. pComponentData->UpdateResultPaneView(this);
  208. }
  209. HRESULT CADSIEditRootData::GetResultViewType(LPOLESTR* ppViewType, long* pViewOptions)
  210. {
  211. HRESULT hr = S_FALSE;
  212. if (m_containerChildList.IsEmpty() && m_leafChildList.IsEmpty())
  213. {
  214. *pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
  215. LPOLESTR psz = NULL;
  216. StringFromCLSID(CLSID_MessageView, &psz);
  217. USES_CONVERSION;
  218. if (psz != NULL)
  219. {
  220. *ppViewType = psz;
  221. hr = S_OK;
  222. }
  223. }
  224. else
  225. {
  226. *pViewOptions = MMC_VIEW_OPTIONS_MULTISELECT;
  227. *ppViewType = NULL;
  228. hr = S_FALSE;
  229. }
  230. return hr;
  231. }
  232. HRESULT CADSIEditRootData::OnShow(LPCONSOLE lpConsole)
  233. {
  234. CComPtr<IUnknown> spUnknown;
  235. CComPtr<IMessageView> spMessageView;
  236. HRESULT hr = lpConsole->QueryResultView(&spUnknown);
  237. if (FAILED(hr))
  238. return S_OK;
  239. hr = spUnknown->QueryInterface(IID_IMessageView, (PVOID*)&spMessageView);
  240. if (SUCCEEDED(hr))
  241. {
  242. CString szTitle, szMessage;
  243. IconIdentifier iconID;
  244. VERIFY(szTitle.LoadString(IDS_MESSAGE_VIEW_NO_CONNECTIONS_TITLE));
  245. VERIFY(szMessage.LoadString(IDS_MESSAGE_VIEW_NO_CONNECTIONS_MESSAGE));
  246. iconID = Icon_Information;
  247. spMessageView->SetTitleText(szTitle);
  248. spMessageView->SetBodyText(szMessage);
  249. spMessageView->SetIcon(iconID);
  250. }
  251. return S_OK;
  252. }
  253. #define ADSIEDIT_STREAM_VERSION (12)
  254. // IStream manipulation helpers overrides
  255. HRESULT CADSIEditRootData::Load(IStream* pStm)
  256. {
  257. //
  258. // assume never get multiple loads
  259. //
  260. if(!m_containerChildList.IsEmpty() || !m_leafChildList.IsEmpty())
  261. return E_FAIL;
  262. WCHAR szBuffer[256]; // REVIEW_MARCOC: hardcoded
  263. ULONG nLen; // WCHAR counting NULL
  264. UINT nCount;
  265. ULONG cbRead;
  266. // read the version ##
  267. DWORD dwVersion;
  268. VERIFY(SUCCEEDED(pStm->Read((void*)&dwVersion,sizeof(DWORD), &cbRead)));
  269. ASSERT(cbRead == sizeof(DWORD));
  270. if (dwVersion != ADSIEDIT_STREAM_VERSION)
  271. return E_FAIL;
  272. HRESULT hr = LoadMRUs(pStm);
  273. if (FAILED(hr))
  274. {
  275. return hr;
  276. }
  277. // load the list of connections
  278. VERIFY(SUCCEEDED(pStm->Read((void*)&nCount,sizeof(UINT), &cbRead)));
  279. ASSERT(cbRead == sizeof(UINT));
  280. CComponentDataObject* pComponentData = GetComponentDataObject();
  281. for (int k=0; k< (int)nCount; k++)
  282. {
  283. CADSIEditConnectionNode* p = NULL;
  284. VERIFY(SUCCEEDED(CADSIEditConnectionNode::CreateFromStream(pStm, &p)));
  285. ASSERT(p != NULL);
  286. VERIFY(AddChildToList(p));
  287. }
  288. if (nCount > 0)
  289. MarkEnumerated();
  290. ASSERT(m_containerChildList.GetCount() == (int)nCount);
  291. return S_OK;
  292. }
  293. HRESULT CADSIEditRootData::Save(IStream* pStm, BOOL fClearDirty)
  294. {
  295. UINT nCount;
  296. ULONG cbWrite;
  297. // write the version ##
  298. DWORD dwVersion = ADSIEDIT_STREAM_VERSION;
  299. VERIFY(SUCCEEDED(pStm->Write((void*)&dwVersion, sizeof(DWORD),&cbWrite)));
  300. ASSERT(cbWrite == sizeof(DWORD));
  301. HRESULT hr = SaveMRUs(pStm);
  302. if (FAILED(hr))
  303. {
  304. return hr;
  305. }
  306. // write # of servers
  307. nCount = (UINT)m_containerChildList.GetCount();
  308. VERIFY(SUCCEEDED(pStm->Write((void*)&nCount, sizeof(UINT),&cbWrite)));
  309. ASSERT(cbWrite == sizeof(UINT));
  310. // loop through the list of connections and serialize them
  311. POSITION pos;
  312. for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
  313. {
  314. CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(m_containerChildList.GetNext(pos));
  315. ASSERT(pConnectNode != NULL);
  316. VERIFY(SUCCEEDED(pConnectNode->SaveToStream(pStm)));
  317. }
  318. if (fClearDirty)
  319. SetDirtyFlag(FALSE);
  320. return S_OK;
  321. }
  322. HRESULT CADSIEditRootData::IsDirty()
  323. {
  324. return CRootData::IsDirty();
  325. }
  326. BOOL CADSIEditRootData::CanCloseSheets()
  327. {
  328. //
  329. // We can't do this with the new property page since it is not derived
  330. // from the base class in MTFRMWK.
  331. //
  332. //return (IDCANCEL != ADSIEditMessageBox(IDS_MSG_RECORD_CLOSE_SHEET, MB_OKCANCEL));
  333. ADSIEditMessageBox(IDS_MSG_RECORD_SHEET_LOCKED, MB_OK);
  334. return FALSE;
  335. }
  336. BOOL CADSIEditRootData::OnRefresh(CComponentDataObject* pComponentData,
  337. CNodeList* pNodeList)
  338. {
  339. BOOL bRet = TRUE;
  340. if (pNodeList->GetCount() > 1) //multiple selection
  341. {
  342. POSITION pos = pNodeList->GetHeadPosition();
  343. while (pos != NULL)
  344. {
  345. CTreeNode* pNode = pNodeList->GetNext(pos);
  346. ASSERT(pNode != NULL);
  347. CNodeList nodeList;
  348. nodeList.AddTail(pNode);
  349. if (!pNode->OnRefresh(pComponentData, &nodeList))
  350. {
  351. bRet = FALSE;
  352. }
  353. }
  354. }
  355. else if (pNodeList->GetCount() == 1) // single selection
  356. {
  357. if (IsSheetLocked())
  358. {
  359. if (!CanCloseSheets())
  360. return FALSE;
  361. pComponentData->GetPropertyPageHolderTable()->DeleteSheetsOfNode(this);
  362. }
  363. ASSERT(!IsSheetLocked());
  364. POSITION pos;
  365. for (pos = m_containerChildList.GetHeadPosition(); pos != NULL; )
  366. {
  367. CTreeNode* pNode = m_containerChildList.GetNext(pos);
  368. CADSIEditConnectionNode* pConnectNode = dynamic_cast<CADSIEditConnectionNode*>(pNode);
  369. ASSERT(pConnectNode != NULL);
  370. CNodeList nodeList;
  371. nodeList.AddTail(pNode);
  372. pConnectNode->OnRefresh(pComponentData, &nodeList);
  373. }
  374. bRet = TRUE;
  375. }
  376. return bRet;
  377. }