diff -r 000000000000 -r 79c6a41cd166 idlefw/src/framework/aicontentpluginmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/src/framework/aicontentpluginmanager.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,391 @@ +/* +* 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: Content plugin error manager class +* +*/ + + +#include +#include +#include +#include + +#include +#include + +#include "aicontentpluginmanager.h" +#include "aipluginstatemanager.h" +#include "aifweventhandler.h" +#include "aicontentpublisher.h" +#include "aipropertyextension.h" +#include +#include "aieventhandlerextension.h" +#include "aiuicontroller.h" +#include "aiconsts.h" +#include "debug.h" + +// CONSTANTS +const TInt KAILenOfParenthesis( 2 ); + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::NewL() +// ---------------------------------------------------------------------------- +// +CAiContentPluginManager* CAiContentPluginManager::NewL() + { + CAiContentPluginManager* self = new ( ELeave ) CAiContentPluginManager(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::ConstructL() +// ---------------------------------------------------------------------------- +// +void CAiContentPluginManager::ConstructL() + { + iPluginFactory = CAiPluginFactory::NewL( iPlugins, *this ); + + iStateManager = CAiPluginStateManager::NewL(); + + iPluginFactory->AddLifecycleObserverL( *iStateManager ); + + iPluginTool = AiUtility::CreatePluginToolL(); + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::~CAiContentPluginManager() +// ---------------------------------------------------------------------------- +// +CAiContentPluginManager::~CAiContentPluginManager() + { + iPlugins.ResetAndDestroy(); + + delete iPluginFactory; + delete iStateManager; + + Release( iPluginTool ); + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::CAiContentPluginManager() +// ---------------------------------------------------------------------------- +// +CAiContentPluginManager::CAiContentPluginManager() + { + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::HandlePluginEvent() +// ---------------------------------------------------------------------------- +// +void CAiContentPluginManager::HandlePluginEvent( const TDesC& aParam ) + { + const TInt separatorPos( aParam.Locate( KPluginEventSeparator ) ); + + if( separatorPos == KErrNotFound ) + { + return; + } + + // Extract plugin name + TPtrC pluginName( aParam.Left( separatorPos ) ); + + // Extract event and parameter string + TPtrC eventNameAndParams( aParam.Mid( separatorPos + 1 ) ); + + // Find parameter string position + const TInt paramsPos( + eventNameAndParams.Locate( KEventParameterSeparator ) ); + + // Extract event name + TPtrC eventName( paramsPos < 0 ? eventNameAndParams : + eventNameAndParams.Left( paramsPos ) ); + + // Calculate actual parameter string length by ignoring parenthesis + TInt paramsLength( + eventNameAndParams.Length() - paramsPos - KAILenOfParenthesis ); + + // Extract paramenters + TPtrC param( paramsPos < 0 ? KNullDesC() : + eventNameAndParams.Mid( paramsPos + 1, Max( 0, paramsLength ) ) ); + + // Resolve plugin + CAiContentPublisher* target = NULL; + + __TIME( "FW: Lookup plug-in by name", + + TRAP_IGNORE( target = iPluginFactory->PluginByNameL( pluginName ) ); + + ); + + __PRINT( __DBG_FORMAT( + "\t[I]\t Event: %S to plug-in by addr 0x%x" ), &aParam, target ); + + if( target ) + { + // Resolve plugin specific event id + TInt eventId( KErrNotFound ); + + TRAP_IGNORE( GetIdL( *target, EAiPublisherEvents, eventName, eventId ) ); + + // Forward event to plugin + MAiEventHandlerExtension* ext( + iPluginTool->EventHandlerExt( *target ) ); + + if( ext ) + { + if( eventId != KErrNotFound ) + { + ext->HandleEvent( eventId, param ); + } + else + { + ext->HandleEvent( eventName, param ); + } + } + } + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::HandlePluginEventL() +// ---------------------------------------------------------------------------- +// +void CAiContentPluginManager::HandlePluginEventL( + const TAiPublisherInfo& aPublisherInfo, const TDesC& aParam ) + { + // Resolve plugin + CAiContentPublisher* target( + iPluginFactory->PluginByInfoL( aPublisherInfo ) ); + + if( target ) + { + const TInt separatorPos( aParam.Locate( KPluginEventSeparator ) ); + + // Extract event and parameter string + TPtrC eventNameAndParams( aParam.Mid( separatorPos + 1 ) ); + + // Find parameter string position + const TInt paramsPos( + eventNameAndParams.Locate( KEventParameterSeparator ) ); + + // Extract event name + TPtrC eventName( paramsPos < 0 ? + eventNameAndParams : eventNameAndParams.Left( paramsPos ) ); + + // Calculate actual parameter string length by ignoring parenthesis + TInt paramsLength( + eventNameAndParams.Length() - paramsPos - KAILenOfParenthesis ); + + // Extract paramenters + TPtrC param( paramsPos < 0 ? KNullDesC() : + eventNameAndParams.Mid( paramsPos + 1, Max( 0, paramsLength ) ) ); + + // Resolve plugin specific event id + TInt eventId( KErrNotFound ); + + GetIdL( *target, EAiPublisherEvents, eventName, eventId ); + + // Forward event to plugin + MAiEventHandlerExtension* ext( + iPluginTool->EventHandlerExt( *target ) ); + + if( ext ) + { + if( eventId != KErrNotFound ) + { + ext->HandleEvent( eventId, param ); + } + else + { + ext->HandleEvent( eventName, param ); + } + } + } + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::HasMenuItemL() +// ---------------------------------------------------------------------------- +// +TBool CAiContentPluginManager::HasMenuItemL( + const TAiPublisherInfo& aPublisherInfo, const TDesC& aMenuItem ) + { + // Resolve plugin + CAiContentPublisher* target( + iPluginFactory->PluginByInfoL( aPublisherInfo ) ); + + if( target ) + { + // Forward query to plugin + MAiEventHandlerExtension* ext( + iPluginTool->EventHandlerExt( *target ) ); + + if ( ext ) + { + return ext->HasMenuItem( aMenuItem ); + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::RefreshContentL() +// ---------------------------------------------------------------------------- +// +TBool CAiContentPluginManager::RefreshContent( const TDesC& aContentCid ) + { + TRAPD( error, RefreshContentL( aContentCid ) ); + + return ( error == KErrNone ); + } + +// ---------------------------------------------------------------------------- +// CAiFw::ProcessOnlineState() +// ---------------------------------------------------------------------------- +// +void CAiContentPluginManager::ProcessOnlineState( TBool aOnline ) + { + _LIT( KOnlineOffline, "online_offline" ); + + for( TInt i = 0; i < iPlugins.Count(); i++ ) + { + MAiEventHandlerExtension* ext( + iPluginTool->EventHandlerExt( *iPlugins[i] ) ); + + // If plugin understands online/offline run state change + if( ext && ext->HasMenuItem( KOnlineOffline ) ) + { + if( aOnline ) + { + iStateManager->ProcessOnlineState( *iPlugins[i] ); + } + else + { + iStateManager->ProcessOfflineState( *iPlugins[i] ); + } + } + } + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::StateManager() +// ---------------------------------------------------------------------------- +// +CAiPluginStateManager& CAiContentPluginManager::StateManager() const + { + return *iStateManager; + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::PluginFactory() +// ---------------------------------------------------------------------------- +// +CAiPluginFactory& CAiContentPluginManager::PluginFactory() const + { + return *iPluginFactory; + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::GetIdL() +// ---------------------------------------------------------------------------- +// +void CAiContentPluginManager::GetIdL( CAiContentPublisher& aContentPublisher, + TAiPublisherProperty aProperty, const TDesC& aName, TInt& aId ) + { + MAiContentItemIterator* iterator = + iPluginTool->ContentItemIteratorL( aContentPublisher, aProperty ); + + if( iterator ) + { + const TAiContentItem& ci( iterator->ItemL( aName ) ); + aId = ci.id; + } + else + { + aId = KErrNotFound; + } + } + +// ---------------------------------------------------------------------------- +// CAiContentPluginManager::RefreshContentL() +// ---------------------------------------------------------------------------- +// +TInt CAiContentPluginManager::RefreshContentL( const TDesC& aContentCid ) + { + TInt retval( KErrNotFound ); + + // Look up plug-in and content item and delegate to plug-in's + // MAiContentRequest implementation. + + // Find plugin name + TInt pos( aContentCid.Locate( KPluginEventSeparator ) ); + + if( pos == KErrNotFound ) + { + return retval; + } + + TPtrC pluginName( aContentCid.Left( pos ) ); + + CAiContentPublisher* plugin( iPluginFactory->PluginByNameL( pluginName ) ); + + if( !plugin ) + { + return retval; + } + + MAiPropertyExtension* ext( iPluginTool->PropertyExt( *plugin ) ); + + if( !ext ) + { + return retval; + } + + // Extract content id + TPtrC cid( aContentCid.Mid( ++pos ) ); + TInt id( 0 ); + + MAiContentRequest* handler( NULL ); + + TRAPD( error, GetIdL( *plugin, EAiPublisherContent, cid, id ) ); + + if ( !error ) + { + handler = static_cast< MAiContentRequest* >( + ext->GetPropertyL( EAiContentRequest ) ); + } + else + { + GetIdL( *plugin, EAiPublisherResources, cid, id ); + + handler = static_cast< MAiContentRequest* >( + ext->GetPropertyL( EAiResourceRequest ) ); + } + + // Forward event to plugin + if( handler && handler->RefreshContent( id ) ) + { + retval = KErrNone; + } + + return retval; + } + +// End of File.