pxtimer.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
  36. #include "hxtypes.h"
  37. #include "hxcom.h"
  38. #include "hxengin.h"
  39. // pnmisc
  40. #include "baseobj.h"
  41. // pxcomlib
  42. #include "pxtimer.h"
  43. // pndebug
  44. #include "hxheap.h"
  45. #ifdef _DEBUG
  46. #undef HX_THIS_FILE
  47. static const char HX_THIS_FILE[] = __FILE__;
  48. #endif
  49. PXTimer::PXTimer()
  50. {
  51.     m_lRefCount        = 0;
  52.     m_ulState          = kStateConstructed;
  53.     m_ulInstance       = 0;
  54.     m_ulInterval       = 0;
  55.     m_pScheduler       = NULL;
  56.     m_pResponse        = NULL;
  57.     m_ulCallbackHandle = 0;
  58.     m_bCallbackPending = FALSE;
  59.     m_bInsideTimerFire = FALSE;
  60. }
  61. PXTimer::~PXTimer()
  62. {
  63.     Deallocate();
  64. }
  65. void PXTimer::Deallocate()
  66. {
  67.     if (IsCallbackPending())
  68.     {
  69.         RemovePendingCallback();
  70.     }
  71.     HX_RELEASE(m_pScheduler);
  72.     HX_RELEASE(m_pResponse);
  73. }
  74. STDMETHODIMP PXTimer::QueryInterface(REFIID riid, void** ppvObj)
  75. {
  76. QInterfaceList qiList[] =
  77. {
  78. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)this },
  79. { GET_IIDHANDLE(IID_IHXCallback), (IHXCallback*) this },
  80. };
  81.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);  
  82. }
  83. STDMETHODIMP_(UINT32) PXTimer::AddRef()
  84. {
  85.     return InterlockedIncrement(&m_lRefCount);
  86. }
  87. STDMETHODIMP_(UINT32) PXTimer::Release()
  88. {
  89.     
  90.     if (InterlockedDecrement(&m_lRefCount) > 0)
  91.     {
  92.         return m_lRefCount;
  93.     }
  94.     delete this;
  95.     return 0;
  96. }
  97. STDMETHODIMP PXTimer::Func()
  98. {
  99.     HX_RESULT retVal = HXR_OK;
  100.     if (m_pScheduler && m_pResponse)
  101.     {
  102.         // Schedule another callback m_ulInterval
  103.         // milliseconds from now
  104.         m_ulCallbackHandle = m_pScheduler->RelativeEnter(this, m_ulInterval);
  105.         // Set the callback pending flag
  106.         m_bCallbackPending = TRUE;
  107.         // Make sure we don't allow re-entrancy
  108.         // into TimerFire().
  109.         if (!m_bInsideTimerFire)
  110.         {
  111.             // Set the re-entrancy flag
  112.             m_bInsideTimerFire = TRUE;
  113.             // Call TimerFire on the response interface
  114.             m_pResponse->TimerFire(m_ulInstance);
  115.             // Clear the re-entrancy flag
  116.             m_bInsideTimerFire = FALSE;
  117.         }
  118.     }
  119.     return retVal;
  120. }
  121. HX_RESULT PXTimer::Init(UINT32           ulInstance,
  122.                         IUnknown*        pContext,
  123.                         PXTimerResponse* pResponse)
  124. {
  125.     HX_RESULT retVal = HXR_OK;
  126.     if (pContext && pResponse)
  127.     {
  128.         // Clear out everything if necessary
  129.         Deallocate();
  130.         // Init members
  131.         retVal = pContext->QueryInterface(IID_IHXScheduler,
  132.                                           (void**) &m_pScheduler);
  133.         if (SUCCEEDED(retVal))
  134.         {
  135.             // Save the members
  136.             m_ulInstance       = ulInstance;
  137.             m_pResponse        = pResponse;
  138.             m_ulCallbackHandle = 0;
  139.             m_bCallbackPending = FALSE;
  140.             m_pResponse->AddRef();
  141.             // Set the state
  142.             m_ulState = kStateInitialized;
  143.         }
  144.     }
  145.     else
  146.     {
  147.         retVal = HXR_INVALID_PARAMETER;
  148.     }
  149.     return retVal;
  150. }
  151. HX_RESULT PXTimer::StartTimer(UINT32 ulInterval)
  152. {
  153.     HX_RESULT retVal = HXR_OK;
  154.     if (m_ulState == kStateConstructed)
  155.     {
  156.         retVal = HXR_NOT_INITIALIZED;
  157.     }
  158.     else if (m_ulState == kStateInitialized)
  159.     {
  160.         if (ulInterval >= kMinInterval)
  161.         {
  162.             // Save the interval
  163.             m_ulInterval = ulInterval;
  164.             // Schedule the first callback
  165.             m_ulCallbackHandle = m_pScheduler->RelativeEnter(this, m_ulInterval);
  166.             // Set the callback flag
  167.             m_bCallbackPending = TRUE;
  168.             // Set the state
  169.             m_ulState = kStateActive;
  170.         }
  171.         else
  172.         {
  173.             retVal = HXR_INVALID_PARAMETER;
  174.         }
  175.     }
  176.     else if (m_ulState == kStateActive)
  177.     {
  178.         // Timer is already started, so no need to
  179.         // do anything...
  180.     }
  181.     return retVal;
  182. }
  183. void PXTimer::StopTimer()
  184. {
  185.     if (m_ulState == kStateConstructed ||
  186.         m_ulState == kStateInitialized)
  187.     {
  188.         // Timer has not been started; therefore,
  189.         // we don't need to do anything to stop it.
  190.     }
  191.     else if (m_ulState == kStateActive)
  192.     {
  193.         // Remove any pending callback
  194.         if (IsCallbackPending())
  195.         {
  196.             RemovePendingCallback();
  197.         }
  198.         // Reset the state
  199.         m_ulState = kStateInitialized;
  200.     }
  201. }