Source code of Windows XP (NT5)
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.

780 lines
20 KiB

  1. /**********************************************************************/
  2. /** Microsoft Windows/NT **/
  3. /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
  4. /**********************************************************************/
  5. /*
  6. provider.cpp
  7. Main Mode SA node handler
  8. FILE HISTORY:
  9. */
  10. #include "stdafx.h"
  11. #include "server.h"
  12. #include "MmSA.h"
  13. #include "MmSApp.h"
  14. #include "SpdUtil.h"
  15. /*---------------------------------------------------------------------------
  16. Class CMmSAHandler implementation
  17. ---------------------------------------------------------------------------*/
  18. /*---------------------------------------------------------------------------
  19. Constructor and destructor
  20. Description
  21. Author: NSun
  22. ---------------------------------------------------------------------------*/
  23. CMmSAHandler::CMmSAHandler
  24. (
  25. ITFSComponentData * pComponentData
  26. ) : CIpsmHandler(pComponentData)
  27. {
  28. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  29. }
  30. CMmSAHandler::~CMmSAHandler()
  31. {
  32. }
  33. /*!--------------------------------------------------------------------------
  34. CMmSAHandler::InitializeNode
  35. Initializes node specific data
  36. Author: NSun
  37. ---------------------------------------------------------------------------*/
  38. HRESULT
  39. CMmSAHandler::InitializeNode
  40. (
  41. ITFSNode * pNode
  42. )
  43. {
  44. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  45. CString strTemp;
  46. strTemp.LoadString(IDS_MM_SA_NODE);
  47. SetDisplayName(strTemp);
  48. // Make the node immediately visible
  49. pNode->SetVisibilityState(TFS_VIS_SHOW);
  50. pNode->SetData(TFS_DATA_COOKIE, (LPARAM) pNode);
  51. pNode->SetData(TFS_DATA_IMAGEINDEX, ICON_IDX_FOLDER_CLOSED);
  52. pNode->SetData(TFS_DATA_OPENIMAGEINDEX, ICON_IDX_FOLDER_OPEN);
  53. pNode->SetData(TFS_DATA_USER, (LPARAM) this);
  54. pNode->SetData(TFS_DATA_TYPE, IPSECMON_MM_SA);
  55. pNode->SetData(TFS_DATA_SCOPE_LEAF_NODE, TRUE);
  56. SetColumnStringIDs(&aColumns[IPSECMON_MM_SA][0]);
  57. SetColumnWidths(&aColumnWidths[IPSECMON_MM_SA][0]);
  58. return hrOK;
  59. }
  60. /*---------------------------------------------------------------------------
  61. CMmSAHandler::GetImageIndex
  62. -
  63. Author: NSun
  64. ---------------------------------------------------------------------------*/
  65. int
  66. CMmSAHandler::GetImageIndex(BOOL bOpenImage)
  67. {
  68. int nIndex = -1;
  69. return nIndex;
  70. }
  71. /*---------------------------------------------------------------------------
  72. Overridden base handler functions
  73. ---------------------------------------------------------------------------*/
  74. /*---------------------------------------------------------------------------
  75. CMmSAHandler::OnAddMenuItems
  76. Adds context menu items for the SA scope pane node
  77. Author: NSun
  78. ---------------------------------------------------------------------------*/
  79. STDMETHODIMP
  80. CMmSAHandler::OnAddMenuItems
  81. (
  82. ITFSNode * pNode,
  83. LPCONTEXTMENUCALLBACK pContextMenuCallback,
  84. LPDATAOBJECT lpDataObject,
  85. DATA_OBJECT_TYPES type,
  86. DWORD dwType,
  87. long * pInsertionAllowed
  88. )
  89. {
  90. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  91. LONG fFlags = 0, fLoadingFlags = 0;
  92. HRESULT hr = S_OK;
  93. CString strMenuItem;
  94. if (type == CCT_SCOPE)
  95. {
  96. if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP)
  97. {
  98. }
  99. }
  100. return hr;
  101. }
  102. /*!--------------------------------------------------------------------------
  103. CMmSAHandler::AddMenuItems
  104. Adds context menu items for virtual list box (result pane) items
  105. Author: NSun
  106. ---------------------------------------------------------------------------*/
  107. STDMETHODIMP
  108. CMmSAHandler::AddMenuItems
  109. (
  110. ITFSComponent * pComponent,
  111. MMC_COOKIE cookie,
  112. LPDATAOBJECT pDataObject,
  113. LPCONTEXTMENUCALLBACK pContextMenuCallback,
  114. long * pInsertionAllowed
  115. )
  116. {
  117. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  118. HRESULT hr = hrOK;
  119. CString strMenuItem;
  120. SPINTERNAL spInternal;
  121. LONG fFlags = 0;
  122. spInternal = ExtractInternalFormat(pDataObject);
  123. // virtual listbox notifications come to the handler of the node that is selected.
  124. // check to see if this notification is for a virtual listbox item or this SA
  125. // node itself.
  126. if (*pInsertionAllowed & CCM_INSERTIONALLOWED_VIEW)
  127. {
  128. //load and view menu items here
  129. }
  130. return hr;
  131. }
  132. /*!--------------------------------------------------------------------------
  133. CMmSAHandler::OnRefresh
  134. Default implementation for the refresh functionality
  135. Author: NSun
  136. ---------------------------------------------------------------------------*/
  137. HRESULT
  138. CMmSAHandler::OnRefresh
  139. (
  140. ITFSNode * pNode,
  141. LPDATAOBJECT pDataObject,
  142. DWORD dwType,
  143. LPARAM arg,
  144. LPARAM param
  145. )
  146. {
  147. HRESULT hr = S_OK;
  148. int i = 0;
  149. SPIConsole spConsole;
  150. CORg(CHandler::OnRefresh(pNode, pDataObject, dwType, arg, param));
  151. CORg(m_spSpdInfo->EnumMmSAs());
  152. i = m_spSpdInfo->GetMmSACount();
  153. // now notify the virtual listbox
  154. CORg ( m_spNodeMgr->GetConsole(&spConsole) );
  155. CORg ( spConsole->UpdateAllViews(pDataObject, i, RESULT_PANE_SET_VIRTUAL_LB_SIZE));
  156. Error:
  157. return hr;
  158. }
  159. /*---------------------------------------------------------------------------
  160. CMmSAHandler::OnCommand
  161. Handles context menu commands for SA scope pane node
  162. Author: NSun
  163. ---------------------------------------------------------------------------*/
  164. STDMETHODIMP
  165. CMmSAHandler::OnCommand
  166. (
  167. ITFSNode * pNode,
  168. long nCommandId,
  169. DATA_OBJECT_TYPES type,
  170. LPDATAOBJECT pDataObject,
  171. DWORD dwType
  172. )
  173. {
  174. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  175. //handle the scope context menu commands here
  176. return S_OK;
  177. }
  178. /*!--------------------------------------------------------------------------
  179. CMmSAHandler::Command
  180. Handles context menu commands for virtual listbox items
  181. Author: NSun
  182. ---------------------------------------------------------------------------*/
  183. STDMETHODIMP
  184. CMmSAHandler::Command
  185. (
  186. ITFSComponent * pComponent,
  187. MMC_COOKIE cookie,
  188. int nCommandID,
  189. LPDATAOBJECT pDataObject
  190. )
  191. {
  192. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  193. HRESULT hr = S_OK;
  194. SPITFSNode spNode;
  195. m_spResultNodeMgr->FindNode(cookie, &spNode);
  196. // handle result context menu and view menus here
  197. return hr;
  198. }
  199. /*---------------------------------------------------------------------------
  200. CMmSAHandler::OnPropertyChange
  201. Description
  202. Author: NSun
  203. ---------------------------------------------------------------------------*/
  204. HRESULT
  205. CMmSAHandler::OnPropertyChange
  206. (
  207. ITFSNode * pNode,
  208. LPDATAOBJECT pDataobject,
  209. DWORD dwType,
  210. LPARAM arg,
  211. LPARAM lParam
  212. )
  213. {
  214. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  215. //CServerProperties * pServerProp = reinterpret_cast<CServerProperties *>(lParam);
  216. LONG_PTR changeMask = 0;
  217. // tell the property page to do whatever now that we are back on the
  218. // main thread
  219. //pServerProp->OnPropertyChange(TRUE, &changeMask);
  220. //pServerProp->AcknowledgeNotify();
  221. if (changeMask)
  222. pNode->ChangeNode(changeMask);
  223. return hrOK;
  224. }
  225. /*---------------------------------------------------------------------------
  226. CMmSAHandler::OnExpand
  227. Handles enumeration of a scope item
  228. Author: NSun
  229. ---------------------------------------------------------------------------*/
  230. HRESULT
  231. CMmSAHandler::OnExpand
  232. (
  233. ITFSNode * pNode,
  234. LPDATAOBJECT pDataObject,
  235. DWORD dwType,
  236. LPARAM arg,
  237. LPARAM param
  238. )
  239. {
  240. HRESULT hr = hrOK;
  241. if (m_bExpanded)
  242. return hr;
  243. // do the default handling
  244. CORg (CIpsmHandler::OnExpand(pNode, pDataObject, dwType, arg, param));
  245. Error:
  246. return hr;
  247. }
  248. /*!--------------------------------------------------------------------------
  249. CMmSAHandler::OnResultSelect
  250. Handles the MMCN_SELECT notifcation
  251. Author: NSun
  252. ---------------------------------------------------------------------------*/
  253. HRESULT
  254. CMmSAHandler::OnResultSelect
  255. (
  256. ITFSComponent * pComponent,
  257. LPDATAOBJECT pDataObject,
  258. MMC_COOKIE cookie,
  259. LPARAM arg,
  260. LPARAM lParam
  261. )
  262. {
  263. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  264. HRESULT hr = hrOK;
  265. SPINTERNAL spInternal;
  266. SPIConsole spConsole;
  267. SPIConsoleVerb spConsoleVerb;
  268. SPITFSNode spNode;
  269. BOOL bStates[ARRAYLEN(g_ConsoleVerbs)];
  270. int i;
  271. LONG_PTR dwNodeType;
  272. BOOL fSelect = HIWORD(arg);
  273. // virtual listbox notifications come to the handler of the node that is selected.
  274. // check to see if this notification is for a virtual listbox item or the active
  275. // registrations node itself.
  276. CORg (pComponent->GetConsoleVerb(&spConsoleVerb));
  277. m_verbDefault = MMC_VERB_OPEN;
  278. if (!fSelect)
  279. {
  280. return hr;
  281. }
  282. if (m_spSpdInfo)
  283. {
  284. DWORD dwInitInfo;
  285. dwInitInfo=m_spSpdInfo->GetInitInfo();
  286. if (!(dwInitInfo & MON_MM_SA)) {
  287. CORg(m_spSpdInfo->EnumMmSAs());
  288. m_spSpdInfo->SetInitInfo(dwInitInfo | MON_MM_SA);
  289. }
  290. m_spSpdInfo->SetActiveInfo(MON_MM_SA);
  291. // Get the current count
  292. i = m_spSpdInfo->GetMmSACount();
  293. // now notify the virtual listbox
  294. CORg ( m_spNodeMgr->GetConsole(&spConsole) );
  295. CORg ( spConsole->UpdateAllViews(pDataObject, i, RESULT_PANE_SET_VIRTUAL_LB_SIZE) );
  296. }
  297. // now update the verbs...
  298. spInternal = ExtractInternalFormat(pDataObject);
  299. Assert(spInternal);
  300. if (spInternal->HasVirtualIndex())
  301. {
  302. //TODO add to here if we want to have some result console verbs
  303. // we gotta do special stuff for the virtual index items
  304. dwNodeType = IPSECMON_MM_SA_ITEM;
  305. for (i = 0; i < ARRAYLEN(g_ConsoleVerbs); bStates[i++] = FALSE);
  306. //enable the "properties" menu
  307. bStates[MMC_VERB_PROPERTIES & 0x000F] = TRUE;
  308. m_verbDefault = MMC_VERB_PROPERTIES;
  309. }
  310. else
  311. {
  312. // enable/disable delete depending if the node supports it
  313. CORg (m_spNodeMgr->FindNode(cookie, &spNode));
  314. dwNodeType = spNode->GetData(TFS_DATA_TYPE);
  315. for (i = 0; i < ARRAYLEN(g_ConsoleVerbs); bStates[i++] = TRUE);
  316. //hide "delete" context menu
  317. bStates[MMC_VERB_DELETE & 0x000F] = FALSE;
  318. }
  319. EnableVerbs(spConsoleVerb, g_ConsoleVerbStates[dwNodeType], bStates);
  320. COM_PROTECT_ERROR_LABEL;
  321. return hr;
  322. }
  323. /*!--------------------------------------------------------------------------
  324. CMmSAHandler::OnDelete
  325. The base handler calls this when MMC sends a MMCN_DELETE for a
  326. scope pane item. We just call our delete command handler.
  327. Author: NSun
  328. ---------------------------------------------------------------------------*/
  329. HRESULT
  330. CMmSAHandler::OnDelete
  331. (
  332. ITFSNode * pNode,
  333. LPARAM arg,
  334. LPARAM lParam
  335. )
  336. {
  337. return S_FALSE;
  338. }
  339. /*!--------------------------------------------------------------------------
  340. CMmSAHandler::HasPropertyPages
  341. Handle the result notification
  342. Author: NSun
  343. ---------------------------------------------------------------------------*/
  344. STDMETHODIMP
  345. CMmSAHandler::HasPropertyPages(
  346. ITFSComponent *pComponent,
  347. MMC_COOKIE cookie,
  348. LPDATAOBJECT pDataObject)
  349. {
  350. return hrOK;
  351. }
  352. /*!--------------------------------------------------------------------------
  353. CMmSAHandler::HasPropertyPages
  354. Handle the result notification. Create the filter property sheet
  355. Author: NSun
  356. ---------------------------------------------------------------------------*/
  357. STDMETHODIMP CMmSAHandler::CreatePropertyPages
  358. (
  359. ITFSComponent * pComponent,
  360. MMC_COOKIE cookie,
  361. LPPROPERTYSHEETCALLBACK lpProvider,
  362. LPDATAOBJECT pDataObject,
  363. LONG_PTR handle
  364. )
  365. {
  366. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  367. HRESULT hr = hrOK;
  368. SPINTERNAL spInternal;
  369. SPITFSNode spNode;
  370. int nIndex;
  371. SPIComponentData spComponentData;
  372. CMmSA sa;
  373. CMmSAProperties * pProp;
  374. Assert(m_spNodeMgr);
  375. CORg( m_spNodeMgr->FindNode(cookie, &spNode) );
  376. CORg( m_spNodeMgr->GetComponentData(&spComponentData) );
  377. spInternal = ExtractInternalFormat(pDataObject);
  378. // virtual listbox notifications come to the handler of the node that is selected.
  379. // assert that this notification is for a virtual listbox item
  380. Assert(spInternal);
  381. if (!spInternal->HasVirtualIndex())
  382. return hr;
  383. nIndex = spInternal->GetVirtualIndex();
  384. CORg(m_spSpdInfo->GetMmSAInfo(nIndex, &sa));
  385. pProp = new CMmSAProperties(
  386. spNode,
  387. spComponentData,
  388. m_spTFSCompData,
  389. &sa,
  390. m_spSpdInfo,
  391. NULL);
  392. hr = pProp->CreateModelessSheet(lpProvider, handle);
  393. COM_PROTECT_ERROR_LABEL;
  394. return hr;
  395. }
  396. /*---------------------------------------------------------------------------
  397. CMmSAHandler::OnGetResultViewType
  398. Return the result view that this node is going to support
  399. Author: NSun
  400. ---------------------------------------------------------------------------*/
  401. HRESULT
  402. CMmSAHandler::OnGetResultViewType
  403. (
  404. ITFSComponent * pComponent,
  405. MMC_COOKIE cookie,
  406. LPOLESTR * ppViewType,
  407. long * pViewOptions
  408. )
  409. {
  410. if (cookie != NULL)
  411. {
  412. *pViewOptions = MMC_VIEW_OPTIONS_OWNERDATALIST;
  413. }
  414. return S_FALSE;
  415. }
  416. /*---------------------------------------------------------------------------
  417. CMmSAHandler::GetVirtualImage
  418. Returns the image index for virtual listbox items
  419. Author: NSun
  420. ---------------------------------------------------------------------------*/
  421. int
  422. CMmSAHandler::GetVirtualImage
  423. (
  424. int nIndex
  425. )
  426. {
  427. return ICON_IDX_FILTER;
  428. }
  429. /*---------------------------------------------------------------------------
  430. CMmSAHandler::GetVirtualString
  431. returns a pointer to the string for virtual listbox items
  432. Author: NSun
  433. ---------------------------------------------------------------------------*/
  434. LPCWSTR
  435. CMmSAHandler::GetVirtualString
  436. (
  437. int nIndex,
  438. int nCol
  439. )
  440. {
  441. HRESULT hr = S_OK;
  442. static CString strTemp;
  443. strTemp.Empty();
  444. if (nCol >= DimensionOf(aColumns[IPSECMON_MM_SA]))
  445. return NULL;
  446. CMmSA sa;
  447. CORg(m_spSpdInfo->GetMmSAInfo(nIndex, &sa));
  448. switch (aColumns[IPSECMON_MM_SA][nCol])
  449. {
  450. case IDS_COL_MM_SA_ME:
  451. AddressToString(sa.m_MeAddr, &strTemp);
  452. return strTemp;
  453. break;
  454. case IDS_COL_MM_SA_PEER:
  455. AddressToString(sa.m_PeerAddr, &strTemp);
  456. return strTemp;
  457. break;
  458. case IDS_COL_MM_SA_AUTH:
  459. MmAuthToString(sa.m_Auth, &strTemp);
  460. return strTemp;
  461. break;
  462. case IDS_COL_MM_SA_ENCRYPITON:
  463. DoiEspAlgorithmToString(sa.m_SelectedOffer.m_EncryptionAlgorithm, &strTemp);
  464. return strTemp;
  465. break;
  466. case IDS_COL_MM_SA_INTEGRITY:
  467. DoiAuthAlgorithmToString(sa.m_SelectedOffer.m_HashingAlgorithm, &strTemp);
  468. return strTemp;
  469. break;
  470. case IDS_COL_MM_SA_DH:
  471. DhGroupToString(sa.m_SelectedOffer.m_dwDHGroup, &strTemp);
  472. return strTemp;
  473. break;
  474. default:
  475. Panic0("CMmSAHandler::GetVirtualString - Unknown column!\n");
  476. break;
  477. }
  478. COM_PROTECT_ERROR_LABEL;
  479. return NULL;
  480. }
  481. /*---------------------------------------------------------------------------
  482. CMmSAHandler::CacheHint
  483. MMC tells us which items it will need before it requests things
  484. Author: NSun
  485. ---------------------------------------------------------------------------*/
  486. STDMETHODIMP
  487. CMmSAHandler::CacheHint
  488. (
  489. int nStartIndex,
  490. int nEndIndex
  491. )
  492. {
  493. HRESULT hr = hrOK;;
  494. Trace2("CacheHint - Start %d, End %d\n", nStartIndex, nEndIndex);
  495. return hr;
  496. }
  497. /*---------------------------------------------------------------------------
  498. CMmSAHandler::SortItems
  499. We are responsible for sorting of virtual listbox items
  500. Author: NSun
  501. ---------------------------------------------------------------------------*/
  502. STDMETHODIMP
  503. CMmSAHandler::SortItems
  504. (
  505. int nColumn,
  506. DWORD dwSortOptions,
  507. LPARAM lUserParam
  508. )
  509. {
  510. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  511. if (nColumn >= DimensionOf(aColumns[IPSECMON_MM_SA]))
  512. return E_INVALIDARG;
  513. BEGIN_WAIT_CURSOR
  514. DWORD dwIndexType = aColumns[IPSECMON_MM_SA][nColumn];
  515. m_spSpdInfo->SortMmSAs(dwIndexType, dwSortOptions);
  516. END_WAIT_CURSOR
  517. return hrOK;
  518. }
  519. /*!--------------------------------------------------------------------------
  520. CMmSAHandler::OnResultUpdateView
  521. Implementation of ITFSResultHandler::OnResultUpdateView
  522. Author: NSun
  523. ---------------------------------------------------------------------------*/
  524. HRESULT CMmSAHandler::OnResultUpdateView
  525. (
  526. ITFSComponent *pComponent,
  527. LPDATAOBJECT pDataObject,
  528. LPARAM data,
  529. LONG_PTR hint
  530. )
  531. {
  532. HRESULT hr = hrOK;
  533. SPITFSNode spSelectedNode;
  534. pComponent->GetSelectedNode(&spSelectedNode);
  535. if (spSelectedNode == NULL)
  536. return S_OK; // no selection for our IComponentData
  537. if ( hint == IPSECMON_UPDATE_STATUS )
  538. {
  539. SPINTERNAL spInternal = ExtractInternalFormat(pDataObject);
  540. ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie);
  541. SPITFSNode spSelectedNode;
  542. pComponent->GetSelectedNode(&spSelectedNode);
  543. if (pNode == spSelectedNode)
  544. {
  545. // if we are the selected node, then we need to update
  546. SPIResultData spResultData;
  547. CORg (pComponent->GetResultData(&spResultData));
  548. CORg (spResultData->SetItemCount((int) data, MMCLV_UPDATE_NOSCROLL));
  549. }
  550. }
  551. else
  552. {
  553. // we don't handle this message, let the base class do it.
  554. return CIpsmHandler::OnResultUpdateView(pComponent, pDataObject, data, hint);
  555. }
  556. COM_PROTECT_ERROR_LABEL;
  557. return hr;
  558. }
  559. /*!--------------------------------------------------------------------------
  560. CMmSAHandler::LoadColumns
  561. Set the correct column header and then call the base class
  562. Author: NSun
  563. ---------------------------------------------------------------------------*/
  564. HRESULT
  565. CMmSAHandler::LoadColumns
  566. (
  567. ITFSComponent * pComponent,
  568. MMC_COOKIE cookie,
  569. LPARAM arg,
  570. LPARAM lParam
  571. )
  572. {
  573. //set column info
  574. return CIpsmHandler::LoadColumns(pComponent, cookie, arg, lParam);
  575. }
  576. /*---------------------------------------------------------------------------
  577. Command handlers
  578. ---------------------------------------------------------------------------*/
  579. /*---------------------------------------------------------------------------
  580. CMmSAHandler::OnDelete
  581. Removes a service SA
  582. Author: NSun
  583. ---------------------------------------------------------------------------*/
  584. HRESULT
  585. CMmSAHandler::OnDelete
  586. (
  587. ITFSNode * pNode
  588. )
  589. {
  590. HRESULT hr = S_FALSE;
  591. return hr;
  592. }
  593. /*---------------------------------------------------------------------------
  594. CMmSAHandler::UpdateStatus
  595. -
  596. Author: NSun
  597. ---------------------------------------------------------------------------*/
  598. HRESULT
  599. CMmSAHandler::UpdateStatus
  600. (
  601. ITFSNode * pNode
  602. )
  603. {
  604. HRESULT hr = hrOK;
  605. SPIComponentData spComponentData;
  606. SPIConsole spConsole;
  607. IDataObject * pDataObject;
  608. SPIDataObject spDataObject;
  609. int i = 0;
  610. Trace0("CMmSAHandler::UpdateStatus - Updating status for Filter");
  611. // force the listbox to update. We do this by setting the count and
  612. // telling it to invalidate the data
  613. CORg(m_spNodeMgr->GetComponentData(&spComponentData));
  614. CORg(m_spNodeMgr->GetConsole(&spConsole));
  615. // grab a data object to use
  616. CORg(spComponentData->QueryDataObject((MMC_COOKIE) pNode, CCT_RESULT, &pDataObject) );
  617. spDataObject = pDataObject;
  618. i = m_spSpdInfo->GetMmSACount();
  619. CORg(spConsole->UpdateAllViews(pDataObject, i, IPSECMON_UPDATE_STATUS));
  620. COM_PROTECT_ERROR_LABEL;
  621. return hr;
  622. }
  623. /*---------------------------------------------------------------------------
  624. Misc functions
  625. ---------------------------------------------------------------------------*/
  626. /*---------------------------------------------------------------------------
  627. CMmSAHandler::InitData
  628. Initializes data for this node
  629. Author: NSun
  630. ---------------------------------------------------------------------------*/
  631. HRESULT
  632. CMmSAHandler::InitData
  633. (
  634. ISpdInfo * pSpdInfo
  635. )
  636. {
  637. m_spSpdInfo.Set(pSpdInfo);
  638. return hrOK;
  639. }