diff -r 0efa10d348c0 -r a5a39a295112 idlefw/src/framework/aieventhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/src/framework/aieventhandler.cpp Wed Sep 01 12:22:09 2010 +0100 @@ -0,0 +1,383 @@ +/* +* 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 event handler +* +*/ + +// System includes + +// User includes +#include +#include +#include + +#include "aipluginfactory.h" +#include "aiconsts.h" +#include "debug.h" + +#include "aieventhandler.h" + +// Constants +const TInt KAILenOfParenthesis( 2 ); + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// CAiEventHandler::NewL() +// +// ---------------------------------------------------------------------------- +// +CAiEventHandler* CAiEventHandler::NewL( + CAiPluginFactory& aFactory ) + { + CAiEventHandler* self = + new ( ELeave ) CAiEventHandler( aFactory ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::ConstructL() +// +// ---------------------------------------------------------------------------- +// +void CAiEventHandler::ConstructL() + { + iPluginTool = AiUtility::CreatePluginToolL(); + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::~CAiEventHandler() +// +// ---------------------------------------------------------------------------- +// +CAiEventHandler::~CAiEventHandler() + { + Release( iPluginTool ); + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::CAiEventHandler() +// +// ---------------------------------------------------------------------------- +// +CAiEventHandler::CAiEventHandler( CAiPluginFactory& aFactory ) + : iFactory( aFactory ) + { + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::HandlePluginEvent() +// +// ---------------------------------------------------------------------------- +// +void CAiEventHandler::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 + CHsContentPublisher* publisher( NULL ); + + __TIME( "FW: Lookup plug-in by name", + publisher = iFactory.PluginByName( pluginName ); + ); + + __PRINT( __DBG_FORMAT( + "\t[I]\t Event: %S to plug-in by addr 0x%x" ), &aParam, publisher ); + + if( publisher ) + { + // Resolve plugin specific event id + TInt eventId( KErrNotFound ); + + TRAP_IGNORE( GetIdL( *publisher, + CHsContentPublisher::EPublisherEvents, eventName, eventId ) ); + + if( eventId != KErrNotFound ) + { + publisher->HandleEvent( eventId, param ); + } + else + { + publisher->HandleEvent( eventName, param ); + } + } + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::HandlePluginEventL() +// +// ---------------------------------------------------------------------------- +// +void CAiEventHandler::HandlePluginEventL( + const THsPublisherInfo& aPublisherInfo, const TDesC& aParam ) + { + // Resolve plugin + CHsContentPublisher* publisher( + iFactory.PluginByInfo( aPublisherInfo ) ); + + if( publisher ) + { + 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( *publisher, + CHsContentPublisher::EPublisherEvents, eventName, eventId ); + + if( eventId != KErrNotFound ) + { + publisher->HandleEvent( eventId, param ); + } + else + { + publisher->HandleEvent( eventName, param ); + } + } + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::HasMenuItemL() +// +// ---------------------------------------------------------------------------- +// +TBool CAiEventHandler::HasMenuItemL( const THsPublisherInfo& aPublisherInfo, + const TDesC& aMenuItem ) + { + // Resolve plugin + CHsContentPublisher* publisher( + iFactory.PluginByInfo( aPublisherInfo ) ); + + if( publisher ) + { + return publisher->HasMenuItem( aMenuItem ); + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::RefreshContent() +// +// ---------------------------------------------------------------------------- +// +TBool CAiEventHandler::RefreshContent( const TDesC& aContentCid ) + { + TRAPD( error, RefreshContentL( aContentCid ) ); + + return ( error == KErrNone ); + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::RefreshContent() +// +// ---------------------------------------------------------------------------- +// +TBool CAiEventHandler::RefreshContent( const THsPublisherInfo& aPublisherInfo, + const TDesC& aContentCid ) + { + // Resolve plugin + CHsContentPublisher* publisher( + iFactory.PluginByInfo( aPublisherInfo ) ); + + if( publisher ) + { + TInt id( KErrNotFound ); + + TRAP_IGNORE( GetIdL( *publisher, + CHsContentPublisher::EPublisherContent, aContentCid, id ) ); + + if ( id != KErrNotFound ) + { + MAiContentRequest* handler = static_cast< MAiContentRequest* >( + publisher->GetProperty( CHsContentPublisher::EContentRequest ) ); + + if ( handler ) + { + return handler->RefreshContent( id ); + } + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::SuspendContent() +// +// ---------------------------------------------------------------------------- +// +TBool CAiEventHandler::SuspendContent( const THsPublisherInfo& aPublisherInfo, + const TDesC& aContentCid ) + { + // Resolve plugin + CHsContentPublisher* publisher( + iFactory.PluginByInfo( aPublisherInfo ) ); + + if( publisher ) + { + TInt id( KErrNotFound ); + + TRAP_IGNORE( GetIdL( *publisher, + CHsContentPublisher::EPublisherContent, aContentCid, id ) ); + + if ( id != KErrNotFound ) + { + MAiContentRequest* handler = static_cast< MAiContentRequest* >( + publisher->GetProperty( CHsContentPublisher::EContentRequest ) ); + + if ( handler ) + { + return handler->SuspendContent( id ); + } + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::GetIdL() +// +// ---------------------------------------------------------------------------- +// +void CAiEventHandler::GetIdL( CHsContentPublisher& aContentPublisher, + CHsContentPublisher::TProperty aProperty, const TDesC& aName, TInt& aId ) + { + MAiContentItemIterator* iterator = + iPluginTool->ContentItemIterator( aContentPublisher, aProperty ); + + if( iterator ) + { + const TAiContentItem& ci( iterator->ItemL( aName ) ); + aId = ci.id; + } + else + { + aId = KErrNotFound; + } + } + +// ---------------------------------------------------------------------------- +// CAiEventHandler::RefreshContentL() +// +// ---------------------------------------------------------------------------- +// +TInt CAiEventHandler::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 ) ); + + CHsContentPublisher* publisher( iFactory.PluginByName( pluginName ) ); + + if( !publisher ) + { + return retval; + } + + // Extract content id + TPtrC cid( aContentCid.Mid( ++pos ) ); + TInt id( 0 ); + + MAiContentRequest* handler( NULL ); + + TRAPD( error, GetIdL( *publisher, + CHsContentPublisher::EPublisherContent, cid, id ) ); + + if ( !error ) + { + handler = static_cast< MAiContentRequest* >( + publisher->GetProperty( CHsContentPublisher::EContentRequest ) ); + } + else + { + GetIdL( *publisher, + CHsContentPublisher::EPublisherResources, cid, id ); + + handler = static_cast< MAiContentRequest* >( + publisher->GetProperty( CHsContentPublisher::EResourceRequest ) ); + } + + // Forward event to plugin + if( handler && handler->RefreshContent( id ) ) + { + retval = KErrNone; + } + + return retval; + } + +// End of File.