diff -r 000000000000 -r 79c6a41cd166 idlefw/plugins/shortcutplugin/src/caiscutengineext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/plugins/shortcutplugin/src/caiscutengineext.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2005-2006 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: Shortcut plug-in engine extension +* +*/ + +#include +#include +#include +#include + +#include + +#include "caiscutengineext.h" +#include "caiscutextserver.h" +#include "taiscutparser.h" +#include "caiscutshortcut.h" +#include "caiscutplugin.h" +#include "aiscutcontentmodel.h" +#include "caiscutextdata.h" +#include "caiscutextdatamodel.h" + +// ======== LOCAL DEFINITIONS ======== + +namespace + { + // LOCAL CONSTANTS + /** + * Target id hex format + */ + _LIT( KTargetIdFormat, "0x%08x" ); + + /** + * Maximum length of target id + */ + const TInt KTargetIdMaxLength = 11; + } + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutEngineExt* CAiScutEngineExt::NewL( CAiScutPlugin& aPlugin ) + { + CAiScutEngineExt* self = new( ELeave ) CAiScutEngineExt( aPlugin ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutEngineExt::~CAiScutEngineExt() + { + delete iAiScutExtServer; + delete iExtDataModel; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutEngineExt::CAiScutEngineExt( CAiScutPlugin& aPlugin ) + : CAiScutEngine( aPlugin ) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::ConstructL() + { + CAiScutEngine::ConstructL(); + + iExtDataModel = CAiScutExtDataModel::NewL(); + iAiScutExtServer = new( ELeave ) CAiScutExtServer( *this, Env()->WsSession() ); + iAiScutExtServer->ConstructL(); + TRAPD( err, iAiScutExtServer->StartL( KAiScutExtServerName ) ); + + if( err != KErrNone && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + //Send EAiScutEventGainFocus to the leftmost shortcut in order to put + //its state machine in correct state + if( iShortcuts.Count() > 0 ) + { + static_cast< CAiScutShortcutExt* >( iShortcuts[ 0 ] )->HandleAIEventL( + EAiScutEventGainFocus ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::CheckAccessAndPublish( CAiScutShortcut& aShortcut ) + { + TRAPD( err, + RAiShortcutArray shortcutArray; + CleanupClosePushL( shortcutArray ); + shortcutArray.AppendL( &aShortcut ); + aShortcut.SetToBePublished( ETrue ); + iPlugin.PublishShortcutsL( shortcutArray ); + CleanupStack::PopAndDestroy( &shortcutArray ); + ); + + if( err != KErrNone ) + { + //Delegate publishing to the original engine + CAiScutEngine::CheckAccessAndPublish( EScutCheckAll, ETrue ); + } + } + +// --------------------------------------------------------------------------- +// Handles an event sent by the AI framework. +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleAiEventL( TInt aEvent, const TDesC& aParam ) + { + CAiScutShortcutExt* shortcut = FindShortcutById( aParam ); + if( shortcut ) + { + shortcut->HandleAIEventL( aEvent ); + } + CAiScutEngine::HandleAiEventL( aEvent, aParam ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::ResumeL( TBool aPublishAll, TAiTransitionReason aReason ) + { + TArray extDataArray = iExtDataModel->AiScutExtDataArray(); + const TInt count = extDataArray.Count(); + //Iterate extension data items and populate to matching shortcuts. + //Remove the items that are not used in any shortcut. + for( TInt i = 0; i < count; i++ ) + { + CAiScutExtData* extData = extDataArray[ i ]; + const TDesC& targetDefinition = extData->TargetDefinition(); + if( !PopulateExtData( targetDefinition, extData ) ) + { + iExtDataModel->RemoveAiScutExtData( targetDefinition ); + } + } + + TAiTransitionReason resumeReason = iPlugin.ResumeReason(); + const TInt shortcutCount = iShortcuts.Count(); + for( TInt i = 0; i < shortcutCount; i++ ) + { + CAiScutShortcutExt* shortcut = static_cast< CAiScutShortcutExt* > + ( iShortcuts[ i ] ); + shortcut->HandleResumed( resumeReason ); + } + + iAiScutExtServer->ResumeL( aReason ); + + CAiScutEngine::ResumeL( aPublishAll, aReason ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleSetPopupLineArrayL( const TDesC& aDefinition, + CDesCArray* aLineArray ) + { + CAiScutExtData* extData = iExtDataModel->SetPopupLineArrayL( + aDefinition, aLineArray ); + TBool shortcutsFound = PopulateExtData( + aDefinition, extData ); + if( !shortcutsFound ) + { + iExtDataModel->RemoveAiScutExtData( aDefinition ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleResetPopupLineArrayL( const TDesC& aDefinition ) + { + CAiScutExtData* extData = iExtDataModel->ResetPopupLineArray( aDefinition ); + TBool shortcutsFound = PopulateExtData( + aDefinition, extData ); + if( !shortcutsFound ) + { + iExtDataModel->RemoveAiScutExtData( aDefinition ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleSetIconL( const TDesC& aDefinition, CGulIcon* aIcon ) + { + CAiScutExtData* extData = iExtDataModel->SetIconL( aDefinition, aIcon ); + TBool shortcutsFound = PopulateExtData( + aDefinition, extData ); + if( !shortcutsFound ) + { + iExtDataModel->RemoveAiScutExtData( aDefinition ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleResetIconL( const TDesC& aDefinition ) + { + CAiScutExtData* extData = iExtDataModel->ResetIcon( aDefinition ); + TBool shortcutsFound = PopulateExtData( + aDefinition, extData ); + if( !shortcutsFound ) + { + iExtDataModel->RemoveAiScutExtData( aDefinition ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CAiScutEngineExt::HandleIsInShortcutsL( const TDesC& aDefinition ) const + { + const TInt shortcutCount = iShortcuts.Count(); + for( TInt i = 0; i < shortcutCount; i++ ) + { + CAiScutShortcutExt* shortcut = static_cast< CAiScutShortcutExt* > + ( iShortcuts[ i ] ); + TPtrC activeTargetDefinition = shortcut->ActiveTargetDefinition(); + if( activeTargetDefinition.CompareF( aDefinition ) == 0 ) + { + return ETrue; + } + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutEngineExt::HandleIssuePutInShortcutsL( const TDesC& /*aDefinition*/ ) + { + CGSLauncher* l = CGSLauncher::NewLC(); + l->LaunchGSViewL ( TUid::Uid( AI_UID_ECOM_IMPLEMENTATION_SETTINGS_SCUTPLUGIN ), + KScutActiveIdleUid, + KNullDesC8 ); + CleanupStack::PopAndDestroy( l ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CAiScutEngineExt::PopulateExtData( const TDesC& aDefinition, + const MAiScutExtData* aAiScutExtData ) + { + //Iterate shortcuts and update matching ones with new extData + TBool shortcutsFound = EFalse; + const TInt shortcutCount = iShortcuts.Count(); + for( TInt i = 0; i < shortcutCount; i++ ) + { + CAiScutShortcutExt* shortcut = static_cast< CAiScutShortcutExt* > + ( iShortcuts[ i ] ); + TPtrC activeTargetDefinition = shortcut->ActiveTargetDefinition(); + if( activeTargetDefinition.CompareF( aDefinition ) == 0 ) + { + shortcut->SetAiScutExtData( aAiScutExtData ); + shortcutsFound = ETrue; + } + } + + return shortcutsFound; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutShortcutExt* CAiScutEngineExt::FindShortcutById( + const TDesC& aId ) const + { + const TInt shortcutCount = iShortcuts.Count(); + for( TInt i = 0; i < shortcutCount; i++ ) + { + CAiScutShortcutExt* shortcut = static_cast< CAiScutShortcutExt* > + ( iShortcuts[ i ] ); + + TBuf< KTargetIdMaxLength > id; + id.Format( KTargetIdFormat, shortcut->Id() ); + + if( id.CompareF( aId ) == 0 ) + { + return shortcut; + } + } + return NULL; + } + +// End of File.