diff -r 000000000000 -r 79c6a41cd166 menucontentsrv/srvsrc/mcsrunningappswgmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menucontentsrv/srvsrc/mcsrunningappswgmonitor.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2008 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: +* +*/ + +#include +#include +#include +#include + +#include "mcsrunningappswgmonitor.h" +#include "mcsrunningappshandler.h" +#include "menueng.h" + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::NewL +// --------------------------------------------------------- +// +CMcsRunningAppsWgMonitor* CMcsRunningAppsWgMonitor::NewL( + CMenuEng& aEng, MMcsRunningAppsHandler* aRunningAppsHandler, + TInt aPriority ) + { + CMcsRunningAppsWgMonitor* self = + new ( ELeave ) CMcsRunningAppsWgMonitor( aEng, aRunningAppsHandler, + aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::~CWindowGroupChangeMonitor +// --------------------------------------------------------- +// +CMcsRunningAppsWgMonitor::~CMcsRunningAppsWgMonitor() + { + Cancel(); + iEng.DequeueOperation( *this ); + iRunningApps.Close(); + delete iWgName; + iWg.Close(); + iWidgetSession.Close(); + iWsSession.Close(); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::CMcsRunningAppsWgMonitor +// --------------------------------------------------------- +// +CMcsRunningAppsWgMonitor::CMcsRunningAppsWgMonitor( + CMenuEng& aEng, MMcsRunningAppsHandler* aRunningAppsHandler, + TInt aPriority ): + CActive( aPriority ), + iEng(aEng), + iRunningAppsHandler(aRunningAppsHandler) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::ConstructL +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::ConstructL() + { + iOperationInProgress = EFalse; + User::LeaveIfError( iWsSession.Connect() ); + User::LeaveIfError( iWidgetSession.Connect() ); + + iWg = RWindowGroup( iWsSession ); + + // Make a handle from the address of window group obj. + User::LeaveIfError( iWg.Construct( + reinterpret_cast( &iWg ) ) ); + + //myWindowGroup.AutoForeground( EFalse ); + iWg.DisableFocusChangeEvents(); + iWg.DisableModifierChangedEvents(); + iWg.DisableOnEvents(); + iWg.DisableScreenChangeEvents(); + + User::LeaveIfError( iWg.EnableGroupListChangeEvents() ); + + //it makes the soft keys working + iWg.EnableReceiptOfFocus( EFalse ); + + iWgName = CApaWindowGroupName::NewL( iWsSession ); + iWgName->SetSystem( ETrue ); + iWgName->SetHidden( ETrue ); + iWgName->SetWindowGroupName( iWg ); + + + UpdateRunningApplicationsL(); + Start(); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::Start +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::Start() + { + if (!IsActive()) + { + iWsSession.EventReady( &iStatus ); + SetActive(); + } + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::DoCancel +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::DoCancel() + { + iWsSession.EventReadyCancel(); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::RunL +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::RunL() + { + User::LeaveIfError( iStatus.Int() ); // Handle errors in RunL. + // AppArc app scan complete, we have the app list. + // Now queue this operation to be executed by the Engine. + + TWsEvent event; + iWsSession.GetEvent(event); + Start(); + + if (!iOperationInProgress && + (event.Type() == EEventWindowGroupListChanged )) + { + iOperationInProgress = ETrue; + iEng.QueueOperationL( *this ); + } + else if ( event.Type() == EEventPowerMgmt ) + { + TApaSystemEvent systemEvent( *(TApaSystemEvent*)(event.EventData()) ); + // System secure shutdown, stop server + if ( systemEvent == EApaSystemEventSecureShutdown ) + { + CActiveScheduler::Stop(); + } + } + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::RunError() +// --------------------------------------------------------- +// +TInt CMcsRunningAppsWgMonitor::RunError( TInt /*aError*/ ) + { + Start(); + return KErrNone; + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::RunMenuEngOperationL +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::RunMenuEngOperationL() + { + iOperationInProgress = EFalse; + UpdateRunningApplicationsL(); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::CompletedMenuEngOperation +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::CompletedMenuEngOperation( TInt /*aErr*/ ) + { + // If there was error, ignore it (what else could we do?). + // When next AppArc update occurs, we will run again. + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::UpdateRunningApplicationsL +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::UpdateRunningApplicationsL() + { + iRunningApps.Reset(); + + RArray windowGroupIds; + CleanupClosePushL( windowGroupIds ); + + User::LeaveIfError( iWsSession.WindowGroupList(0, &windowGroupIds) ); + const TInt count = windowGroupIds.Count(); + + for (TInt i=0; iConstructFromWgIdL(wgId); + + // find the window group id and check that it has no parent + if (windowGroupIds[i].iParentId <= 0) + { + TUid appUid = iWgName->AppUid(); + if ( ( appUid.iUid ) && + ( iRunningApps.Find( appUid ) == KErrNotFound )) + { + iRunningApps.AppendL( appUid ); + } + } + } + + CleanupStack::PopAndDestroy( &windowGroupIds ); + + UpdateWidgetTaskListL(); + + iRunningAppsHandler->HandleListUpdateL( iRunningApps, + MMcsRunningAppsHandler::ERunningApps ); + } + +// --------------------------------------------------------- +// CMcsRunningAppsWgMonitor::UpdateWidgetTaskListL +// --------------------------------------------------------- +// +void CMcsRunningAppsWgMonitor::UpdateWidgetTaskListL( ) + { + RWidgetInfoArray widgetInfoArr; + CleanupResetAndDestroyPushL( widgetInfoArr ); + + iWidgetSession.RunningWidgetsL( widgetInfoArr ); + + for (TInt i=0; iiUid ); + if( iWidgetSession.IsWidgetInFullView( wgUid ) ) + { + iRunningApps.AppendL( wgUid ); + } + } + + CleanupStack::PopAndDestroy( &widgetInfoArr ); // widgetInfoArr + } +// End of File