chxkeepalive.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "chxkeepalive.h"
  36. #include "hxengin.h" // IHXCallback, IHXScheduler
  37. #include "debug.h"
  38. #define D_KEEPALIVE 0x20000000
  39. class CHXKeepAliveImp : public IHXCallback
  40. {
  41. public:
  42.     CHXKeepAliveImp(IHXScheduler* pSched, 
  43.     UINT32 timeoutMS, 
  44.     IHXCallback* pKeepAliveCB);
  45.     ~CHXKeepAliveImp();
  46.     void OnActivity();
  47.     void Done();
  48.     /*
  49.      *  IUnknown methods
  50.      */
  51.     STDMETHOD(QueryInterface) (THIS_
  52. REFIID riid,
  53. void** ppvObj);
  54.     STDMETHOD_(ULONG32,AddRef) (THIS);
  55.     STDMETHOD_(ULONG32,Release) (THIS);
  56.     /*
  57.      *  IHXCallback methods
  58.      */
  59.     /************************************************************************
  60.      * Method:
  61.      *     IHXCallback::Func
  62.      * Purpose:
  63.      *     This is the function that will be called when a callback is
  64.      *     to be executed.
  65.      */
  66.     STDMETHOD(Func) (THIS);
  67. private:
  68.     HX_RESULT scheduleCallback();
  69.     
  70.     INT32 m_lRefCount;
  71.     IHXScheduler* m_pSched;
  72.     UINT32 m_timeoutMS;
  73.     IHXCallback* m_pKeepAliveCB;
  74.     BOOL m_bActivity;
  75.     HXTimeval m_lastTime;
  76.     BOOL m_bCBPending;
  77.     CallbackHandle m_cbHandle;
  78. };
  79. CHXKeepAlive::CHXKeepAlive() :
  80.     m_pImp(0)
  81. {}
  82. CHXKeepAlive::~CHXKeepAlive()
  83. {
  84.     reset();
  85. }
  86.     
  87. HX_RESULT CHXKeepAlive::Init(IHXScheduler* pSched, 
  88.      UINT32 timeoutMS, 
  89.      IHXCallback* pKeepAliveCB)
  90. {
  91.     HX_RESULT res = HXR_FAILED;
  92.     reset();
  93.     if (pSched && (timeoutMS > 0) && pKeepAliveCB)
  94.     {
  95. m_pImp = new CHXKeepAliveImp(pSched, timeoutMS, pKeepAliveCB);
  96. if (m_pImp)
  97. {
  98.     m_pImp->AddRef();
  99.     res = HXR_OK;
  100. }
  101.     }
  102.     return res;
  103. }
  104. void CHXKeepAlive::OnActivity()
  105. {
  106.     if (m_pImp)
  107.     {
  108. m_pImp->OnActivity();
  109.     }
  110. }
  111. void CHXKeepAlive::reset()
  112. {
  113.     if (m_pImp)
  114.     {
  115. m_pImp->Done();
  116. m_pImp->Release();
  117. m_pImp = 0;
  118.     }
  119. }
  120. CHXKeepAliveImp::CHXKeepAliveImp(IHXScheduler* pSched, 
  121.  UINT32 timeoutMS, 
  122.  IHXCallback* pKeepAliveCB) :
  123.     m_lRefCount(0),
  124.     m_pSched(pSched),
  125.     m_timeoutMS(timeoutMS),
  126.     m_pKeepAliveCB(pKeepAliveCB),
  127.     m_bActivity(FALSE),
  128.     m_lastTime(pSched->GetCurrentSchedulerTime()),
  129.     m_bCBPending(FALSE),
  130.     m_cbHandle(0)
  131. {
  132.     m_pSched->AddRef();
  133.     m_pKeepAliveCB->AddRef();
  134.     scheduleCallback();
  135. }
  136. CHXKeepAliveImp::~CHXKeepAliveImp()
  137. {
  138.     Done();
  139. }
  140. void CHXKeepAliveImp::OnActivity() // Called when any activity has occured
  141. {
  142.     DPRINTF(D_KEEPALIVE, ("CHXKeepAliveImp::OnActivity(%x)n", (PTR_INT)this));
  143.     m_bActivity = TRUE;
  144. }
  145. void CHXKeepAliveImp::Done()
  146. {
  147.     DPRINTF(D_KEEPALIVE, ("CHXKeepAliveImp::Done(%x)n", (PTR_INT)this));
  148.     if (m_bCBPending)
  149.     {
  150. m_pSched->Remove(m_cbHandle);
  151. m_bCBPending = FALSE;
  152. m_cbHandle = 0;
  153.     }
  154.     
  155.     HX_RELEASE(m_pSched);
  156.     HX_RELEASE(m_pKeepAliveCB);
  157. }
  158.     /*
  159.      *  IUnknown methods
  160.      */
  161. STDMETHODIMP CHXKeepAliveImp::QueryInterface(THIS_
  162.      REFIID riid,
  163.      void** ppvObj)
  164. {
  165. QInterfaceList qiList[] =
  166. {
  167. { GET_IIDHANDLE(IID_IUnknown), this },
  168. { GET_IIDHANDLE(IID_IHXCallback), (IHXCallback*) this },
  169. };
  170.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  171. }
  172. STDMETHODIMP_(ULONG32) CHXKeepAliveImp::AddRef(THIS)
  173. {
  174.     return InterlockedIncrement(&m_lRefCount);
  175. }
  176. STDMETHODIMP_(ULONG32) CHXKeepAliveImp::Release(THIS)
  177. {
  178.     if(InterlockedDecrement(&m_lRefCount) > 0)
  179.     {
  180. return m_lRefCount;
  181.     }
  182.     delete this;
  183.     return 0;
  184. }
  185.     /*
  186.      *  IHXCallback methods
  187.      */
  188.     /************************************************************************
  189.      * Method:
  190.      *     IHXCallback::Func
  191.      * Purpose:
  192.      *     This is the function that will be called when a callback is
  193.      *     to be executed.
  194.      */
  195. STDMETHODIMP CHXKeepAliveImp::Func(THIS)
  196. {
  197.     DPRINTF(D_KEEPALIVE, ("CHXKeepAliveImp::Func(%x)n", (PTR_INT)this));
  198.     m_bCBPending = FALSE;
  199.     if (!m_bActivity && m_pKeepAliveCB)
  200.     {
  201. DPRINTF(D_KEEPALIVE, ("CHXKeepAliveImp::Func(%x) : dispatching callbackn", (PTR_INT)this));
  202. m_pKeepAliveCB->Func();
  203.     }
  204.     m_bActivity = FALSE;
  205.     scheduleCallback();
  206.     return HXR_OK;
  207. }
  208. HX_RESULT CHXKeepAliveImp::scheduleCallback()
  209. {
  210.     HX_RESULT res = HXR_UNEXPECTED;
  211.     if (!m_bCBPending && m_pSched)
  212.     {
  213. // Update timeout
  214. m_lastTime.tv_sec += m_timeoutMS / 1000;
  215. m_lastTime.tv_usec += (m_timeoutMS % 1000) * 1000;
  216. m_cbHandle = m_pSched->AbsoluteEnter(this, m_lastTime);
  217. m_bCBPending = TRUE;
  218. res = HXR_OK;
  219.     }
  220.     return res;
  221. }