bsc.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 13k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // BSC.CPP
  3. //
  4. // Implementation of CBindStatusCallback.
  5. //
  6. // History:
  7. //
  8. // Author   Date        Description
  9. // ------   ----        -----------
  10. // jaym     07/15/97    Created
  11. /////////////////////////////////////////////////////////////////////////////
  12. #include "precomp.h"
  13. #include "bsc.h"
  14. #define TF_LIFETIME         0
  15. #define TF_DEBUGREFCOUNT    0
  16. #define TF_DEBUGQI          0
  17. #define TF_BINDING          0
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CBindStatusCallback
  20. /////////////////////////////////////////////////////////////////////////////
  21. CBindStatusCallback::CBindStatusCallback
  22. (
  23. ) : m_cRef(1)
  24. {
  25.     TraceMsg(TF_LIFETIME, "0x%.8X ctor CBindStatusCallback", this);
  26.     m_pBinding = NULL;
  27. }
  28. CBindStatusCallback::~CBindStatusCallback
  29. (
  30. )
  31. {
  32.     TraceMsg(TF_LIFETIME, "0x%.8X dtor CBindStatusCallback", this);
  33.     if (m_pBinding != NULL)
  34.         EVAL(m_pBinding->Release() == 0);
  35. }
  36. /////////////////////////////////////////////////////////////////////////////
  37. // Interfaces
  38. /////////////////////////////////////////////////////////////////////////////
  39. /////////////////////////////////////////////////////////////////////////////
  40. // IUnknown interface
  41. /////////////////////////////////////////////////////////////////////////////
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CBindStatusCallback::AddRef
  44. /////////////////////////////////////////////////////////////////////////////
  45. ULONG CBindStatusCallback::AddRef
  46. (
  47. {
  48.     m_cRef++;
  49.     TraceMsg(   TF_DEBUGREFCOUNT,
  50.                 "0x%.8X CBindStatusCallback::AddRef, m_cRef = %d",
  51.                 this,
  52.                 m_cRef);
  53.     return m_cRef;
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CBindStatusCallback::Release
  57. /////////////////////////////////////////////////////////////////////////////
  58. ULONG CBindStatusCallback::Release
  59. (
  60. )
  61. {
  62.     m_cRef--;
  63.     TraceMsg(   TF_DEBUGREFCOUNT,
  64.                 "0x%.8X CBindStatusCallback::Release, m_cRef = %d",
  65.                 this,
  66.                 m_cRef);
  67.     if (m_cRef > 0)
  68.         return m_cRef;
  69.     delete this;
  70.     return 0;
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CBindStatusCallback::QueryInterface
  74. /////////////////////////////////////////////////////////////////////////////
  75. HRESULT CBindStatusCallback::QueryInterface
  76. (
  77.     REFIID      riid,
  78.     LPVOID *    ppvObj
  79. )
  80. {
  81.     IUnknown * pUnk;
  82.     *ppvObj = NULL;
  83.     if (InlineIsEqualGUID(riid, IID_IUnknown))
  84.         pUnk = SAFECAST(this, IUnknown *);
  85.     else if (InlineIsEqualGUID(riid, IID_IBindStatusCallback))
  86.         pUnk = SAFECAST(this, IBindStatusCallback *);
  87.     else
  88.     {
  89. #ifdef _DEBUG
  90.         TCHAR szName[128];
  91.         TraceMsg(   TF_DEBUGQI,
  92.                     "0x%.8X CBindStatusCallback::QueryInterface(%s) -- FAILED",
  93.                     this,
  94.                     DebugIIDName(riid, szName));
  95. #endif  // _DEBUG
  96.         return E_NOINTERFACE;
  97.     }
  98.     pUnk->AddRef();
  99.     *ppvObj = (void *)pUnk;
  100.     return S_OK;
  101. }
  102. /////////////////////////////////////////////////////////////////////////////
  103. // IBindStatusCallback interface
  104. /////////////////////////////////////////////////////////////////////////////
  105. /////////////////////////////////////////////////////////////////////////////
  106. // CBindStatusCallback::OnStartBinding
  107. /////////////////////////////////////////////////////////////////////////////
  108. STDMETHODIMP CBindStatusCallback::OnStartBinding
  109. (
  110.     DWORD       dwReserved,
  111.     IBinding *  pBinding
  112. )
  113. {
  114.     TraceMsg(TF_BINDING, "0x%.8X OnStartBinding()", this);
  115.     if (pBinding == NULL)
  116.         return E_INVALIDARG;
  117.     ASSERT(m_pBinding == NULL);
  118.     m_pBinding = pBinding;
  119.     m_pBinding->AddRef();
  120.     return S_OK;
  121. }
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CBindStatusCallback::GetPriority
  124. /////////////////////////////////////////////////////////////////////////////
  125. STDMETHODIMP CBindStatusCallback::GetPriority
  126. (
  127.     LONG * pnPriority
  128. )
  129. {
  130.     TraceMsg(TF_BINDING, "0x%.8X GetPriority()", this);
  131.     if (pnPriority == NULL)
  132.         return E_INVALIDARG;
  133.     *pnPriority = THREAD_PRIORITY_NORMAL;
  134.     return S_OK;
  135. }
  136. /////////////////////////////////////////////////////////////////////////////
  137. // CBindStatusCallback::OnLowResource
  138. /////////////////////////////////////////////////////////////////////////////
  139. STDMETHODIMP CBindStatusCallback::OnLowResource
  140. (
  141.     DWORD reserved
  142. )
  143. {
  144.     TraceMsg(TF_BINDING, "0x%.8X OnLowResource()", this);
  145.     return E_NOTIMPL;
  146. }
  147. /////////////////////////////////////////////////////////////////////////////
  148. // CBindStatusCallback::OnProgress
  149. /////////////////////////////////////////////////////////////////////////////
  150. STDMETHODIMP CBindStatusCallback::OnProgress
  151. (
  152.     ULONG   ulProgress,
  153.     ULONG   ulProgressMax,
  154.     ULONG   ulStatusCode,
  155.     LPCWSTR szStatusText
  156. )
  157. {
  158.     TraceMsg(   TF_BINDING,
  159.                 "0x%.8X OnProgress(ulProgress = %u, ulProgressMax = %d, ulStatusCode = %u)",
  160.                 this,
  161.                 ulProgress, ulProgressMax,
  162.                 ulStatusCode);
  163.     return E_NOTIMPL;
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. // CBindStatusCallback::OnStopBinding
  167. /////////////////////////////////////////////////////////////////////////////
  168. STDMETHODIMP CBindStatusCallback::OnStopBinding
  169. (
  170.     HRESULT hrResult,
  171.     LPCWSTR szError
  172. )
  173. {
  174.     TraceMsg(TF_BINDING, "0x%.8X CBindStatusCallback::OnStopBinding(0x%.8X)", this, hrResult);
  175.     if (m_pBinding != NULL)
  176.     {
  177.         m_pBinding->Release();
  178.         m_pBinding = NULL;
  179.     }
  180.     return S_OK;
  181. }
  182. /////////////////////////////////////////////////////////////////////////////
  183. // CBindStatusCallback::GetBindInfo
  184. /////////////////////////////////////////////////////////////////////////////
  185. STDMETHODIMP CBindStatusCallback::GetBindInfo
  186. (
  187.     DWORD *     grfBINDF,
  188.     BINDINFO *  pbindinfo
  189. )
  190. {
  191.     TraceMsg(TF_BINDING, "0x%.8X GetBindInfo()", this);
  192.     return E_NOTIMPL;
  193. }
  194. /////////////////////////////////////////////////////////////////////////////
  195. // CBindStatusCallback::OnDataAvailable
  196. /////////////////////////////////////////////////////////////////////////////
  197. STDMETHODIMP CBindStatusCallback::OnDataAvailable
  198. (
  199.     DWORD       grfBSCF,
  200.     DWORD       dwSize,
  201.     FORMATETC * pformatetc,
  202.     STGMEDIUM * pstgmed
  203. )
  204. {
  205.     TraceMsg(   TF_BINDING,
  206.                 "0x%.8X OnDataAvailable(0x%.8X, %d)",
  207.                 this, grfBSCF, dwSize);
  208.     return E_NOTIMPL;
  209. }
  210. /////////////////////////////////////////////////////////////////////////////
  211. // CBindStatusCallback::OnObjectAvailable
  212. /////////////////////////////////////////////////////////////////////////////
  213. STDMETHODIMP CBindStatusCallback::OnObjectAvailable
  214. (
  215.     REFIID      riid,
  216.     IUnknown *  punk
  217. )
  218. {
  219.     TraceMsg(TF_BINDING, "0x%.8X OnObjectAvailable()", this);
  220.     return E_NOTIMPL;
  221. }
  222. /////////////////////////////////////////////////////////////////////////////
  223. // CTimeoutBSC
  224. /////////////////////////////////////////////////////////////////////////////
  225. CTimeoutBSC::CTimeoutBSC
  226. (
  227.     DWORD dwTimeoutMS
  228. ) : m_dwTimeoutMS(dwTimeoutMS)
  229. {
  230.     TraceMsg(TF_LIFETIME, "0x%.8X ctor CTimeoutBSC", this);
  231.     m_idTimeoutEvent = NULL;
  232. }
  233. CTimeoutBSC::~CTimeoutBSC
  234. (
  235. )
  236. {
  237.     TraceMsg(TF_LIFETIME, "0x%.8X dtor CTimeoutBSC", this);
  238.     StopTimeoutTimer();
  239. }
  240. /////////////////////////////////////////////////////////////////////////////
  241. // CTimeoutBSC::StopTimeoutTimer
  242. /////////////////////////////////////////////////////////////////////////////
  243. void CTimeoutBSC::StopTimeoutTimer
  244. (
  245. )
  246. {
  247.     if (m_idTimeoutEvent != NULL)
  248.     {
  249.         EVAL(timeKillEvent(m_idTimeoutEvent) == TIMERR_NOERROR);
  250.         m_idTimeoutEvent = NULL;
  251.     }
  252. }
  253. /////////////////////////////////////////////////////////////////////////////
  254. // CTimeoutBSC::Abort
  255. /////////////////////////////////////////////////////////////////////////////
  256. HRESULT CTimeoutBSC::Abort
  257. (
  258. )
  259.     return ((m_pBinding != NULL) ? m_pBinding->Abort() : E_FAIL);
  260. }
  261. /////////////////////////////////////////////////////////////////////////////
  262. // CTimeoutBSC::OnStartBinding
  263. /////////////////////////////////////////////////////////////////////////////
  264. STDMETHODIMP CTimeoutBSC::OnStartBinding
  265. (
  266.     DWORD       dwReserved,
  267.     IBinding *  pBinding
  268. )
  269. {
  270.     HRESULT hrResult;
  271.     TraceMsg(TF_BINDING, "0x%.8X CTimeoutBSC::OnStartBinding()", this);
  272.     for (;;)
  273.     {
  274.         if (FAILED(hrResult = CBindStatusCallback::OnStartBinding(  dwReserved,
  275.                                                                     pBinding)))
  276.         {
  277.             break;
  278.         }
  279.         if ((m_idTimeoutEvent = timeSetEvent(   m_dwTimeoutMS,
  280.                                                 500,
  281.                                                 BSCTimeoutTimerProc,
  282.                                                 (DWORD_PTR)SAFECAST(this, CTimeoutBSC *),
  283.                                                 TIME_ONESHOT)) == NULL)
  284.         {
  285.             hrResult = E_FAIL;
  286.             break;
  287.         }
  288.         break;
  289.     }
  290.     return hrResult;
  291. }
  292. /////////////////////////////////////////////////////////////////////////////
  293. // CTimeoutBSC::OnProgress
  294. /////////////////////////////////////////////////////////////////////////////
  295. STDMETHODIMP CTimeoutBSC::OnProgress
  296. (
  297.     ULONG   ulProgress,
  298.     ULONG   ulProgressMax,
  299.     ULONG   ulStatusCode,
  300.     LPCWSTR szStatusText
  301. )
  302. {
  303.     TraceMsg(   TF_BINDING,
  304.                 "0x%.8X OnProgress(ulProgress = %u, ulProgressMax = %d, ulStatusCode = %u)",
  305.                 this,
  306.                 ulProgress, ulProgressMax,
  307.                 ulStatusCode);
  308.     if (ulStatusCode == BINDSTATUS_BEGINDOWNLOADDATA)
  309.         StopTimeoutTimer();
  310.     return S_OK;
  311. }
  312. /////////////////////////////////////////////////////////////////////////////
  313. // CTimeoutBSC::OnStopBinding
  314. /////////////////////////////////////////////////////////////////////////////
  315. STDMETHODIMP CTimeoutBSC::OnStopBinding
  316. (
  317.     HRESULT hrResult,
  318.     LPCWSTR szError
  319. )
  320. {
  321.     TraceMsg(TF_BINDING, "0x%.8X CTimeoutBSC::OnStopBinding(0x%X)", this, hrResult);
  322.     StopTimeoutTimer();
  323.     return CBindStatusCallback::OnStopBinding(hrResult, szError);;
  324. }
  325. /////////////////////////////////////////////////////////////////////////////
  326. // BSCTimeoutTimerProc
  327. /////////////////////////////////////////////////////////////////////////////
  328. void CALLBACK BSCTimeoutTimerProc
  329. (
  330.     UINT    uID,
  331.     UINT    uMsg,  
  332.     DWORD_PTR dwUser,
  333.     DWORD_PTR dw1,
  334.     DWORD_PTR dw2
  335. )
  336. {
  337.     CTimeoutBSC * pTimeoutBSC = (CTimeoutBSC *)dwUser;
  338.     
  339.     TraceMsg(TF_BINDING, "!!!ABORTING DOWNLOAD ATTEMPT!!!");
  340.     if (pTimeoutBSC != NULL)
  341.         EVAL(SUCCEEDED(pTimeoutBSC->Abort()));
  342. }
  343. /////////////////////////////////////////////////////////////////////////////
  344. // CSSNavigateBSC
  345. /////////////////////////////////////////////////////////////////////////////
  346. CSSNavigateBSC::CSSNavigateBSC
  347. (
  348.     CScreenSaverWindow *    pScreenSaverWnd,
  349.     DWORD                   dwTimeoutMS
  350. ) : CTimeoutBSC(dwTimeoutMS), m_pScreenSaverWnd(pScreenSaverWnd)
  351. {
  352.     TraceMsg(TF_LIFETIME, "0x%.8X ctor CSSNavigateBSC", this);
  353.     ASSERT(pScreenSaverWnd != NULL);
  354. }
  355. CSSNavigateBSC::~CSSNavigateBSC
  356. (
  357. )
  358. {
  359.     TraceMsg(TF_LIFETIME, "0x%.8X dtor CSSNavigateBSC", this);
  360. }
  361. /////////////////////////////////////////////////////////////////////////////
  362. // CSSNavigateBSC::OnStopBinding
  363. /////////////////////////////////////////////////////////////////////////////
  364. STDMETHODIMP CSSNavigateBSC::OnStopBinding
  365. (
  366.     HRESULT hrResultBind,
  367.     LPCWSTR szError
  368. )
  369. {
  370.     TraceMsg(TF_BINDING, "0x%.8X CSSNavigateBSC::OnStopBinding(0x%.8X)", this, hrResultBind);
  371.     HRESULT hrResult = CTimeoutBSC::OnStopBinding(hrResultBind, szError);
  372.     if (FAILED(hrResultBind))
  373.     {
  374.         // If we failed because of a resource problem (i.e. the
  375.         // net is hosed) go offline for the rest of the session.
  376.         if (hrResult == INET_E_RESOURCE_NOT_FOUND)
  377.             m_pScreenSaverWnd->GoOffline();
  378.         m_pScreenSaverWnd->PostMessage(WM_ABORTNAVIGATE);
  379.     }
  380.     return hrResult;
  381. }
  382. /////////////////////////////////////////////////////////////////////////////
  383. // CSSNavigateBSC::GetBindInfo
  384. /////////////////////////////////////////////////////////////////////////////
  385. STDMETHODIMP CSSNavigateBSC::GetBindInfo
  386. (
  387.     DWORD *     grfBINDF,
  388.     BINDINFO *  pbindinfo
  389. )
  390. {
  391.     TraceMsg(TF_BINDING, "0x%.8X CSSNavigateBSC::GetBindInfo()", this);
  392.     if ( !grfBINDF || !pbindinfo || !pbindinfo->cbSize )
  393.         return E_INVALIDARG;
  394.     // Clear BINDINFO, but keep its size
  395.     DWORD cbSize = pbindinfo->cbSize;
  396.     ZeroMemory( pbindinfo, cbSize );
  397.     pbindinfo->cbSize = cbSize;
  398.     *grfBINDF = BINDF_ASYNCHRONOUS
  399.                     | BINDF_NOPROGRESSIVERENDERING
  400.                     | BINDF_SILENTOPERATION
  401.                     | BINDF_NO_UI;
  402.     if (m_pScreenSaverWnd->IsOffline())
  403.         *grfBINDF |= BINDF_OFFLINEOPERATION;
  404.     // Default method is GET.
  405.     pbindinfo->dwBindVerb = BINDVERB_GET;
  406.     ASSERT(pbindinfo->stgmedData.tymed == TYMED_NULL);
  407.     ASSERT(pbindinfo->stgmedData.hGlobal == NULL);
  408.     ASSERT(pbindinfo->stgmedData.pUnkForRelease == NULL);
  409.  
  410.     return S_OK;
  411. }