idlefw/src/framework/aicontentpluginmanager.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:17 +0200
changeset 0 79c6a41cd166
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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 <ecom/ecom.h>
#include <ecom/implementationinformation.h>
#include <aiutility.h>
#include <aiplugintool.h>

#include <centralrepository.h>
#include <activeidle2domaincrkeys.h>

#include "aicontentpluginmanager.h"
#include "aipluginstatemanager.h"
#include "aifweventhandler.h"
#include "aicontentpublisher.h"
#include "aipropertyextension.h"
#include <aicontentrequest.h>
#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.