chxavactivewatcher.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 143 行
CPP
143 行
/************************************************************************
* chxavactivewatcher.cpp
* ----------------------
*
* Synopsis:
*
* Implementation of base class for classes that request active object
* event notification from system services.
*
*
*
* (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
*
************************************************************************/
// Symbian includes...
// Helix includes...
#include "hxassert.h"
// Includes from this project...
#include "hxsym_debug.h"
#include "chxavmisc.h"
#include "chxavactivewatcher.h"
///////////////////////////////////
// ctor
CHXAvActiveWatcher::CHXAvActiveWatcher()
: m_bKeepWatching(false)
, m_msForwardEventDelay(0)
{
}
///////////////////////////////////
// dtor
CHXAvActiveWatcher::~CHXAvActiveWatcher()
{
// derived classes must call StopWatching() (recall there is a this pointer adjustment during destruct)
HX_ASSERT(!m_spWatchObject->IsActive());
}
///////////////////////////////////
//
void CHXAvActiveWatcher::BaseConstructL(TInt activePriority)
{
// initialize active object for receiving system event notifications
m_spWatchObject = new CHXAvActiveDisp<CHXAvActiveWatcher>(this, &CHXAvActiveWatcher::OnEvent, &CHXAvActiveWatcher::OnCancelWatch);
m_spWatchObject->SetPriority(activePriority);
CActiveScheduler::Add(m_spWatchObject.raw_ptr());
// see OnEvent()
m_cbFowardEvent.ConstructL(MakeCommand(this, &CHXAvActiveWatcher::ForwardEvent));
}
///////////////////////////////////
// active object cancel
void CHXAvActiveWatcher::OnCancelWatch(TInt status)
{
DPRINTF(SYMP_INFO, ("CHXAvActiveWatcher::OnCancelWatch(): status = %d\n", status));
m_bKeepWatching = false;
// derived: cancel request from system system service provider
DoCancelRequest(m_spWatchObject);
}
////////////////////////////////////////////////////////
// foward event notification to event handler
void CHXAvActiveWatcher::ForwardEvent()
{
// set watch before executing handler so events are not missed
if(m_bKeepWatching)
{
WatchForNextEvent();
}
if(m_spEventHandler)
{
m_spEventHandler->Execute();
}
}
////////////////////////////////////////////////////////
// event notication from system
void CHXAvActiveWatcher::OnEvent(TInt status)
{
DPRINTF(SYMP_INFO, ("CHXAvActiveWatcher::OnEvent(): status = %d; keep watching = %s\n", status, dbg::Bool(m_bKeepWatching)));
if(KErrNone == status)
{
if( m_msForwardEventDelay != 0 )
{
//
// delay notification for this event to prevent execessive event
// notifications; this is helpful for events such as filesystem
// events, where many events may be generated in rapid succession
// (e.g.,a group of files are being created/deleted/moved)
//
m_cbFowardEvent.Set(m_msForwardEventDelay);
}
else
{
ForwardEvent();
}
}
}
////////////////////////////////////////////////////////
// watch all events from here on
void CHXAvActiveWatcher::StartWatching()
{
m_bKeepWatching = true;
// start watching if not watching already
if (!m_spWatchObject->IsActive())
{
WatchForNextEvent();
}
}
////////////////////////////////////////////////////////
//
void CHXAvActiveWatcher::WatchForNextEvent()
{
HX_ASSERT(!m_spWatchObject->IsActive());
// derived: request event notification from some system service
DoIssueRequest(m_spWatchObject);
m_spWatchObject->Activate();
}
////////////////////////////////////////////////////////
//
void CHXAvActiveWatcher::StopWatching()
{
m_bKeepWatching = false;
if( m_spWatchObject && m_spWatchObject->IsActive() )
{
m_spWatchObject->Cancel();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?