diff -r 3ff3fecb12fe -r 6a82cd05fb1e sysanadatacapture/piprofiler/piprofiler/engine/src/SamplerController.cpp --- a/sysanadatacapture/piprofiler/piprofiler/engine/src/SamplerController.cpp Thu Feb 11 15:52:57 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,526 +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 "SamplerController.h" -#include - -// CONSTANTS -const TInt KMaxSamplerPluginCount = 20; -const TInt KMaxExtraSettingsItemCount = 6; - -// LITERALS -_LIT8(KEnabled, "enabled"); -_LIT8(KSamplingPeriod, "sampling_period_ms"); -_LIT8(KBracketOpen, "["); -_LIT8(KBracketClose, "]"); -_LIT8(KNewLine8, "\n"); -_LIT8(KEquals8, "="); -_LIT8(KSettingsText, " settings"); -_LIT(KNewLine, "\n"); -_LIT(KEquals, "="); -_LIT(KCommentSeparator, " ; "); - -CSamplerController* CSamplerController::NewL(CProfilerSampleStream& aStream) - { - CSamplerController* self = new( ELeave ) CSamplerController(aStream); - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - return self; - } - -void CSamplerController::ConstructL() - { - // initiate sampler plugin list - InitialiseSamplerListL(); - } - - -CSamplerController::CSamplerController(CProfilerSampleStream& aStream) : - iStream(aStream) - { - } - -void CSamplerController::InitialiseSamplerListL() - { - // create new sampler plugin array - iPluginArray = new (ELeave) CArrayPtrFlat( KMaxSamplerPluginCount ); - - // create plugin loader instance - iPluginLoader = CSamplerPluginLoader::NewL(); - - // register sampler controller to get notifications of succesfull plugin load - iPluginLoader->SetObserver( this ); - - // load sampler plugins asynchronously - iPluginLoader->LoadAsyncL( iPluginArray ); - - LOGTEXT(_L(" RSamplerController::InitialiseUserSideSamplerList - exit")); - } - -CSamplerController::~CSamplerController() - { - LOGTEXT(_L("CSamplerController::~CSamplerController - entry" )); - - if ( iPluginArray ) - { - // destroy the plugin instances - // empty loaded plugins from array - for(TInt i(0);iCount();i++) - { - if(iPluginArray->At(i)) - { - delete iPluginArray->At(i); - iPluginArray->At(i) = NULL; - } - } - iPluginArray->Reset(); - delete iPluginArray; - iPluginArray = NULL; - } - - if ( iPluginLoader ) - { - iPluginLoader->AbortAsyncLoad(); - delete iPluginLoader; - iPluginLoader = NULL; - } - - LOGTEXT(_L("CSamplerController::~CSamplerController - exit" )); - } - -void CSamplerController::SetObserver(MSamplerControllerObserver* aObserver) - { - iObserver = aObserver; - } - -TInt CSamplerController::UpdateSavedSamplerAttributesL(CDesC8ArrayFlat* aSavedLineArray, CArrayFixFlat* aAttributes) - { - TInt err(KErrNone); - TInt count(iPluginArray->Count()); - // all plugins get their own settings among whole lump of setting strings - CSamplerPluginInterface* plugin = NULL; - - // loop through the plugin array - for(TInt i(0);iAt(i); - - // call each plugin to sort out its own settings - err = plugin->ConvertRawSettingsToAttributes(aSavedLineArray); - - // get plugin specific attributes, array may contain attributes of several sub samplers - plugin->GetAttributesL(aAttributes); - } - - return err; - } - -TInt CSamplerController::SetSamplerSettingsL(TInt aUid, TSamplerAttributes aAttributes) - { - // parse right plugin based on UID - CSamplerPluginInterface* plugin = GetPlugin(TUid::Uid(aUid)); - - // set the sampler attributes of a sampler plugin - plugin->SetAttributesL(aAttributes); - - return KErrNone; - } - -void CSamplerController::GetSamplerAttributesL(CArrayFixFlat* aAttributes) - { - CSamplerPluginInterface* plugin = NULL; - - TInt count(iPluginArray->Count()); - - // get first all the attributes from all the sampler plugins listed in iPluginArray - for(TInt i(0);iAt(i); - - // get plugin specific attributes, array may contain attributes of several sub samplers - plugin->GetAttributesL(aAttributes); - } - } - -void CSamplerController::ComposeAttributesToSettingsFileFormat(RFile& aFile, CArrayFixFlat* aAttributes) - { - // write immediately to settings file - ComposeSettingsText(aFile, aAttributes); - } - -void CSamplerController::ComposeSettingsText(RFile& aFile, CArrayFixFlat* aAttrArray) - { - // temporary buffer for a setting line - TBuf<384> settingLine; - TBuf8<384> settingLine8; - TInt itemCount(0); - TBuf<266> tBuf; - - TSamplerAttributes attr; - - for(TInt i(0);iCount();i++) - { - // get the attribute container - attr = aAttrArray->At(i); - - // add the name and description of the sampler in brackets first - settingLine8.Copy(KBracketOpen); - settingLine8.Append(attr.iShortName); - settingLine8.Append(KBracketClose); - settingLine8.Append(KCommentSeparator()); - settingLine8.Append(attr.iName); - settingLine8.Append(KSettingsText); - settingLine8.Append(KNewLine8); - aFile.Write(settingLine8); - - // enabled - settingLine8.Copy(KEnabled); - settingLine8.Append(KEquals8); - settingLine8.Append(Bool2Str(attr.iEnabled)); - settingLine8.Append(KNewLine8); - aFile.Write(settingLine8); - - // sampling rate (if set) - if( attr.iSampleRate != -1 ) - { - settingLine8.Copy(KSamplingPeriod); - settingLine8.Append(KEquals8); - settingLine8.Append(Int2Str(attr.iSampleRate)); - settingLine8.Append(KNewLine8); - aFile.Write(settingLine8); - } - - itemCount = attr.iItemCount; - - // check if item count set is sane, max extra settings item count 6 - if(itemCount > KMaxExtraSettingsItemCount) - { - // probably forgot to set the item count value in plugin => safe to set it 0 - itemCount = 0; - } - - // setting items - for (TInt j(0);j CSamplerController::Bool2Str(const TBool& aValue) - { - TBuf8<16> buf; - - if (aValue) - buf.Copy(KTrue); - else - buf.Copy(KFalse); - - return buf; - } - -// ---------------------------------------------------------------------------- -// Converts given integer into a descriptor. -// ---------------------------------------------------------------------------- -// -inline TBuf8<16> CSamplerController::Int2Str(const TInt& aValue) - { - TBuf8<16> buf; - buf.AppendNum(aValue); - - return buf; - } - - -void CSamplerController::HandlePluginLoaded( KSamplerPluginLoaderStatus aStatus ) - { - - // process status value - switch(aStatus) - { - case 0: - LOGSTRING2("RSamplerController - one plugin loaded, status: %d", aStatus); - break; - case 1: - LOGSTRING2("RSamplerController - a plugin load failed: %d", aStatus); - break; - case 2: - LOGSTRING2("RSamplerController - plugin loading aborted: %d", aStatus); - break; - case 3: - LOGSTRING2("RSamplerController - all plugins loaded: %d", aStatus); - TRAPD(err, iPluginLoader->SortPluginsL(iPluginArray)); - if(err != KErrNone) - { - LOGTEXT(_L("Sampler controller unable to sort plugins")); - } - - // call engine to finalize the startup - TRAPD(result, iObserver->HandleSamplerControllerReadyL();); - if(result != KErrNone) - { - LOGTEXT(_L("Failed to notify engine")); - } - break; - case 4: - LOGSTRING2("RSamplerController - error in loading plugins: %d", aStatus); - break; - default: - break; - } -} - -TUid CSamplerController::GetPluginUID(TDesC8& aName) - { - TUid uid; - TInt id; - - // check if plugin array contains loaded samplers - if( iPluginArray && iPluginArray->Count() > 0 ) - { - for(TInt i=0;iCount();i++) - { - CSamplerPluginInterface* plugin = iPluginArray->At(i); - id = (TUint32)plugin->GetSamplerUidByName(aName); - if(id != KErrNotFound) - { - return TUid::Uid(id); - } - } - } - - LOGSTRING2(" RSamplerController::GetPluginUID - KErrNotFound! traceId = %d", id ); - uid = TUid::Uid(0); - return uid; - } - - -CSamplerPluginInterface* CSamplerController::GetPlugin(TUid aUid) - { - LOGTEXT(_L("RSamplerController::GetPlugin - entry")); - // check that plugin array contains samplers - if( iPluginArray && iPluginArray->Count() > 0 ) - { - for(TInt i=0;iCount();i++) - { - CSamplerPluginInterface* plugin = iPluginArray->At(i); - TUid uid = plugin->Id(-1); // get parent uid first - if(uid == aUid) - { - LOGTEXT(_L("CSamplerController::GetPlugin() - main plug-in found!")); - return plugin; - } - - if(plugin->SubId(aUid) != KErrNotFound) - { - LOGTEXT(_L("CSamplerController::GetPlugin() - subsampler found!")); - return plugin; - } - } - } - LOGTEXT(_L("CSamplerController::GetPlugin() - No plug-in found for UID")); - - return (CSamplerPluginInterface*)0; - } - -// start user mode samplers -void CSamplerController::StartSamplerPluginsL() - { - CSamplerPluginInterface* plugin = NULL; - TInt count(iPluginArray->Count()); - TInt err(KErrNone); - - LOGSTRING2(" RSamplerController::StartSamplerPlugin - plugins loaded, amount = %d", count); - if( iPluginArray && count > 0 ) - { - for(TInt i(0);iAt(i); - // check if some error received when starting profiling - err = plugin->ResetAndActivateL(iStream); - if( err != KErrNone) - { - // handle received error, need to update UI! - iObserver->HandleError(err); - } - } - } - } - -// stop user mode samplers -TInt CSamplerController::StopSamplerPlugins() - { - TInt count(0); - - if( iPluginArray && iPluginArray->Count() > 0 ) - { - TInt i(0); - CSamplerPluginInterface* plugin = NULL; - // stop kernel mode samplers - for(;iCount();i++) - { - plugin = iPluginArray->At(i); - TUint32 id = plugin->Id(-1).iUid; - LOGSTRING2(" CSamplerController::StopSamplerPlugins - traceId = %d", - id); - // stop only started samplers - if(plugin->Enabled()) - { - // stop selected plugin - plugin->StopSampling(); - // check if user mode sampler, special flush needed to direct data to stream - if(plugin->GetSamplerType() == PROFILER_USER_MODE_SAMPLER) - { - LOGTEXT(_L(" CSamplerController::StopSamplerPlugins - flushing user mode sampler stream")); - plugin->Flush(); - } - } - count++; - } - } - return count; - } - -// end of file - - - -