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.

821 lines
15 KiB

  1. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  2. //
  3. // bindstcb.cpp
  4. //
  5. // Bind status callback object. Called by cdf file parser.
  6. //
  7. // History:
  8. //
  9. // 3/31/97 edwardp Created.
  10. //
  11. ////////////////////////////////////////////////////////////////////////////////
  12. //
  13. // Includes
  14. //
  15. #include "stdinc.h"
  16. #include "cdfidl.h"
  17. #include "xmlutil.h"
  18. #include "persist.h"
  19. #include "bindstcb.h"
  20. #include "chanapi.h"
  21. #include "chanenum.h"
  22. #include "dll.h"
  23. #include "resource.h"
  24. //
  25. // Constructor and destructor.
  26. //
  27. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  28. //
  29. // *** CBindStatusCallback::CBindStatusCallback ***
  30. //
  31. // Constructor.
  32. //
  33. ////////////////////////////////////////////////////////////////////////////////
  34. CBindStatusCallback::CBindStatusCallback (
  35. IXMLDocument* pIXMLDocument,
  36. LPCWSTR pszURLW
  37. )
  38. : m_cRef(1)
  39. {
  40. ASSERT(pIXMLDocument);
  41. ASSERT(pszURLW);
  42. pIXMLDocument->AddRef();
  43. m_pIXMLDocument = pIXMLDocument;
  44. int cb = StrLenW(pszURLW) + 1;
  45. m_pszURL = new TCHAR[cb];
  46. if (m_pszURL)
  47. SHUnicodeToTChar(pszURLW, m_pszURL, cb);
  48. return;
  49. }
  50. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  51. //
  52. // *** CBindStatusCallback::~CBindStatusCallback ***
  53. //
  54. // Destructor.
  55. //
  56. ////////////////////////////////////////////////////////////////////////////////
  57. CBindStatusCallback::~CBindStatusCallback (
  58. void
  59. )
  60. {
  61. ASSERT(0 == m_cRef);
  62. if (m_pIXMLDocument)
  63. m_pIXMLDocument->Release();
  64. if (m_pszURL)
  65. delete [] m_pszURL;
  66. if (m_pPrevIBindStatusCallback)
  67. m_pPrevIBindStatusCallback->Release();
  68. return;
  69. }
  70. //
  71. // IUnknown methods.
  72. //
  73. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  74. //
  75. // *** CBindStatusCallback::QueryInterface ***
  76. //
  77. // CBindStatusCallback QI.
  78. //
  79. ////////////////////////////////////////////////////////////////////////////////
  80. STDMETHODIMP
  81. CBindStatusCallback::QueryInterface (
  82. REFIID riid,
  83. void **ppv
  84. )
  85. {
  86. HRESULT hr;
  87. ASSERT(ppv);
  88. if (IID_IUnknown == riid || IID_IBindStatusCallback == riid)
  89. {
  90. AddRef();
  91. *ppv = (IBindStatusCallback*)this;
  92. hr = S_OK;
  93. }
  94. else
  95. {
  96. *ppv = NULL;
  97. hr = E_NOINTERFACE;
  98. }
  99. ASSERT((SUCCEEDED(hr) && *ppv) || (FAILED(hr) && NULL == *ppv));
  100. return hr;
  101. }
  102. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  103. //
  104. // *** CBindStatusCallback::AddRef ***
  105. //
  106. // CBindStatusCallback AddRef.
  107. //
  108. ////////////////////////////////////////////////////////////////////////////////
  109. STDMETHODIMP_(ULONG)
  110. CBindStatusCallback::AddRef (
  111. void
  112. )
  113. {
  114. ASSERT(m_cRef != 0);
  115. ASSERT(m_cRef < (ULONG)-1);
  116. return ++m_cRef;
  117. }
  118. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  119. //
  120. // *** CBindStatusCallback::Release ***
  121. //
  122. // CContextMenu Release.
  123. //
  124. ////////////////////////////////////////////////////////////////////////////////
  125. STDMETHODIMP_(ULONG)
  126. CBindStatusCallback::Release (
  127. void
  128. )
  129. {
  130. ASSERT (m_cRef != 0);
  131. ULONG cRef = --m_cRef;
  132. if (0 == cRef)
  133. delete this;
  134. return cRef;
  135. }
  136. //
  137. // IBindStatusCallback methods.
  138. //
  139. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  140. //
  141. // *** CBindStatusCallback::GetBindInfo ***
  142. //
  143. //
  144. // Description:
  145. //
  146. //
  147. // Parameters:
  148. //
  149. //
  150. // Return:
  151. //
  152. //
  153. // Comments:
  154. //
  155. //
  156. ////////////////////////////////////////////////////////////////////////////////
  157. STDMETHODIMP
  158. CBindStatusCallback::GetBindInfo(
  159. DWORD* pgrfBINDF,
  160. BINDINFO* pbindinfo
  161. )
  162. {
  163. //ASSERT(pgrfBINDF);
  164. //*pgrfBINDF &= ~BINDF_ASYNCHRONOUS;
  165. return S_OK;
  166. }
  167. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  168. //
  169. // *** CBindStatusCallback::OnStartBinding ***
  170. //
  171. //
  172. // Description:
  173. //
  174. //
  175. // Parameters:
  176. //
  177. //
  178. // Return:
  179. //
  180. //
  181. // Comments:
  182. //
  183. //
  184. ////////////////////////////////////////////////////////////////////////////////
  185. STDMETHODIMP
  186. CBindStatusCallback::OnStartBinding(
  187. DWORD dwReserved,
  188. IBinding* pIBinding
  189. )
  190. {
  191. return S_OK;
  192. }
  193. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  194. //
  195. // *** CBindStatusCallback::GetPriority ***
  196. //
  197. //
  198. // Description:
  199. //
  200. //
  201. // Parameters:
  202. //
  203. //
  204. // Return:
  205. //
  206. //
  207. // Comments:
  208. //
  209. //
  210. ////////////////////////////////////////////////////////////////////////////////
  211. STDMETHODIMP
  212. CBindStatusCallback::GetPriority(
  213. LONG *pnPriority
  214. )
  215. {
  216. return S_OK;
  217. }
  218. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  219. //
  220. // *** CBindStatusCallback::OnProgress ***
  221. //
  222. //
  223. // Description:
  224. //
  225. //
  226. // Parameters:
  227. //
  228. //
  229. // Return:
  230. //
  231. //
  232. // Comments:
  233. //
  234. //
  235. ////////////////////////////////////////////////////////////////////////////////
  236. STDMETHODIMP
  237. CBindStatusCallback::OnProgress(
  238. ULONG ulProgress,
  239. ULONG ulProgressMax,
  240. ULONG ulStatusCode,
  241. LPCWSTR szStatusText
  242. )
  243. {
  244. HRESULT hr;
  245. if (m_pPrevIBindStatusCallback)
  246. {
  247. hr = m_pPrevIBindStatusCallback->OnProgress(ulProgress, ulProgressMax,
  248. ulStatusCode, szStatusText);
  249. }
  250. else
  251. {
  252. hr = S_OK;
  253. }
  254. return hr;
  255. }
  256. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  257. //
  258. // *** CBindStatusCallback::OnDataAvailable ***
  259. //
  260. //
  261. // Description:
  262. //
  263. //
  264. // Parameters:
  265. //
  266. //
  267. // Return:
  268. //
  269. //
  270. // Comments:
  271. //
  272. //
  273. ////////////////////////////////////////////////////////////////////////////////
  274. STDMETHODIMP
  275. CBindStatusCallback::OnDataAvailable(
  276. DWORD grfBSCF,
  277. DWORD dwSize,
  278. FORMATETC* pfmtect,
  279. STGMEDIUM* pstgmed
  280. )
  281. {
  282. return S_OK;
  283. }
  284. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  285. //
  286. // *** CBindStatusCallback::OnObjectAvialable ***
  287. //
  288. //
  289. // Description:
  290. //
  291. //
  292. // Parameters:
  293. //
  294. //
  295. // Return:
  296. //
  297. //
  298. // Comments:
  299. //
  300. //
  301. ////////////////////////////////////////////////////////////////////////////////
  302. STDMETHODIMP
  303. CBindStatusCallback::OnObjectAvailable(
  304. REFIID riid,
  305. IUnknown* pIUnknown
  306. )
  307. {
  308. return S_OK;
  309. }
  310. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  311. //
  312. // *** CBindStatusCallback::OnLowResource ***
  313. //
  314. //
  315. // Description:
  316. //
  317. //
  318. // Parameters:
  319. //
  320. //
  321. // Return:
  322. //
  323. //
  324. // Comments:
  325. //
  326. //
  327. ////////////////////////////////////////////////////////////////////////////////
  328. STDMETHODIMP
  329. CBindStatusCallback::OnLowResource(
  330. DWORD dwReserved
  331. )
  332. {
  333. return S_OK;
  334. }
  335. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  336. //
  337. // *** CBindStatusCallback::OnStopBinding ***
  338. //
  339. //
  340. // Description:
  341. //
  342. //
  343. // Parameters:
  344. //
  345. //
  346. // Return:
  347. //
  348. //
  349. // Comments:
  350. //
  351. //
  352. ////////////////////////////////////////////////////////////////////////////////
  353. STDMETHODIMP
  354. CBindStatusCallback::OnStopBinding(
  355. HRESULT hrStatus,
  356. LPCWSTR szStatusText
  357. )
  358. {
  359. if (m_pPrevIBindStatusCallback)
  360. m_pPrevIBindStatusCallback->OnStopBinding(hrStatus, szStatusText);
  361. HRESULT hr = hrStatus;
  362. if (SUCCEEDED(hr))
  363. {
  364. if (m_pszURL)
  365. {
  366. ASSERT(m_pIXMLDocument);
  367. XML_DownloadImages(m_pIXMLDocument);
  368. // Moved to constructor.
  369. //Cache_AddItem(m_pszURL, m_pIXMLDocument, PARSE_NET);
  370. XML_MarkCacheEntrySticky(m_pszURL);
  371. //
  372. // Update the item now that the download is complete.
  373. //
  374. WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
  375. if (SHTCharToUnicode(m_pszURL, wszURL, ARRAYSIZE(wszURL)))
  376. Channel_SendUpdateNotifications(wszURL);
  377. }
  378. else
  379. {
  380. hr = E_OUTOFMEMORY;
  381. }
  382. }
  383. return hr;
  384. }
  385. //
  386. // Helper functions.
  387. //
  388. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  389. //
  390. // *** CBindStatusCallback::Wait ***
  391. //
  392. //
  393. // Description:
  394. //
  395. //
  396. // Parameters:
  397. //
  398. //
  399. // Return:
  400. //
  401. //
  402. // Comments:
  403. //
  404. //
  405. ////////////////////////////////////////////////////////////////////////////////
  406. HRESULT
  407. CBindStatusCallback::Init(
  408. IBindStatusCallback* pPrevIBindStatusCallback
  409. )
  410. {
  411. ASSERT(NULL == m_pPrevIBindStatusCallback);
  412. m_pPrevIBindStatusCallback = pPrevIBindStatusCallback;
  413. return S_OK;
  414. }
  415. //
  416. // Constructor and destructor.
  417. //
  418. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  419. //
  420. // *** CBindStatusCallback::CBindStatusCallback ***
  421. //
  422. // Constructor.
  423. //
  424. ////////////////////////////////////////////////////////////////////////////////
  425. CBindStatusCallback2::CBindStatusCallback2 (
  426. HWND hwnd
  427. )
  428. : m_cRef(1),
  429. m_hwnd(hwnd)
  430. {
  431. DllAddRef();
  432. return;
  433. }
  434. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  435. //
  436. // *** CBindStatusCallback::~CBindStatusCallback ***
  437. //
  438. // Destructor.
  439. //
  440. ////////////////////////////////////////////////////////////////////////////////
  441. CBindStatusCallback2::~CBindStatusCallback2 (
  442. void
  443. )
  444. {
  445. ASSERT(0 == m_cRef);
  446. DllRelease();
  447. return;
  448. }
  449. //
  450. // IUnknown methods.
  451. //
  452. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  453. //
  454. // *** CBindStatusCallback::QueryInterface ***
  455. //
  456. // CBindStatusCallback QI.
  457. //
  458. ////////////////////////////////////////////////////////////////////////////////
  459. STDMETHODIMP
  460. CBindStatusCallback2::QueryInterface (
  461. REFIID riid,
  462. void **ppv
  463. )
  464. {
  465. HRESULT hr;
  466. ASSERT(ppv);
  467. if (IID_IUnknown == riid || IID_IBindStatusCallback == riid)
  468. {
  469. AddRef();
  470. *ppv = (IBindStatusCallback*)this;
  471. hr = S_OK;
  472. }
  473. else
  474. {
  475. *ppv = NULL;
  476. hr = E_NOINTERFACE;
  477. }
  478. ASSERT((SUCCEEDED(hr) && *ppv) || (FAILED(hr) && NULL == *ppv));
  479. return hr;
  480. }
  481. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  482. //
  483. // *** CBindStatusCallback::AddRef ***
  484. //
  485. // CBindStatusCallback AddRef.
  486. //
  487. ////////////////////////////////////////////////////////////////////////////////
  488. STDMETHODIMP_(ULONG)
  489. CBindStatusCallback2::AddRef (
  490. void
  491. )
  492. {
  493. ASSERT(m_cRef != 0);
  494. ASSERT(m_cRef < (ULONG)-1);
  495. return ++m_cRef;
  496. }
  497. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  498. //
  499. // *** CBindStatusCallback::Release ***
  500. //
  501. // CContextMenu Release.
  502. //
  503. ////////////////////////////////////////////////////////////////////////////////
  504. STDMETHODIMP_(ULONG)
  505. CBindStatusCallback2::Release (
  506. void
  507. )
  508. {
  509. ASSERT (m_cRef != 0);
  510. ULONG cRef = --m_cRef;
  511. if (0 == cRef)
  512. delete this;
  513. return cRef;
  514. }
  515. //
  516. // IBindStatusCallback methods.
  517. //
  518. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  519. //
  520. // *** CBindStatusCallback::GetBindInfo ***
  521. //
  522. //
  523. // Description:
  524. //
  525. //
  526. // Parameters:
  527. //
  528. //
  529. // Return:
  530. //
  531. //
  532. // Comments:
  533. //
  534. //
  535. ////////////////////////////////////////////////////////////////////////////////
  536. STDMETHODIMP
  537. CBindStatusCallback2::GetBindInfo(
  538. DWORD* pgrfBINDF,
  539. BINDINFO* pbindinfo
  540. )
  541. {
  542. return S_OK;
  543. }
  544. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  545. //
  546. // *** CBindStatusCallback::OnStartBinding ***
  547. //
  548. //
  549. // Description:
  550. //
  551. //
  552. // Parameters:
  553. //
  554. //
  555. // Return:
  556. //
  557. //
  558. // Comments:
  559. //
  560. //
  561. ////////////////////////////////////////////////////////////////////////////////
  562. STDMETHODIMP
  563. CBindStatusCallback2::OnStartBinding(
  564. DWORD dwReserved,
  565. IBinding* pIBinding
  566. )
  567. {
  568. return S_OK;
  569. }
  570. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  571. //
  572. // *** CBindStatusCallback::GetPriority ***
  573. //
  574. //
  575. // Description:
  576. //
  577. //
  578. // Parameters:
  579. //
  580. //
  581. // Return:
  582. //
  583. //
  584. // Comments:
  585. //
  586. //
  587. ////////////////////////////////////////////////////////////////////////////////
  588. STDMETHODIMP
  589. CBindStatusCallback2::GetPriority(
  590. LONG *pnPriority
  591. )
  592. {
  593. return S_OK;
  594. }
  595. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  596. //
  597. // *** CBindStatusCallback::OnProgress ***
  598. //
  599. //
  600. // Description:
  601. //
  602. //
  603. // Parameters:
  604. //
  605. //
  606. // Return:
  607. //
  608. //
  609. // Comments:
  610. //
  611. //
  612. ////////////////////////////////////////////////////////////////////////////////
  613. STDMETHODIMP
  614. CBindStatusCallback2::OnProgress(
  615. ULONG ulProgress,
  616. ULONG ulProgressMax,
  617. ULONG ulStatusCode,
  618. LPCWSTR szStatusText
  619. )
  620. {
  621. PostMessage(m_hwnd, WM_COMMAND, DOWNLOAD_PROGRESS,
  622. 0);
  623. return S_OK;
  624. }
  625. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  626. //
  627. // *** CBindStatusCallback::OnDataAvailable ***
  628. //
  629. //
  630. // Description:
  631. //
  632. //
  633. // Parameters:
  634. //
  635. //
  636. // Return:
  637. //
  638. //
  639. // Comments:
  640. //
  641. //
  642. ////////////////////////////////////////////////////////////////////////////////
  643. STDMETHODIMP
  644. CBindStatusCallback2::OnDataAvailable(
  645. DWORD grfBSCF,
  646. DWORD dwSize,
  647. FORMATETC* pfmtect,
  648. STGMEDIUM* pstgmed
  649. )
  650. {
  651. return S_OK;
  652. }
  653. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  654. //
  655. // *** CBindStatusCallback::OnObjectAvialable ***
  656. //
  657. //
  658. // Description:
  659. //
  660. //
  661. // Parameters:
  662. //
  663. //
  664. // Return:
  665. //
  666. //
  667. // Comments:
  668. //
  669. //
  670. ////////////////////////////////////////////////////////////////////////////////
  671. STDMETHODIMP
  672. CBindStatusCallback2::OnObjectAvailable(
  673. REFIID riid,
  674. IUnknown* pIUnknown
  675. )
  676. {
  677. return S_OK;
  678. }
  679. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  680. //
  681. // *** CBindStatusCallback::OnLowResource ***
  682. //
  683. //
  684. // Description:
  685. //
  686. //
  687. // Parameters:
  688. //
  689. //
  690. // Return:
  691. //
  692. //
  693. // Comments:
  694. //
  695. //
  696. ////////////////////////////////////////////////////////////////////////////////
  697. STDMETHODIMP
  698. CBindStatusCallback2::OnLowResource(
  699. DWORD dwReserved
  700. )
  701. {
  702. return S_OK;
  703. }
  704. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
  705. //
  706. // *** CBindStatusCallback::OnStopBinding ***
  707. //
  708. //
  709. // Description:
  710. //
  711. //
  712. // Parameters:
  713. //
  714. //
  715. // Return:
  716. //
  717. //
  718. // Comments:
  719. //
  720. //
  721. ////////////////////////////////////////////////////////////////////////////////
  722. STDMETHODIMP
  723. CBindStatusCallback2::OnStopBinding(
  724. HRESULT hrStatus,
  725. LPCWSTR szStatusText
  726. )
  727. {
  728. HRESULT hr = hrStatus;
  729. PostMessage(m_hwnd, WM_COMMAND, DOWNLOAD_COMPLETE,
  730. SUCCEEDED(hr) ? TRUE : FALSE);
  731. return hr;
  732. }