pxtimer.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:7k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: pxtimer.cpp,v 1.4.20.3 2004/07/09 01:44:03 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. // include
  50. #include "hxtypes.h"
  51. #include "hxcom.h"
  52. #include "hxengin.h"
  53. // pnmisc
  54. #include "baseobj.h"
  55. // pxcomlib
  56. #include "pxtimer.h"
  57. // pndebug
  58. #include "hxheap.h"
  59. #ifdef _DEBUG
  60. #undef HX_THIS_FILE
  61. static const char HX_THIS_FILE[] = __FILE__;
  62. #endif
  63. PXTimer::PXTimer()
  64. {
  65.     m_lRefCount        = 0;
  66.     m_ulState          = kStateConstructed;
  67.     m_ulInstance       = 0;
  68.     m_ulInterval       = 0;
  69.     m_pScheduler       = NULL;
  70.     m_pResponse        = NULL;
  71.     m_ulCallbackHandle = 0;
  72.     m_bCallbackPending = FALSE;
  73.     m_bInsideTimerFire = FALSE;
  74. }
  75. PXTimer::~PXTimer()
  76. {
  77.     Deallocate();
  78. }
  79. void PXTimer::Deallocate()
  80. {
  81.     if (IsCallbackPending())
  82.     {
  83.         RemovePendingCallback();
  84.     }
  85.     HX_RELEASE(m_pScheduler);
  86.     HX_RELEASE(m_pResponse);
  87. }
  88. STDMETHODIMP PXTimer::QueryInterface(REFIID riid, void** ppvObj)
  89. {
  90. QInterfaceList qiList[] =
  91. {
  92. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)this },
  93. { GET_IIDHANDLE(IID_IHXCallback), (IHXCallback*) this },
  94. };
  95.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);  
  96. }
  97. STDMETHODIMP_(UINT32) PXTimer::AddRef()
  98. {
  99.     return InterlockedIncrement(&m_lRefCount);
  100. }
  101. STDMETHODIMP_(UINT32) PXTimer::Release()
  102. {
  103.     
  104.     if (InterlockedDecrement(&m_lRefCount) > 0)
  105.     {
  106.         return m_lRefCount;
  107.     }
  108.     delete this;
  109.     return 0;
  110. }
  111. STDMETHODIMP PXTimer::Func()
  112. {
  113.     HX_RESULT retVal = HXR_OK;
  114.     if (m_pScheduler && m_pResponse)
  115.     {
  116.         // Schedule another callback m_ulInterval
  117.         // milliseconds from now
  118.         m_ulCallbackHandle = m_pScheduler->RelativeEnter(this, m_ulInterval);
  119.         // Set the callback pending flag
  120.         m_bCallbackPending = TRUE;
  121.         // Make sure we don't allow re-entrancy
  122.         // into TimerFire().
  123.         if (!m_bInsideTimerFire)
  124.         {
  125.             // Set the re-entrancy flag
  126.             m_bInsideTimerFire = TRUE;
  127.             // Call TimerFire on the response interface
  128.             m_pResponse->TimerFire(m_ulInstance);
  129.             // Clear the re-entrancy flag
  130.             m_bInsideTimerFire = FALSE;
  131.         }
  132.     }
  133.     return retVal;
  134. }
  135. HX_RESULT PXTimer::Init(UINT32           ulInstance,
  136.                         IUnknown*        pContext,
  137.                         PXTimerResponse* pResponse)
  138. {
  139.     HX_RESULT retVal = HXR_OK;
  140.     if (pContext && pResponse)
  141.     {
  142.         // Clear out everything if necessary
  143.         Deallocate();
  144.         // Init members
  145.         retVal = pContext->QueryInterface(IID_IHXScheduler,
  146.                                           (void**) &m_pScheduler);
  147.         if (SUCCEEDED(retVal))
  148.         {
  149.             // Save the members
  150.             m_ulInstance       = ulInstance;
  151.             m_pResponse        = pResponse;
  152.             m_ulCallbackHandle = 0;
  153.             m_bCallbackPending = FALSE;
  154.             m_pResponse->AddRef();
  155.             // Set the state
  156.             m_ulState = kStateInitialized;
  157.         }
  158.     }
  159.     else
  160.     {
  161.         retVal = HXR_INVALID_PARAMETER;
  162.     }
  163.     return retVal;
  164. }
  165. HX_RESULT PXTimer::StartTimer(UINT32 ulInterval)
  166. {
  167.     HX_RESULT retVal = HXR_OK;
  168.     if (m_ulState == kStateConstructed)
  169.     {
  170.         retVal = HXR_NOT_INITIALIZED;
  171.     }
  172.     else if (m_ulState == kStateInitialized)
  173.     {
  174.         if (ulInterval >= kMinInterval)
  175.         {
  176.             // Save the interval
  177.             m_ulInterval = ulInterval;
  178.             // Schedule the first callback
  179.             m_ulCallbackHandle = m_pScheduler->RelativeEnter(this, m_ulInterval);
  180.             // Set the callback flag
  181.             m_bCallbackPending = TRUE;
  182.             // Set the state
  183.             m_ulState = kStateActive;
  184.         }
  185.         else
  186.         {
  187.             retVal = HXR_INVALID_PARAMETER;
  188.         }
  189.     }
  190.     else if (m_ulState == kStateActive)
  191.     {
  192.         // Timer is already started, so no need to
  193.         // do anything...
  194.     }
  195.     return retVal;
  196. }
  197. void PXTimer::StopTimer()
  198. {
  199.     if (m_ulState == kStateConstructed ||
  200.         m_ulState == kStateInitialized)
  201.     {
  202.         // Timer has not been started; therefore,
  203.         // we don't need to do anything to stop it.
  204.     }
  205.     else if (m_ulState == kStateActive)
  206.     {
  207.         // Remove any pending callback
  208.         if (IsCallbackPending())
  209.         {
  210.             RemovePendingCallback();
  211.         }
  212.         // Reset the state
  213.         m_ulState = kStateInitialized;
  214.     }
  215. }