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.

844 lines
24 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: mimehndl.cxx
  7. //
  8. // Contents: Class that performs the download of a particular request.
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // History: 12-04-95 JohannP (Johann Posch) Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #include <eapp.h>
  18. PerfDbgTag(tagCTransaction, "Urlmon", "Log CTransaction", DEB_TRANS)
  19. DbgTag(tagCTransactionErr, "Urlmon", "Log CTransaction Errors", DEB_TRANS|DEB_ERROR)
  20. typedef struct _tagPROTOCOLFILTERDATA
  21. {
  22. DWORD cbSize;
  23. IOInetProtocolSink *pProtocolSink; // out parameter
  24. IOInetProtocol *pProtocol; // in parameter
  25. IUnknown *pUnk;
  26. DWORD dwFilterFlags;
  27. } PROTOCOLFILTERDATA;
  28. CMimeHandlerTest1::CMimeHandlerTest1(REFCLSID rclsid, IUnknown *pUnkOuter, IUnknown **ppUnkInner) : CBaseProtocol(rclsid, pUnkOuter, ppUnkInner)
  29. {
  30. _pUnk = 0;
  31. _pProt = 0;
  32. _pProtSnk = 0;
  33. _dwMode = 0;
  34. _dwOInetBdgFlags = 0;
  35. _pBuffer = 0; // DNLD_BUFFER_SIZE size buffer
  36. _cbBufferSize = 0;
  37. _cbTotalBytesRead = 0;
  38. _cbBufferFilled = 0; //how much of the buffer is in use
  39. _cbDataSniffMin = 0;
  40. _cbBytesReported = 0;
  41. _fDocFile = 0;
  42. _fMimeVerified = 0;
  43. _pwzFileName = 0;
  44. _pwzMimeSuggested = 0;
  45. _fDelete = 0;
  46. }
  47. //+---------------------------------------------------------------------------
  48. //
  49. // Method: CMimeHandlerTest1::QueryInterface
  50. //
  51. // Synopsis:
  52. //
  53. // Arguments: [riid] --
  54. // [ppvObj] --
  55. //
  56. // Returns:
  57. //
  58. // History: 10-29-1996 JohannP (Johann Posch) Created
  59. //
  60. // Notes:
  61. //
  62. //----------------------------------------------------------------------------
  63. STDMETHODIMP CMimeHandlerTest1::QueryInterface(REFIID riid, void **ppvObj)
  64. {
  65. VDATEPTROUT(ppvObj, void *);
  66. VDATETHIS(this);
  67. HRESULT hr = NOERROR;
  68. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::QueryInterface");
  69. *ppvObj = NULL;
  70. {
  71. if ( (riid == IID_IUnknown)
  72. || (riid == IID_IOInetProtocol))
  73. {
  74. *ppvObj = (IOInetProtocol *) this;
  75. AddRef();
  76. }
  77. else if (riid == IID_IOInetProtocolSink)
  78. {
  79. *ppvObj = (IOInetProtocolSink *) this;
  80. AddRef();
  81. }
  82. else
  83. {
  84. hr = E_NOINTERFACE;
  85. }
  86. }
  87. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::QueryInterface (hr:%lx)", hr);
  88. return hr;
  89. }
  90. //+---------------------------------------------------------------------------
  91. //
  92. // Function: CMimeHandlerTest1::AddRef
  93. //
  94. // Synopsis:
  95. //
  96. // Arguments: [ULONG] --
  97. //
  98. // Returns:
  99. //
  100. // History: 10-29-1996 JohannP (Johann Posch) Created
  101. //
  102. // Notes:
  103. //
  104. //----------------------------------------------------------------------------
  105. STDMETHODIMP_(ULONG) CMimeHandlerTest1::AddRef(void)
  106. {
  107. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::AddRef");
  108. LONG lRet;
  109. {
  110. lRet = ++_CRefs;
  111. }
  112. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::AddRef (cRefs:%ld)", lRet);
  113. return lRet;
  114. }
  115. //+---------------------------------------------------------------------------
  116. //
  117. // Function: CMimeHandlerTest1::Release
  118. //
  119. // Synopsis:
  120. //
  121. // Arguments: [ULONG] --
  122. //
  123. // Returns:
  124. //
  125. // History: 10-29-1996 JohannP (Johann Posch) Created
  126. //
  127. // Notes:
  128. //
  129. //----------------------------------------------------------------------------
  130. STDMETHODIMP_(ULONG) CMimeHandlerTest1::Release(void)
  131. {
  132. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Release");
  133. LONG lRet;
  134. {
  135. lRet = --_CRefs;
  136. if (_CRefs == 0 && _fDelete)
  137. {
  138. delete this;
  139. }
  140. }
  141. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Release (cRefs:%ld)", lRet);
  142. return lRet;
  143. }
  144. //+---------------------------------------------------------------------------
  145. //
  146. // Method: CMimeHandlerTest1::Start
  147. //
  148. // Synopsis:
  149. //
  150. // Arguments: [pwzUrl] --
  151. // [pTrans] --
  152. // [pOIBindInfo] --
  153. // [grfSTI] --
  154. // [dwReserved] --
  155. //
  156. // Returns:
  157. //
  158. // History: 10-29-1996 JohannP (Johann Posch) Created
  159. //
  160. // Notes:
  161. //
  162. //----------------------------------------------------------------------------
  163. STDMETHODIMP CMimeHandlerTest1::Start(LPCWSTR pwzUrl, IOInetProtocolSink *pOInetProtSnk, IOInetBindInfo *pOIBindInfo,
  164. DWORD grfSTI, DWORD dwReserved)
  165. {
  166. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Start\n");
  167. HRESULT hr = NOERROR;
  168. PROTOCOLFILTERDATA *pFilterData = 0;
  169. TransAssert((pOIBindInfo && pOInetProtSnk));
  170. if (dwReserved)
  171. {
  172. pFilterData = (PROTOCOLFILTERDATA *)dwReserved;
  173. }
  174. if (pFilterData && pOInetProtSnk)
  175. {
  176. TransAssert((pOIBindInfo && pOInetProtSnk));
  177. _pProt = pFilterData->pProtocol;
  178. if (_pProt)
  179. {
  180. _pProt->AddRef();
  181. }
  182. else
  183. {
  184. hr = E_FAIL;
  185. }
  186. _pProtSnk = pOInetProtSnk;
  187. _pProtSnk->AddRef();
  188. }
  189. else
  190. {
  191. hr = E_FAIL;
  192. }
  193. PerfDbgLog1(tagCTransaction, this, "+CMimeHandlerTest1::Start (hr:%lx)\n", hr);
  194. return hr;
  195. }
  196. //+---------------------------------------------------------------------------
  197. //
  198. // Method: CMimeHandlerTest1::Continue
  199. //
  200. // Synopsis:
  201. //
  202. // Arguments: [pStateInfoIn] --
  203. //
  204. // Returns:
  205. //
  206. // History: 10-29-1996 JohannP (Johann Posch) Created
  207. //
  208. // Notes:
  209. //
  210. //----------------------------------------------------------------------------
  211. STDMETHODIMP CMimeHandlerTest1::Continue(PROTOCOLDATA *pStateInfoIn)
  212. {
  213. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Continue\n");
  214. HRESULT hr = _pProt->Continue(pStateInfoIn);
  215. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Continue (hr:%lx)\n",hr);
  216. return hr;
  217. }
  218. //+---------------------------------------------------------------------------
  219. //
  220. // Method: CMimeHandlerTest1::Abort
  221. //
  222. // Synopsis:
  223. //
  224. // Arguments: [hrReason] --
  225. // [dwOptions] --
  226. //
  227. // Returns:
  228. //
  229. // History: 11-09-1996 JohannP (Johann Posch) Created
  230. //
  231. // Notes:
  232. //
  233. //----------------------------------------------------------------------------
  234. STDMETHODIMP CMimeHandlerTest1::Abort(HRESULT hrReason, DWORD dwOptions)
  235. {
  236. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Abort\n");
  237. HRESULT hr = NOERROR;
  238. hr = _pProt->Abort(hrReason, dwOptions);
  239. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Abort (hr:%lx)\n", hr);
  240. return hr;
  241. }
  242. //+---------------------------------------------------------------------------
  243. //
  244. // Method: CMimeHandlerTest1::Terminate
  245. //
  246. // Synopsis:
  247. //
  248. // Arguments: [dwOptions] --
  249. //
  250. // Returns:
  251. //
  252. // History: 10-29-1996 JohannP (Johann Posch) Created
  253. //
  254. // Notes:
  255. //
  256. //----------------------------------------------------------------------------
  257. STDMETHODIMP CMimeHandlerTest1::Terminate(DWORD dwOptions)
  258. {
  259. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Terminate\n");
  260. HRESULT hr = NOERROR;
  261. TransAssert((_pProt));
  262. //IOInetProtocol *pProt = _pProt;
  263. hr = _pProt->Terminate(dwOptions);
  264. //pProt->Release();
  265. //_pProt = 0;
  266. _pProtSnk->Release();
  267. _pProtSnk = 0;
  268. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Terminate (hr:%lx)\n", hr);
  269. return hr;
  270. }
  271. //+---------------------------------------------------------------------------
  272. //
  273. // Method: CMimeHandlerTest1::Suspend
  274. //
  275. // Synopsis:
  276. //
  277. // Arguments: (none)
  278. //
  279. // Returns:
  280. //
  281. // History: 10-29-1996 JohannP (Johann Posch) Created
  282. //
  283. // Notes:
  284. //
  285. //----------------------------------------------------------------------------
  286. STDMETHODIMP CMimeHandlerTest1::Suspend()
  287. {
  288. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Suspend\n");
  289. HRESULT hr = _pProt->Suspend();
  290. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Suspend (hr:%lx)\n", hr);
  291. return hr;
  292. }
  293. //+---------------------------------------------------------------------------
  294. //
  295. // Method: CMimeHandlerTest1::Resume
  296. //
  297. // Synopsis:
  298. //
  299. // Arguments: (none)
  300. //
  301. // Returns:
  302. //
  303. // History: 10-29-1996 JohannP (Johann Posch) Created
  304. //
  305. // Notes:
  306. //
  307. //----------------------------------------------------------------------------
  308. STDMETHODIMP CMimeHandlerTest1::Resume()
  309. {
  310. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Resume\n");
  311. HRESULT hr = _pProt->Resume();
  312. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Resume (hr:%lx)\n", hr);
  313. return hr;
  314. }
  315. //+---------------------------------------------------------------------------
  316. //
  317. // Method: CMimeHandlerTest1::Read
  318. //
  319. // Synopsis:
  320. //
  321. // Arguments: [ULONG] --
  322. // [ULONG] --
  323. // [pcbRead] --
  324. //
  325. // Returns:
  326. //
  327. // History: 10-29-1996 JohannP (Johann Posch) Created
  328. //
  329. // Notes:
  330. //
  331. //----------------------------------------------------------------------------
  332. STDMETHODIMP CMimeHandlerTest1::Read(void *pBuffer, ULONG cbBuffer,ULONG *pcbRead)
  333. {
  334. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Read\n");
  335. HRESULT hr = E_FAIL;
  336. BOOL fRead = TRUE;
  337. DWORD dwCopy = 0;
  338. DWORD dwCopyNew = 0;
  339. if ( (_dwOInetBdgFlags & (PI_MIMEVERIFICATION | PI_DOCFILECLSIDLOOKUP))
  340. && (_cbBufferFilled))
  341. {
  342. fRead = FALSE;
  343. // copy data form the local buffer to the provide buffer
  344. if (cbBuffer < _cbBufferFilled)
  345. {
  346. dwCopy = cbBuffer;
  347. memcpy(pBuffer, _pBuffer, cbBuffer);
  348. // move the memory to the front
  349. memcpy(_pBuffer, _pBuffer + cbBuffer, _cbBufferFilled - cbBuffer);
  350. _cbBufferFilled -= cbBuffer;
  351. hr = S_OK;
  352. }
  353. else if (cbBuffer == _cbBufferFilled)
  354. {
  355. dwCopy = _cbBufferFilled;
  356. memcpy(pBuffer, _pBuffer, _cbBufferFilled);
  357. _cbBufferFilled = 0;
  358. hr = S_OK;
  359. }
  360. else
  361. {
  362. //
  363. // user buffer is greater than what is available in
  364. //
  365. dwCopy = _cbBufferFilled;
  366. memcpy(pBuffer, _pBuffer, _cbBufferFilled);
  367. _cbBufferFilled = 0;
  368. fRead = TRUE;
  369. hr = E_PENDING;
  370. }
  371. }
  372. if (fRead)
  373. {
  374. if (_pProt)
  375. {
  376. hr = _pProt->Read( ((LPBYTE)pBuffer) + dwCopy, cbBuffer - dwCopy, &dwCopyNew);
  377. _cbTotalBytesRead += dwCopyNew;
  378. }
  379. else
  380. {
  381. hr = S_FALSE;
  382. }
  383. }
  384. if (pcbRead)
  385. {
  386. *pcbRead = dwCopy + dwCopyNew;
  387. }
  388. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Read (hr:%lx)\n",hr);
  389. return hr;
  390. }
  391. //+---------------------------------------------------------------------------
  392. //
  393. // Method: CMimeHandlerTest1::Seek
  394. //
  395. // Synopsis:
  396. //
  397. // Arguments: [DWORD] --
  398. // [ULARGE_INTEGER] --
  399. // [plibNewPosition] --
  400. //
  401. // Returns:
  402. //
  403. // History: 10-29-1996 JohannP (Johann Posch) Created
  404. //
  405. // Notes:
  406. //
  407. //----------------------------------------------------------------------------
  408. STDMETHODIMP CMimeHandlerTest1::Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition)
  409. {
  410. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Seek\n");
  411. HRESULT hr = _pProt->Seek(dlibMove, dwOrigin, plibNewPosition);
  412. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Seek (hr:%lx)\n", hr);
  413. return hr;
  414. }
  415. //+---------------------------------------------------------------------------
  416. //
  417. // Method: CMimeHandlerTest1::LockRequest
  418. //
  419. // Synopsis:
  420. //
  421. // Arguments: [dwOptions] --
  422. //
  423. // Returns:
  424. //
  425. // History: 10-29-1996 JohannP (Johann Posch) Created
  426. //
  427. // Notes:
  428. //
  429. //----------------------------------------------------------------------------
  430. STDMETHODIMP CMimeHandlerTest1::LockRequest(DWORD dwOptions)
  431. {
  432. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::LockRequest\n");
  433. HRESULT hr = hr = _pProt->LockRequest(dwOptions);
  434. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::LockRequest (hr:%lx)\n",hr);
  435. return hr;
  436. }
  437. //+---------------------------------------------------------------------------
  438. //
  439. // Method: CMimeHandlerTest1::UnlockRequest
  440. //
  441. // Synopsis:
  442. //
  443. // Arguments: (none)
  444. //
  445. // Returns:
  446. //
  447. // History: 10-29-1996 JohannP (Johann Posch) Created
  448. //
  449. // Notes:
  450. //
  451. //----------------------------------------------------------------------------
  452. STDMETHODIMP CMimeHandlerTest1::UnlockRequest()
  453. {
  454. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::UnlockRequest\n");
  455. HRESULT hr = NOERROR;
  456. hr = _pProt->UnlockRequest();
  457. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::UnlockRequest (hr:%lx)\n", hr);
  458. return hr;
  459. }
  460. //+---------------------------------------------------------------------------
  461. //
  462. // Method: CTransaction::OnDataReceived
  463. //
  464. // Synopsis:
  465. //
  466. // Arguments: [grfBSC] --
  467. // [cbBytesAvailable] --
  468. // [dwTotalSize] --
  469. // [pcbNewAvailable] --
  470. //
  471. // Returns:
  472. //
  473. // History: 4-15-1997 JohannP (Johann Posch) Created
  474. //
  475. // Notes:
  476. //
  477. //----------------------------------------------------------------------------
  478. #if 0
  479. STDMETHODIMP CMimeHandlerTest1::OnDataReceived(DWORD *pgrfBSC, DWORD *pcbBytesAvailable, DWORD *pdwTotalSize) //, DWORD *pcbNewAvailable)
  480. {
  481. PerfDbgLog3(tagCTransaction, this, "+CMimeHandlerTest1::OnDataReceived (grfBSC:%lx, cbBytesAvailable:%ld, _cbTotalBytesRead:%ld)",
  482. *pgrfBSC, *pcbBytesAvailable, _cbTotalBytesRead);
  483. HRESULT hr = NOERROR;
  484. DWORD grfBSC = *pgrfBSC;
  485. DWORD cbBytesAvailable = *pcbBytesAvailable;
  486. DWORD dwTotalSize = *pdwTotalSize;
  487. DWORD *pcbNewAvailable = &cbBytesAvailable;
  488. *pcbNewAvailable = cbBytesAvailable;
  489. if (_dwOInetBdgFlags & (PI_MIMEVERIFICATION | PI_DOCFILECLSIDLOOKUP))
  490. {
  491. DWORD dwNewData = 0;
  492. TransAssert((_pProt && _cbDataSniffMin));
  493. // _cbTotalBytesRead = # of bytes read so far
  494. if (_cbTotalBytesRead < _cbDataSniffMin)
  495. {
  496. // no bytes read so far
  497. TransAssert((_cbTotalBytesRead < _cbDataSniffMin));
  498. // read data into buffer and report progess
  499. do
  500. {
  501. hr = _pProt->Read(_pBuffer + _cbBufferFilled, _cbBufferSize - _cbBufferFilled, &dwNewData);
  502. _cbTotalBytesRead += dwNewData;
  503. _cbBufferFilled += dwNewData;
  504. } while ((hr == S_OK) && (_cbTotalBytesRead < _cbDataSniffMin));
  505. // now check if this is docfile
  506. // if so download at least 2k
  507. if (!_fDocFile && _cbBufferFilled && (IsDocFile(_pBuffer, _cbBufferFilled) == S_OK))
  508. {
  509. _fDocFile = TRUE;
  510. _cbDataSniffMin = (dwTotalSize && dwTotalSize < DATASNIFSIZEDOCFILE_MIN) ? dwTotalSize : DATASNIFSIZEDOCFILE_MIN;
  511. }
  512. if ((hr == E_PENDING) && (_cbTotalBytesRead < _cbDataSniffMin))
  513. {
  514. // do not report anything - wait until we get more data
  515. // a request is pending at this time
  516. // need more data to sniff properly
  517. hr = S_NEEDMOREDATA;
  518. }
  519. else if (hr == NOERROR || hr == E_PENDING)
  520. {
  521. TransAssert((_cbTotalBytesRead != 0));
  522. // report the data we have in the buffer or
  523. // the available #
  524. DWORD cbBytesReport = (cbBytesAvailable > _cbTotalBytesRead) ? cbBytesAvailable : _cbTotalBytesRead + 1;
  525. if (dwTotalSize && ((cbBytesReport > dwTotalSize)))
  526. {
  527. cbBytesReport = dwTotalSize;
  528. }
  529. *pcbNewAvailable = cbBytesReport;
  530. }
  531. else if (hr == S_FALSE)
  532. {
  533. // end of stream
  534. *pgrfBSC |= (BSCF_LASTDATANOTIFICATION & BSCF_DATAFULLYAVAILABLE);
  535. *pcbBytesAvailable = *pdwTotalSize = _cbTotalBytesRead;
  536. }
  537. if ( (!_fMimeVerified)
  538. && ( (*pcbNewAvailable >= _cbDataSniffMin)
  539. || (hr == S_FALSE)) )
  540. {
  541. // enough data or end of stream
  542. _fMimeVerified = TRUE;
  543. LPCWSTR pwzStr = FindMimeFromDataIntern(_pwzFileName,_pBuffer, _cbBufferFilled, _pwzMimeSuggested, 0);
  544. _pProtSnk->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, pwzStr);
  545. if (_pwzMimeSuggested != pwzStr)
  546. {
  547. if (_pwzMimeSuggested)
  548. {
  549. delete [] _pwzMimeSuggested;
  550. }
  551. if (pwzStr)
  552. {
  553. _pwzMimeSuggested = OLESTRDuplicate((LPWSTR)pwzStr);
  554. }
  555. }
  556. if ( _fDocFile
  557. && (_dwOInetBdgFlags & PI_DOCFILECLSIDLOOKUP))
  558. {
  559. // find the class id and send it on
  560. CLSID clsid;
  561. HRESULT hr1 = GetClassDocFileBuffer(_pBuffer, _cbBufferFilled, &clsid);
  562. if (hr1 == NOERROR)
  563. {
  564. LPOLESTR pwzStrClsId;
  565. StringFromCLSID(clsid, &pwzStrClsId);
  566. _pProtSnk->ReportProgress(BINDSTATUS_CLASSIDAVAILABLE, pwzStrClsId);
  567. delete [] pwzStrClsId;
  568. }
  569. }
  570. }
  571. hr = NOERROR;
  572. }
  573. //TransAssert((cbBytesAvailable <= *pcbNewAvailable));
  574. if (cbBytesAvailable > *pcbNewAvailable)
  575. {
  576. *pcbNewAvailable = cbBytesAvailable;
  577. }
  578. if (dwTotalSize && (dwTotalSize < *pcbNewAvailable))
  579. {
  580. *pcbNewAvailable = dwTotalSize;
  581. }
  582. }
  583. {
  584. CLock lck(_mxs);
  585. _cbBytesReported = *pcbNewAvailable;
  586. *pdwTotalSize = dwTotalSize;
  587. }
  588. PerfDbgLog2(tagCTransaction, this, "-CMimeHandlerTest1::OnDataReceived (hr:%lx, _cbBufferFilled:%lx)", hr, _cbBufferFilled);
  589. return hr;
  590. }
  591. #endif // 0
  592. //+---------------------------------------------------------------------------
  593. //
  594. // Method: CMimeHandlerTest1::Switch
  595. //
  596. // Synopsis:
  597. //
  598. // Arguments: [pStateInfo] --
  599. //
  600. // Returns:
  601. //
  602. // History: 11-07-1996 JohannP (Johann Posch) Created
  603. //
  604. // Notes:
  605. //
  606. //----------------------------------------------------------------------------
  607. STDMETHODIMP CMimeHandlerTest1::Switch(PROTOCOLDATA *pStateInfo)
  608. {
  609. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::Switch");
  610. HRESULT hr = NOERROR;
  611. hr = _pProtSnk->Switch(pStateInfo);
  612. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::Switch (hr:%lx)", hr);
  613. return hr;
  614. }
  615. //+---------------------------------------------------------------------------
  616. //
  617. // Method: CMimeHandlerTest1::ReportProgress
  618. //
  619. // Synopsis:
  620. //
  621. // Arguments: [NotMsg] --
  622. // [szStatusText] --
  623. //
  624. // Returns:
  625. //
  626. // History: 11-07-1996 JohannP (Johann Posch) Created
  627. //
  628. // Notes:
  629. //
  630. //----------------------------------------------------------------------------
  631. STDMETHODIMP CMimeHandlerTest1::ReportProgress(ULONG NotMsg, LPCWSTR pwzStatusText)
  632. {
  633. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::ReportProgress");
  634. HRESULT hr = NOERROR;
  635. switch (NotMsg)
  636. {
  637. case BINDSTATUS_MIMETYPEAVAILABLE:
  638. if (_dwOInetBdgFlags & (PI_MIMEVERIFICATION | PI_DOCFILECLSIDLOOKUP))
  639. {
  640. // report the mime later after sniffing data
  641. _pwzMimeSuggested = OLESTRDuplicate(pwzStatusText);
  642. }
  643. else
  644. {
  645. hr = _pProtSnk->ReportProgress(NotMsg, pwzStatusText);
  646. }
  647. break;
  648. case BINDSTATUS_CACHEFILENAMEAVAILABLE :
  649. _pwzFileName = OLESTRDuplicate(pwzStatusText);
  650. default:
  651. {
  652. hr = _pProtSnk->ReportProgress(NotMsg, pwzStatusText);
  653. }
  654. } // end switch
  655. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::ReportProgress (hr:%lx)", hr);
  656. return hr;
  657. }
  658. //+---------------------------------------------------------------------------
  659. //
  660. // Method: CMimeHandlerTest1::ReportData
  661. //
  662. // Synopsis:
  663. //
  664. // Arguments: [grfBSCF] --
  665. // [ULONG] --
  666. // [ulProgressMax] --
  667. //
  668. // Returns:
  669. //
  670. // History: 11-07-1996 JohannP (Johann Posch) Created
  671. //
  672. // Notes:
  673. //
  674. //----------------------------------------------------------------------------
  675. STDMETHODIMP CMimeHandlerTest1::ReportData(DWORD grfBSCF, ULONG ulProgress,ULONG ulProgressMax)
  676. {
  677. PerfDbgLog3(tagCTransaction, this, "+CMimeHandlerTest1::ReportData(grfBSCF:%lx, ulProgress:%ld, ulProgressMax:%ld)",
  678. grfBSCF, ulProgress, ulProgressMax);
  679. HRESULT hr = NOERROR;
  680. /*
  681. if ( (_dwOInetBdgFlags & (PI_MIMEVERIFICATION | PI_DOCFILECLSIDLOOKUP)
  682. && (OnDataReceived(&grfBSCF, &ulProgress, &ulProgressMax) == NOERROR)) )
  683. {
  684. hr = _pProtSnk->ReportData( grfBSCF, ulProgress, ulProgressMax);
  685. }
  686. else
  687. */
  688. {
  689. hr = _pProtSnk->ReportData( grfBSCF, ulProgress, ulProgressMax);
  690. }
  691. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::ReportData (hr:%lx)", hr);
  692. return hr;
  693. }
  694. //+---------------------------------------------------------------------------
  695. //
  696. // Method: CMimeHandlerTest1::ReportResult
  697. //
  698. // Synopsis:
  699. //
  700. // Arguments: [DWORD] --
  701. // [dwError] --
  702. // [wzResult] --
  703. //
  704. // Returns:
  705. //
  706. // History: 11-07-1996 JohannP (Johann Posch) Created
  707. //
  708. // Notes:
  709. //
  710. //----------------------------------------------------------------------------
  711. STDMETHODIMP CMimeHandlerTest1::ReportResult(HRESULT hrResult, DWORD dwError, LPCWSTR wzResult)
  712. {
  713. PerfDbgLog(tagCTransaction, this, "+CMimeHandlerTest1::ReportResult");
  714. HRESULT hr = NOERROR;
  715. hr = _pProtSnk->ReportResult(hrResult, dwError, wzResult);
  716. PerfDbgLog1(tagCTransaction, this, "-CMimeHandlerTest1::ReportResult (hr:%lx)", hr);
  717. return hr;
  718. }
  719. STDMETHODIMP CMimeHandlerTest1::Initialize(DWORD dwMode, DWORD dwOptions, IUnknown *pUnk, IOInetProtocol *pProt, IOInetProtocolSink *pProtSnk)
  720. {
  721. HRESULT hr = NOERROR;
  722. _dwMode = dwMode;
  723. _pUnk = pUnk;
  724. _pProt = pProt;
  725. _pProtSnk = pProtSnk;
  726. if (_pProtSnk)
  727. {
  728. _pProtSnk->AddRef();
  729. }
  730. if (_pUnk)
  731. {
  732. _pUnk->AddRef();
  733. }
  734. _dwOInetBdgFlags = dwOptions;
  735. if (_dwOInetBdgFlags & (PI_MIMEVERIFICATION | PI_DOCFILECLSIDLOOKUP))
  736. {
  737. _cbBufferSize = DATASNIFSIZEDOCFILE_MIN;
  738. _pBuffer = (LPBYTE) new BYTE[_cbBufferSize];
  739. if (!_pBuffer)
  740. {
  741. _cbBufferSize = 0;
  742. hr = E_OUTOFMEMORY;
  743. }
  744. _cbDataSniffMin = _cbBufferSize;
  745. }
  746. TransAssert((_pUnk && _pProt && _pProtSnk));
  747. return hr;
  748. }