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.

820 lines
20 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: agent.CXX
  7. //
  8. // Contents:
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // History: 11-21-1996 JohannP (Johann Posch) Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #include <agent.h>
  18. COInetAdvisor *g_pCOInetAdvisor = 0;
  19. //+---------------------------------------------------------------------------
  20. //
  21. // Function: GetOInetAdvisor
  22. //
  23. // Synopsis:
  24. //
  25. // Arguments: [dwMode] --
  26. // [ppOInetAdvisor] --
  27. // [dwReserved] --
  28. //
  29. // Returns:
  30. //
  31. // History: 11-07-1996 JohannP (Johann Posch) Created
  32. //
  33. // Notes:
  34. //
  35. //----------------------------------------------------------------------------
  36. HRESULT GetOInetAdvisor(DWORD dwMode, IOInetAdvisor **ppOInetAdvisor, DWORD dwReserved)
  37. {
  38. HRESULT hr = NOERROR;
  39. TransDebugOut((DEB_SESSION, "API _IN GetOInetAdvisor\n"));
  40. TransAssert(( (ppOInetAdvisor != NULL) && (dwMode == 0) && (dwReserved == 0) && "Invalid argument"));
  41. if (ppOInetAdvisor && !dwMode && !dwReserved)
  42. {
  43. /*
  44. if (g_pCOInetAdvisor == 0)
  45. {
  46. g_pCOInetAdvisor = new COInetAdvisor();
  47. }
  48. if (g_pCOInetAdvisor)
  49. {
  50. g_pCOInetAdvisor->AddRef();
  51. *ppOInetAdvisor = g_pCOInetAdvisor;
  52. }
  53. else
  54. {
  55. hr = E_OUTOFMEMORY;
  56. }
  57. */
  58. }
  59. else
  60. {
  61. hr = E_INVALIDARG;
  62. }
  63. TransDebugOut((DEB_SESSION, "API OUT GetOInetAdvisor (hr:%lx) \n", hr));
  64. return hr;
  65. }
  66. //+---------------------------------------------------------------------------
  67. //
  68. // Method: COInetItem::QueryInterface
  69. //
  70. // Synopsis:
  71. //
  72. // Arguments: [riid] --
  73. // [ppvObj] --
  74. //
  75. // Returns:
  76. //
  77. // History: 11-22-96 JohannP (Johann Posch) Created
  78. //
  79. // Notes:
  80. //
  81. //----------------------------------------------------------------------------
  82. STDMETHODIMP COInetItem::QueryInterface(REFIID riid, void **ppvObj)
  83. {
  84. VDATEPTROUT(ppvObj, void *);
  85. VDATETHIS(this);
  86. HRESULT hr = NOERROR;
  87. TransDebugOut((DEB_SESSION, "%p _IN COInetItem::QueryInterface\n", this));
  88. *ppvObj = NULL;
  89. if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
  90. {
  91. *ppvObj = this;
  92. AddRef();
  93. }
  94. else
  95. {
  96. hr = E_NOINTERFACE;
  97. }
  98. TransDebugOut((DEB_SESSION, "%p OUT COInetItem::QueryInterface (hr:%lx\n", this,hr));
  99. return hr;
  100. }
  101. //+---------------------------------------------------------------------------
  102. //
  103. // Function: COInetItem::AddRef
  104. //
  105. // Synopsis:
  106. //
  107. // Arguments: [ULONG] --
  108. //
  109. // Returns:
  110. //
  111. // History: 11-22-96 JohannP (Johann Posch) Created
  112. //
  113. // Notes:
  114. //
  115. //----------------------------------------------------------------------------
  116. STDMETHODIMP_(ULONG) COInetItem::AddRef(void)
  117. {
  118. TransDebugOut((DEB_SESSION, "%p _IN COInetItem::AddRef\n", this));
  119. LONG lRet = ++_CRefs;
  120. TransDebugOut((DEB_SESSION, "%p OUT COInetItem::AddRef (cRefs:%ld)\n", this,lRet));
  121. return lRet;
  122. }
  123. //+---------------------------------------------------------------------------
  124. //
  125. // Function: COInetItem::Release
  126. //
  127. // Synopsis:
  128. //
  129. // Arguments: [ULONG] --
  130. //
  131. // Returns:
  132. //
  133. // History: 11-22-96 JohannP (Johann Posch) Created
  134. //
  135. // Notes:
  136. //
  137. //----------------------------------------------------------------------------
  138. STDMETHODIMP_(ULONG) COInetItem::Release(void)
  139. {
  140. TransDebugOut((DEB_SESSION, "%p _IN COInetItem::Release\n", this));
  141. LONG lRet = --_CRefs;
  142. if (_CRefs == 0)
  143. {
  144. //delete this;
  145. }
  146. TransDebugOut((DEB_SESSION, "%p OUT COInetItem::Release (cRefs:%ld)\n",this,lRet));
  147. return lRet;
  148. }
  149. //+---------------------------------------------------------------------------
  150. //
  151. // Method: COInetItem::GetURL
  152. //
  153. // Synopsis:
  154. //
  155. // Arguments: [ppwzUrl] --
  156. //
  157. // Returns:
  158. //
  159. // History: 12-02-1996 JohannP (Johann Posch) Created
  160. //
  161. // Notes:
  162. //
  163. //----------------------------------------------------------------------------
  164. STDMETHODIMP COInetItem::GetURL(LPOLESTR *ppwzUrl)
  165. {
  166. TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetURL\n", this));
  167. HRESULT hr = E_FAIL;
  168. TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetURL (hr:%lx)\n",this, hr));
  169. return hr;
  170. }
  171. //+---------------------------------------------------------------------------
  172. //
  173. // Method: COInetItem::GetInfo
  174. //
  175. // Synopsis:
  176. //
  177. // Arguments: [dwOptions] --
  178. // [ppwzItemMime] --
  179. // [pclsidItem] --
  180. // [ppwzProtocol] --
  181. // [pclsidProtocol] --
  182. // [pdwOut] --
  183. //
  184. // Returns:
  185. //
  186. // History: 12-02-1996 JohannP (Johann Posch) Created
  187. //
  188. // Notes:
  189. //
  190. //----------------------------------------------------------------------------
  191. STDMETHODIMP COInetItem::GetInfo(
  192. DWORD dwOptions,
  193. LPOLESTR *ppwzItemMime,
  194. LPCLSID *pclsidItem,
  195. LPOLESTR *ppwzProtocol,
  196. LPCLSID *pclsidProtocol,
  197. DWORD *pdwOut
  198. )
  199. {
  200. TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetInfo\n", this));
  201. HRESULT hr = E_FAIL;
  202. TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetInfo (hr:%lx)\n",this, hr));
  203. return hr;
  204. }
  205. //+---------------------------------------------------------------------------
  206. //
  207. // Method: COInetItem::GetItemData
  208. //
  209. // Synopsis:
  210. //
  211. // Arguments: [ITEMDATA] --
  212. // [pitemdata] --
  213. //
  214. // Returns:
  215. //
  216. // History: 12-02-1996 JohannP (Johann Posch) Created
  217. //
  218. // Notes:
  219. //
  220. //----------------------------------------------------------------------------
  221. STDMETHODIMP COInetItem::GetItemData(DWORD *grfITEMF,ITEMDATA * pitemdata)
  222. {
  223. TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetItemData\n", this));
  224. HRESULT hr = E_FAIL;
  225. TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetItemData (hr:%lx)\n",this, hr));
  226. return hr;
  227. }
  228. //+---------------------------------------------------------------------------
  229. //
  230. // Method: COInetItemSink::QueryInterface
  231. //
  232. // Synopsis:
  233. //
  234. // Arguments: [riid] --
  235. // [ppvObj] --
  236. //
  237. // Returns:
  238. //
  239. // History: 11-22-96 JohannP (Johann Posch) Created
  240. //
  241. // Notes:
  242. //
  243. //----------------------------------------------------------------------------
  244. STDMETHODIMP COInetItemSink::QueryInterface(REFIID riid, void **ppvObj)
  245. {
  246. VDATEPTROUT(ppvObj, void *);
  247. VDATETHIS(this);
  248. HRESULT hr = NOERROR;
  249. TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::QueryInterface\n", this));
  250. *ppvObj = NULL;
  251. if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
  252. {
  253. *ppvObj = this;
  254. AddRef();
  255. }
  256. else
  257. {
  258. hr = E_NOINTERFACE;
  259. }
  260. TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::QueryInterface (hr:%lx\n", this,hr));
  261. return hr;
  262. }
  263. //+---------------------------------------------------------------------------
  264. //
  265. // Function: COInetItemSink::AddRef
  266. //
  267. // Synopsis:
  268. //
  269. // Arguments: [ULONG] --
  270. //
  271. // Returns:
  272. //
  273. // History: 11-22-96 JohannP (Johann Posch) Created
  274. //
  275. // Notes:
  276. //
  277. //----------------------------------------------------------------------------
  278. STDMETHODIMP_(ULONG) COInetItemSink::AddRef(void)
  279. {
  280. TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::AddRef\n", this));
  281. LONG lRet = ++_CRefs;
  282. TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::AddRef (cRefs:%ld)\n", this,lRet));
  283. return lRet;
  284. }
  285. //+---------------------------------------------------------------------------
  286. //
  287. // Function: COInetItemSink::Release
  288. //
  289. // Synopsis:
  290. //
  291. // Arguments: [ULONG] --
  292. //
  293. // Returns:
  294. //
  295. // History: 11-22-96 JohannP (Johann Posch) Created
  296. //
  297. // Notes:
  298. //
  299. //----------------------------------------------------------------------------
  300. STDMETHODIMP_(ULONG) COInetItemSink::Release(void)
  301. {
  302. TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::Release\n", this));
  303. LONG lRet = --_CRefs;
  304. if (_CRefs == 0)
  305. {
  306. //delete this;
  307. }
  308. TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::Release (cRefs:%ld)\n",this,lRet));
  309. return lRet;
  310. }
  311. STDMETHODIMP COInetItemSink::OnItem(
  312. ITEMTYPE itemtype,
  313. IOInetItem *pWChkItem,
  314. DWORD dwReserved
  315. )
  316. {
  317. TransDebugOut((DEB_PROT, "%p _IN COInetItemSink::OnItem\n", this));
  318. HRESULT hr = E_FAIL;
  319. TransDebugOut((DEB_PROT, "%p OUT COInetItemSink::OnItem (hr:%lx)\n",this, hr));
  320. return hr;
  321. }
  322. ////////////////////////////////////////////////////////
  323. //+---------------------------------------------------------------------------
  324. //
  325. // Method: COInetAdvisor::QueryInterface
  326. //
  327. // Synopsis:
  328. //
  329. // Arguments: [riid] --
  330. // [ppvObj] --
  331. //
  332. // Returns:
  333. //
  334. // History: 11-22-96 JohannP (Johann Posch) Created
  335. //
  336. // Notes:
  337. //
  338. //----------------------------------------------------------------------------
  339. STDMETHODIMP COInetAdvisor::QueryInterface(REFIID riid, void **ppvObj)
  340. {
  341. VDATEPTROUT(ppvObj, void *);
  342. VDATETHIS(this);
  343. HRESULT hr = NOERROR;
  344. TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::QueryInterface\n", this));
  345. *ppvObj = NULL;
  346. if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
  347. {
  348. *ppvObj = this;
  349. AddRef();
  350. }
  351. else
  352. {
  353. hr = E_NOINTERFACE;
  354. }
  355. TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::QueryInterface (hr:%lx\n", this,hr));
  356. return hr;
  357. }
  358. //+---------------------------------------------------------------------------
  359. //
  360. // Function: COInetAdvisor::AddRef
  361. //
  362. // Synopsis:
  363. //
  364. // Arguments: [ULONG] --
  365. //
  366. // Returns:
  367. //
  368. // History: 11-22-96 JohannP (Johann Posch) Created
  369. //
  370. // Notes:
  371. //
  372. //----------------------------------------------------------------------------
  373. STDMETHODIMP_(ULONG) COInetAdvisor::AddRef(void)
  374. {
  375. TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::AddRef\n", this));
  376. LONG lRet = ++_CRefs;
  377. TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::AddRef (cRefs:%ld)\n", this,lRet));
  378. return lRet;
  379. }
  380. //+---------------------------------------------------------------------------
  381. //
  382. // Function: COInetAdvisor::Release
  383. //
  384. // Synopsis:
  385. //
  386. // Arguments: [ULONG] --
  387. //
  388. // Returns:
  389. //
  390. // History: 11-22-96 JohannP (Johann Posch) Created
  391. //
  392. // Notes:
  393. //
  394. //----------------------------------------------------------------------------
  395. STDMETHODIMP_(ULONG) COInetAdvisor::Release(void)
  396. {
  397. TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::Release\n", this));
  398. LONG lRet = --_CRefs;
  399. if (_CRefs == 0)
  400. {
  401. // this is global
  402. //delete this;
  403. }
  404. TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::Release (cRefs:%ld)\n",this,lRet));
  405. return lRet;
  406. }
  407. //+---------------------------------------------------------------------------
  408. //
  409. // Method: COInetAdvisor::StartListen
  410. //
  411. // Synopsis:
  412. //
  413. // Arguments: [szProtocol] --
  414. // [pWChkItemSink] --
  415. // [grfFilterMode] --
  416. // [pclsidProtocol] --
  417. // [dwReserved] --
  418. //
  419. // Returns:
  420. //
  421. // History: 12-02-1996 JohannP (Johann Posch) Created
  422. //
  423. // Notes:
  424. //
  425. //----------------------------------------------------------------------------
  426. STDMETHODIMP COInetAdvisor::StartListen(
  427. const LPCWSTR szProtocol,
  428. IOInetItemFilter *pWChkItemFilter,
  429. DWORD grfFilterMode,
  430. CLSID *pclsidProtocol,
  431. DWORD dwReserved
  432. )
  433. {
  434. TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::StartListen\n", this));
  435. HRESULT hr = E_FAIL;
  436. TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::StartListen (hr:%lx)\n",this, hr));
  437. return hr;
  438. }
  439. //+---------------------------------------------------------------------------
  440. //
  441. // Method: COInetAdvisor::StopListen
  442. //
  443. // Synopsis: will release the sink passed in at StartListen
  444. //
  445. // Arguments: [pclsidProtocol] --
  446. //
  447. // Returns:
  448. //
  449. // History: 12-02-1996 JohannP (Johann Posch) Created
  450. //
  451. // Notes:
  452. //
  453. //----------------------------------------------------------------------------
  454. STDMETHODIMP COInetAdvisor::StopListen(CLSID *pclsidProtocol)
  455. {
  456. TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::StopListen\n", this));
  457. HRESULT hr = E_FAIL;
  458. TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::StopListen (hr:%lx)\n",this, hr));
  459. return hr;
  460. }
  461. //+---------------------------------------------------------------------------
  462. //
  463. // Method: COInetAdvisor::Advise
  464. //
  465. // Synopsis:
  466. //
  467. // Arguments: [pWChkItemSink] --
  468. // [grfMode] --
  469. // [cMimes] --
  470. // [ppwzItemMimes] --
  471. // [dwReserved] --
  472. //
  473. // Returns:
  474. //
  475. // History: 12-02-1996 JohannP (Johann Posch) Created
  476. //
  477. // Notes:
  478. //
  479. //----------------------------------------------------------------------------
  480. STDMETHODIMP COInetAdvisor::Advise(IOInetItemSink *pWChkItemSink, DWORD grfMode, ULONG cMimes, const LPCWSTR *ppwzItemMimes, DWORD dwReserved)
  481. {
  482. TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::Advise\n", this));
  483. HRESULT hr = NOERROR;
  484. for (ULONG i = 0; i < cMimes; i++)
  485. {
  486. LPCWSTR pwzStr = *(ppwzItemMimes+i);
  487. _AdvSinks.AddVal(pWChkItemSink, pwzStr);
  488. }
  489. TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::Advise (hr:%lx)\n",this, hr));
  490. return hr;
  491. }
  492. //+---------------------------------------------------------------------------
  493. //
  494. // Method: COInetAdvisor::Unadvise
  495. //
  496. // Synopsis:
  497. //
  498. // Arguments: [pWChkItemSink] --
  499. // [cMimes] --
  500. // [ppwzItemMimes] --
  501. //
  502. // Returns:
  503. //
  504. // History: 12-02-1996 JohannP (Johann Posch) Created
  505. //
  506. // Notes:
  507. //
  508. //----------------------------------------------------------------------------
  509. STDMETHODIMP COInetAdvisor::Unadvise(IOInetItemSink *pWChkItemSink, ULONG cMimes, const LPCWSTR *ppwzItemMimes)
  510. {
  511. TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::Unadvise\n", this));
  512. HRESULT hr = NOERROR;
  513. for (ULONG i = 0; i < cMimes; i++)
  514. {
  515. LPCWSTR pwzStr = *(ppwzItemMimes+i);
  516. _AdvSinks.RemoveVal(pWChkItemSink, pwzStr);
  517. }
  518. TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::Unadvise (hr:%lx)\n",this, hr));
  519. return hr;
  520. }
  521. //+---------------------------------------------------------------------------
  522. //
  523. // Method: COInetAdvisor::SendAdvise
  524. //
  525. // Synopsis:
  526. //
  527. // Arguments: [itemtype] --
  528. // [pWChkItem] --
  529. // [grfMode] --
  530. // [pwzItemMimes] --
  531. // [dwReserved] --
  532. //
  533. // Returns:
  534. //
  535. // History: 12-02-1996 JohannP (Johann Posch) Created
  536. //
  537. // Notes:
  538. //
  539. //----------------------------------------------------------------------------
  540. STDMETHODIMP COInetAdvisor::SendAdvise(
  541. ITEMTYPE itemtype,
  542. IOInetItem * pWChkItem,
  543. DWORD grfMode,
  544. LPCWSTR pwzItemMimes,
  545. DWORD dwReserved
  546. )
  547. {
  548. TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::SendAdvise\n", this));
  549. HRESULT hr;
  550. HRESULT hr1 = E_FAIL;
  551. IOInetItemSink *pWChkItemSink = 0;
  552. hr = _AdvSinks.FindFirst(pwzItemMimes, (IUnknown **)&pWChkItemSink);
  553. if (hr == NOERROR)
  554. {
  555. do
  556. {
  557. hr1 = pWChkItemSink->OnItem(itemtype, pWChkItem, 0);
  558. pWChkItemSink->Release();
  559. pWChkItemSink = 0;
  560. hr = _AdvSinks.FindNext(pwzItemMimes, (IUnknown **)&pWChkItemSink);
  561. } while (hr == NOERROR);
  562. }
  563. TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::SendAdvise (hr:%lx)\n",this, hr1));
  564. return hr1;
  565. }
  566. //+---------------------------------------------------------------------------
  567. //
  568. // Method: CMapStrToXVal::AddVal
  569. //
  570. // Synopsis:
  571. //
  572. // Arguments: [LPCWSTR] --
  573. // [ULONG] --
  574. // [cNames] --
  575. //
  576. // Returns:
  577. //
  578. // History: 10-29-1996 JohannP (Johann Posch) Created
  579. //
  580. // Notes:
  581. //
  582. //----------------------------------------------------------------------------
  583. STDMETHODIMP CMapStrToXVal::AddVal(IUnknown *pUnk, LPCWSTR pwzName)
  584. {
  585. TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::AddVal\n", this));
  586. HRESULT hr = NOERROR;
  587. TransAssert((pUnk && pwzName));
  588. CLock lck(_mxs);
  589. CXUnknown cunk = pUnk;
  590. if (pUnk && pwzName)
  591. {
  592. CProtNode *pNode;
  593. CKey ckey = pwzName;
  594. if (_Map.Lookup(ckey, (CObject *&)pNode) )
  595. {
  596. pNode->Add(pUnk);
  597. }
  598. else
  599. {
  600. pNode = new CProtNode(pUnk);
  601. if (pNode)
  602. {
  603. _Map.SetAt(ckey, pNode);
  604. _cElements++;
  605. }
  606. else
  607. {
  608. hr = E_OUTOFMEMORY;
  609. }
  610. }
  611. }
  612. else
  613. {
  614. hr = E_INVALIDARG;
  615. }
  616. TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::AddVal (hr:%lx)\n",this, hr));
  617. return hr;
  618. }
  619. //+---------------------------------------------------------------------------
  620. //
  621. // Method: CMapStrToXVal::RemoveVal
  622. //
  623. // Synopsis:
  624. //
  625. // Arguments: [pUnk] --
  626. //
  627. // Returns:
  628. //
  629. // History: 10-29-1996 JohannP (Johann Posch) Created
  630. //
  631. // Notes:
  632. //
  633. //----------------------------------------------------------------------------
  634. STDMETHODIMP CMapStrToXVal::RemoveVal(IUnknown *pUnk,LPCWSTR pwzName)
  635. {
  636. TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::RemoveVal\n", this));
  637. HRESULT hr = NOERROR;
  638. CLock lck(_mxs);
  639. if (pUnk && pwzName)
  640. {
  641. CProtNode *pNode;
  642. CKey ckey = pwzName;
  643. if (_Map.Lookup(ckey, (CObject *&)pNode) )
  644. {
  645. pNode->Remove(pUnk);
  646. }
  647. }
  648. else
  649. {
  650. hr = E_INVALIDARG;
  651. }
  652. TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::RemoveVal (hr:%lx)\n",this, hr));
  653. return hr;
  654. }
  655. //+---------------------------------------------------------------------------
  656. //
  657. // Method: CMapStrToXVal::FindFirst
  658. //
  659. // Synopsis:
  660. //
  661. // Arguments: [pwzName] --
  662. // [ppUnk] --
  663. //
  664. // Returns:
  665. //
  666. // History: 10-29-1996 JohannP (Johann Posch) Created
  667. //
  668. // Notes:
  669. //
  670. //----------------------------------------------------------------------------
  671. STDMETHODIMP CMapStrToXVal::FindFirst(LPCWSTR pwzName, IUnknown **ppUnk)
  672. {
  673. TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::FindFirst\n", this));
  674. HRESULT hr = E_FAIL;
  675. CLock lck(_mxs);
  676. TransAssert(( pwzName && ppUnk));
  677. if (_cElements)
  678. {
  679. CProtNode *pNode;
  680. CKey ckey = pwzName;
  681. if ( (_Map.Lookup(ckey, (CObject *&)pNode) )
  682. && (pNode->FindFirst(*ppUnk)) )
  683. {
  684. hr = NOERROR;
  685. }
  686. }
  687. TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::FindFirst (hr:%lx)\n",this, hr));
  688. return hr;
  689. }
  690. //+---------------------------------------------------------------------------
  691. //
  692. // Method: CMapStrToXVal::FindNext
  693. //
  694. // Synopsis:
  695. //
  696. // Arguments: [pwzName] --
  697. // [ppUnk] --
  698. //
  699. // Returns:
  700. //
  701. // History: 10-29-1996 JohannP (Johann Posch) Created
  702. //
  703. // Notes:
  704. //
  705. //----------------------------------------------------------------------------
  706. STDMETHODIMP CMapStrToXVal::FindNext(LPCWSTR pwzName, IUnknown **ppUnk)
  707. {
  708. TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::FindNext\n", this));
  709. HRESULT hr = E_FAIL;
  710. CLock lck(_mxs);
  711. TransAssert(( pwzName && ppUnk));
  712. if (_cElements)
  713. {
  714. CProtNode *pNode;
  715. CKey ckey = pwzName;
  716. if ( (_Map.Lookup(ckey, (CObject *&)pNode) )
  717. && (pNode->FindNext(*ppUnk)) )
  718. {
  719. hr = NOERROR;
  720. }
  721. }
  722. TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::FindNext (hr:%lx)\n",this, hr));
  723. return hr;
  724. }