diff -r 0ff24a8f6ca2 -r 98307c651589 piprofiler/engine/src/SamplerPluginLoader.cpp --- a/piprofiler/engine/src/SamplerPluginLoader.cpp Fri Aug 27 11:37:29 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,539 +0,0 @@ -/* -* Copyright (c) 2009 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 FILES -#include "SamplerPluginLoader.h" -//#include -#include // CnvUtfConverter -#include - -// CONSTANTS - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::NewL -// -// EPOC two-phased constructor -// ---------------------------------------------------------------------------- -// -CSamplerPluginLoader* CSamplerPluginLoader::NewL() - { - CSamplerPluginLoader* self = new( ELeave ) CSamplerPluginLoader; - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - return self; - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::CSamplerPluginLoader -// -// C++ default constructor can NOT contain any code, that -// might leave. -// ---------------------------------------------------------------------------- -// -CSamplerPluginLoader::CSamplerPluginLoader() : CActive( EPriorityStandard ) - { - LOGSTRING( "CSamplerPluginLoader()::CSamplerPluginLoader()" ); - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::ConstructL -// -// EPOC default constructor can leave. -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::ConstructL( ) - { - LOGSTRING( "CSamplerPluginLoader()::ConstructL()" ); - - // get list of implementations - CSamplerPluginInterface::ListAllImplementationsL( iImplInfoArray ); - - CActiveScheduler::Add( this ); - } - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::~CSamplerPluginLoader -// -// Destructor -// ---------------------------------------------------------------------------- -// -CSamplerPluginLoader::~CSamplerPluginLoader() - { - LOGSTRING( "CSamplerPluginLoader()::~CSamplerPluginLoader()" ); - - AbortAsyncLoad(); - - Cancel(); - - // reset ECOM implementation info array - iImplInfoArray.ResetAndDestroy(); // This is needed - iImplInfoArray.Close(); - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::LoadAsync -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::LoadAsyncL(CArrayPtrFlat* aPluginArray ) - { - iPluginArray = aPluginArray; - - // Reset iterator - iImplInfoArrayIterator = 0; - - LOGSTRING2( "CSamplerPluginLoader()::Implementation info count: %d", - iImplInfoArray.Count() ); - - NotifyProgress(); - - //Begin CActive asynchronous loop. - CompleteOwnRequest(); - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::LoadSyncL -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::LoadSyncL(CArrayPtrFlat* aPluginArray) - { - // cancel first active object from loading samplers dynamically - Cancel(); - CSamplerPluginInterface* plugin = NULL; - - iPluginArray = aPluginArray; - - // Get a list of all implementations, even though we only want one specific - // one. There appears to be no way to otherwise extract a specific implementation - // info object :( - // Search for the implementation that matches aImplementationUid - const TInt impCount = iImplInfoArray.Count(); - for( TInt i=0; iHandlePluginLoaded( MSamplerPluginLoadObserver::ESamplerSuccess); - } - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::NotifyFinished -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::NotifyFinished() - { - if( iObserver ) - { - iObserver->HandlePluginLoaded( MSamplerPluginLoadObserver::ESamplerFinished ); - } - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::SetObserver -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::SetObserver(MSamplerPluginLoadObserver* aObserver) - { - LOGSTRING2("CSamplerPluginLoader()::Observer set:0x%X", aObserver); - iObserver = aObserver; - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::ParseToUid -// Parses a UID from descriptor of form '0xNNNNNNNN' where N is hexadecimal. -// -// ---------------------------------------------------------------------------- -// -TInt CSamplerPluginLoader::ParseToUid( const TDesC8& aSource, TUid& aTarget ) - { - // Remove "0x" from the descriptor if it exists - _LIT8(KHexPrefix, "0x"); - - TPtrC8 pSource( aSource ); - const TInt prefixPosition = pSource.Find( KHexPrefix ); - if ( prefixPosition != KErrNotFound ) - { - pSource.Set( aSource.Mid( prefixPosition + KHexPrefix().Length() ) ); - } - - // Parse to integer - TLex8 lex( pSource ); - TUint integer = 0; - - // Parse using TRadix::EHex as radix: - const TInt err = lex.Val( integer, EHex ); - aTarget.iUid = integer; - - if( err != KErrNone ) - { - // If parsing parent UID failed, do not load plugin: - LOGSTRING2( - "CSamplerPluginLoader()::Parsing parent UID failed. Error code:%d", - err ); - } - return err; - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::ParseOrderNumber -// -// -// ---------------------------------------------------------------------------- -// -TInt CSamplerPluginLoader::ParseOrderNumber( const TDesC8& aSource, TInt& aOrderNumber ) - { - // Parse plugin's order number from opaque_data: - TLex8 lex( aSource ); - const TInt orderErr = lex.Val( aOrderNumber ); - return orderErr; - } - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::LoadNextPluginL -// Iterate through iImplInfoArray. Load the plugin if it is eligible for -// loading. Loaded plugin is added to iPluginArray. Each time a plugin is -// loaded, iObserver is notified. -// -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::LoadNextPluginL() - { - // Iterate through iImplInfoArray. This loop continues between function - // calls. Therefore member variable iImplInfoArrayIterator is used as a - // counter. Loop will break when match is found and continues on next RunL. - for( ; iImplInfoArrayIterator < iImplInfoArray.Count(); ) - { - const CImplementationInformation* info = - iImplInfoArray[ iImplInfoArrayIterator ]; - - iImplInfoArrayIterator++; - -// PrintInfoDebug( *info, iImplInfoArrayIterator, iImplInfoArray.Count() ); - LOGSTRING3("CSamplerPluginLoader() - iImplInfoArrayIterator %d, iImplInfoArray.Count() %d", - iImplInfoArrayIterator, - iImplInfoArray.Count() ); - - // If this plugin is OK -> load it: - LOGSTRING2( "CSamplerPluginLoader() %S eligible for parent", - &info->DisplayName()); - CSamplerPluginInterface* plugin = NULL; - TInt error(KErrNone); - // Create plugin. Trap leave for debugging purposes. - TRAP( error, plugin = &CreatePluginInstanceL( *info ); ); - - if( error == KErrNone ) - { - // Plugin ownership is transfered to iPluginArray - InsertPluginInOrderL( plugin, iPluginArray ); - } - else - { - // Error note is displayed even if plugin is not loaded - LOGSTRING2("CSamplerPluginLoader::LoadNextPluginL() - plugin load failed, error %d", error); - } - // Wait for next round - break; - } - } - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::CreatePluginInstanceL -// -// -// ---------------------------------------------------------------------------- -// - -CSamplerPluginInterface& CSamplerPluginLoader::CreatePluginInstanceL( - const CImplementationInformation& aImpInfo ) - { - // Now we can load the plugin - const TUid implUid = aImpInfo.ImplementationUid(); - - CSamplerPluginInterface* plugin = CSamplerPluginInterface::NewL( implUid , (TAny*)&aImpInfo.DisplayName() ); - CleanupStack::PushL ( plugin ); - - // Parse plugin's order number from opaque_data: - TInt orderNumber(0); - const TInt orderErr = ParseOrderNumber( aImpInfo.OpaqueData(), orderNumber ); - - if ( orderErr == KErrNone && orderNumber >= 0 ) - { - plugin->iOrder = orderNumber; - } - CleanupStack::Pop( plugin ); // CSamplerController is now responsible for this memory. - - return *plugin; - } - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::SortPluginsL -// -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::SortPluginsL( - CArrayPtrFlat* aPlugins ) - { - RPointerArray plugins; - TLinearOrder order( CSamplerPluginLoader::Compare ); - - // Insertion will also order - for( TInt i = 0; i < aPlugins->Count(); i++ ) - { - plugins.InsertInOrderL( (*aPlugins)[i], order ); - } - - // Replace original array content with sorted items - aPlugins->Reset(); - for( TInt i = 0; i < plugins.Count(); i++ ) - { - aPlugins->AppendL( plugins[i] ); - } - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::Compare -// -// Compare two plugins. -// Precedence: -// [1. plugin provider category] -// 2. plugin order number -// 3. plugin caption -// Plugin provider gategory is currently disabled (not supported yet). -// ---------------------------------------------------------------------------- -// -TInt CSamplerPluginLoader::Compare( const CSamplerPluginInterface& aFirst, - const CSamplerPluginInterface& aSecond ) - { - // compare indexes and sort - return CompareIndex( aFirst, aSecond ); - } - - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::InsertPluginInOrderL -// -// ---------------------------------------------------------------------------- -// -void CSamplerPluginLoader::InsertPluginInOrderL( - CSamplerPluginInterface* aPlugin, - CArrayPtrFlat* aPlugins ) - { - CSamplerPluginInterface* comparedPlugin; - TInt comparison = 0; - TBool inserted = EFalse; - - for( TInt i = 0; i < aPlugins->Count(); i++ ) - { - comparedPlugin = (*aPlugins)[i]; - // Optimization: do not call time consuming Compare() multiple times! - comparison = Compare( *aPlugin, *comparedPlugin ); - if( comparison < 0 ) - { - aPlugins->InsertL( i, aPlugin ); - inserted = ETrue; - break; - } - else if( comparison == 0 ) - { - aPlugins->InsertL( i+1, aPlugin ); - inserted = ETrue; - break; - } - } - // Plugin was not before any other plugin - make sure it's appended - if( !inserted ) - { - aPlugins->AppendL( aPlugin ); - } - - #ifdef _GS_PLUGINLOADER_SORTING_TRACES - PrintOrderTraces( aPlugins ); - #endif // _GS_PLUGINLOADER_SORTING_TRACES - - } - -// ---------------------------------------------------------------------------- -// CSamplerPluginLoader::CompareIndex -// ---------------------------------------------------------------------------- -// -TInt CSamplerPluginLoader::CompareIndex( const CSamplerPluginInterface& aFirst, - const CSamplerPluginInterface& aSecond ) - { - TInt comparison = KSamplerComparisonEqual; - // The plugin having index is before the one not having one - - if( aFirst.iOrder == KSamplerPluginNotIndexed && - aSecond.iOrder == KSamplerPluginNotIndexed ) - { - // Neither have index -> equal - comparison = KSamplerComparisonEqual; - } - else if( aFirst.iOrder == KSamplerPluginNotIndexed ) - { - // The plugin having index is before the one not having one - comparison = KSamplerComparisonAfter; - } - else if( aSecond.iOrder == KSamplerPluginNotIndexed ) - { - // The plugin having index is before the one not having one - comparison = KSamplerComparisonBefore; - } - else if( aFirst.iOrder < aSecond.iOrder ) - { - // Compare actual index values - comparison = KSamplerComparisonBefore; - } - else if( aFirst.iOrder > aSecond.iOrder ) - { - // Compare actual index values - comparison = KSamplerComparisonAfter; - } - return comparison; - } - -// End of File