diff -r 560ce2306a17 -r f3930dda3342 utilities/mpapplicationmonitor/src/mpapplicationmonitor_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/mpapplicationmonitor/src/mpapplicationmonitor_p.cpp Fri Sep 03 19:58:01 2010 -0500 @@ -0,0 +1,195 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player application monitor utility - private implementation. +* +*/ + +#include +#include + +#include "mpapplicationmonitor_p.h" +#include "mpapplicationmonitor.h" +#include "mptrace.h" + +// -1 means the window will never be visible. +const TInt KWindowGroupPriority = -1; + +/*! + \class MpApplicationMonitorPrivate + \brief Music Player application monitor utility - private implementation. + + +*/ + +/*! + Constructor + */ +MpApplicationMonitorPrivate::MpApplicationMonitorPrivate( MpApplicationMonitor *qq ) + : CActive( CActive::EPriorityStandard ), + q_ptr( qq ) +{ + TX_ENTRY_ARGS( "Q pointer=" << ( void * )qq ) + CActiveScheduler::Add( this ); + TX_EXIT +} + +/*! + Destructor + */ +MpApplicationMonitorPrivate::~MpApplicationMonitorPrivate() +{ + TX_LOG + // Cancel any outstanding request + Cancel(); + + iWindowGroup.Close(); + iWsSession.Close(); + TX_EXIT +} + +/*! + \internal + */ +void MpApplicationMonitorPrivate::init( quint32 clientSecureId ) +{ + TX_ENTRY + iHostUid = TUid::Uid( clientSecureId ); + TRAPD( err, DoInitL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } + TX_EXIT +} + +/*! + Request if music player application is running. + */ +bool MpApplicationMonitorPrivate::isApplicationRunning() +{ + TX_ENTRY + bool running = false; + TRAPD( err, running = DoIsApplicationRunningL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } + TX_EXIT + return running; +} + +/*! + \internal + Checks if the chosen app is launched + */ +void MpApplicationMonitorPrivate::RunL() + { + // Get the status of this object. + const TInt errCode( iStatus.Int() ); + TX_ENTRY_ARGS("Status=" << errCode); + + if ( KErrNone == errCode ) { + TWsEvent event; + iWsSession.GetEvent( event ); + if ( event.Type() == EEventWindowGroupsChanged ) { + emit q_ptr->applicationStatusChanged( isApplicationRunning() ); + } + TX_LOG_ARGS("OK, renewing request"); + StartMonitor(); + } + else if ( KErrCancel != errCode ) { + TX_LOG_ARGS("Renewing request after error: " << errCode); + StartMonitor(); + } + else { + TX_LOG_ARGS("cancelled"); + } + TX_EXIT +} + +/*! + \internal + Cancel the outstanding request. + */ +void MpApplicationMonitorPrivate::DoCancel() +{ + TX_ENTRY + iWsSession.EventReadyCancel(); + TX_EXIT +} + +/*! + \internal + */ +void MpApplicationMonitorPrivate::DoInitL() +{ + TX_ENTRY + CreateWindowGroupL(); + StartMonitor(); + TX_EXIT +} + +/*! + \internal + */ +bool MpApplicationMonitorPrivate::DoIsApplicationRunningL() +{ + TX_ENTRY + bool taskExists = false; + CAknTaskList* taskList = CAknTaskList::NewL( iWsSession ); + TApaTask task = taskList->FindRootApp( iHostUid ); + delete taskList; + taskExists = task.Exists(); + TX_LOG_ARGS("taskExists=" << taskExists); + return taskExists; +} + +/*! + \internal + Creates a window group and hides it from the UI. + */ +void MpApplicationMonitorPrivate::CreateWindowGroupL() +{ + TX_ENTRY + User::LeaveIfError( iWsSession.Connect() ); + RWindowGroup wg( iWsSession ); + // Make a handle from the address of window group object + User::LeaveIfError( wg.Construct( reinterpret_cast( &wg ) ) ); + User::LeaveIfError( wg.EnableGroupChangeEvents() ); + + // Get the ordinal position of this window group + const TInt ordPos( wg.OrdinalPosition() ); + // Set priority so it's hidden in the UI + wg.SetOrdinalPosition( ordPos, KWindowGroupPriority ); + + // Needs to be a member variable. Must be closed in destructor. + // Otherwise can't monitor what has been opened. + iWindowGroup = wg; + + iWsSession.Flush(); + TX_EXIT +} + +/*! + \internal + Starts event monitoring. + */ +void MpApplicationMonitorPrivate::StartMonitor() +{ + TX_ENTRY + Cancel(); + + iWsSession.EventReady( &iStatus ); + SetActive(); + TX_EXIT +} +