diff -r f0f2b8682603 -r 3ff3fecb12fe sysanadatacapture/piprofiler/piprofiler/engine/src/SamplerController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysanadatacapture/piprofiler/piprofiler/engine/src/SamplerController.cpp Thu Feb 11 15:52:57 2010 +0200 @@ -0,0 +1,526 @@ +/* +* 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 + + + +