diff -r 0ff24a8f6ca2 -r 98307c651589 piprofiler/plugins/BUPplugin/src/BupPlugin.cpp --- a/piprofiler/plugins/BUPplugin/src/BupPlugin.cpp Fri Aug 27 11:37:29 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,582 +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 "BupPlugin.h" -//#include - -#include // for listening key events - - -// LITERALS -// CONSTANTS -const TUid KSamplerBupPluginUid = { 0x2001E5B6 }; - -/* - * - * class CBupPlugin implementation - * - */ - -CBupPlugin* CBupPlugin::NewL(const TUid /*aImplementationUid*/, TAny* /*aInitParams*/) - { - LOGTEXT(_L("CBupPlugin::NewL() - entry")); - CBupPlugin* self = new (ELeave) CBupPlugin(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - LOGTEXT(_L("CBupPlugin::NewL() - exit")); - return self; - } - -CBupPlugin::CBupPlugin() : - iVersionDescriptor(&(this->iVersion[1]),0,19), - iSamplerType(PROFILER_USER_MODE_SAMPLER) - { - iSamplerId = PROFILER_BUP_SAMPLER_ID; - iEnabled = EFalse; - LOGTEXT(_L("CBupPlugin::CBupPlugin() - konstruktori")); - } - -void CBupPlugin::ConstructL() - { - LOGTEXT(_L("CBupPlugin::ConstructL() - entry")); - - // initiate sampler attributes array - iSamplerAttributes = new(ELeave) CArrayFixFlat(1); // only one sampler - - // insert default attributes to array - InitiateSamplerAttributesL(); - - LOGTEXT(_L("CBupPlugin::ConstructL() - exit")); - } - - -CBupPlugin::~CBupPlugin() - { - LOGTEXT(_L("CBupPlugin::~CBupPlugin() - entry")); - if(iButtonListener) - { - // check if button listener still running - if(Enabled()) - { - // stop profiling - iButtonListener->Stop(); - } - delete iButtonListener; - } - - if(iSamplerAttributes) - { - iSamplerAttributes->Reset(); - } - delete iSamplerAttributes; - - LOGTEXT(_L("CBupPlugin::~CBupPlugin() - exit")); - } - -TUid CBupPlugin::Id(TInt /*aUid*/) const - { - LOGSTRING2("CBupPlugin::Id():0x%X", KSamplerBupPluginUid.iUid ); - return KSamplerBupPluginUid; - } - -void CBupPlugin::InitiateSamplerAttributesL() - { - // create sampler attribute container - TSamplerAttributes attr(KSamplerBupPluginUid.iUid, - KBUPShortName(), - KBUPLongName(), - KBUPDescription(), - -1, - ETrue, - EFalse, - 0); // default item count - this->iSamplerAttributes->AppendL(attr); - } - -// returns setting array -void CBupPlugin::GetAttributesL(CArrayFixFlat* aAttributes) - { - // append my own attributes to complete array, requested by profiler engine - aAttributes->AppendL(iSamplerAttributes->At(0)); - } - -TInt CBupPlugin::SetAttributesL(TSamplerAttributes aAttributes) - { - TSamplerAttributes attr; - - attr = iSamplerAttributes->At(0); - // if UIDs match replace the old - if(attr.iUid == aAttributes.iUid) - { - // replace the old attribute container - iSamplerAttributes->Delete(0); - iSamplerAttributes->InsertL(0, aAttributes); - return KErrNone; - } - return KErrNotFound; - } - -/* - * Method for parsing and transforming text array settings into TSamplerAttributes (per each sub sampler), - * called by CSamplerController class - * - * @param array of raw text setting lines, e.g. [gpp]\nenabled=true\nsampling_period_ms=1\n - */ -TInt CBupPlugin::ConvertRawSettingsToAttributes(CDesC8ArrayFlat* aAllSettingsArray) - { - // local literals - _LIT8(KBUPShort, "bup"); - - TInt err(KErrNone); - TBuf8<16> samplerSearchName; - samplerSearchName.Copy(KBUPShort); - - // get sampler specific settings - err = DoSetSamplerSettings(aAllSettingsArray, samplerSearchName, 0); - - // returns KErrNone if settings found, otherwise KErrNotFound - return err; - } - -TInt CBupPlugin::DoSetSamplerSettings(CDesC8ArrayFlat* aAllSettings, TDesC8& aSamplerName, TInt aIndex) - { - // - TBuf8<16> samplerSearch; - samplerSearch.Copy(KBracketOpen); - samplerSearch.Append(aSamplerName); - samplerSearch.Append(KBracketClose); - - // read a line - for (TInt i(0); iMdcaCount(); i++) - { - // check if this line has a setting block start, i.e. contains [xxx] in it - if (aAllSettings->MdcaPoint(i).CompareF(samplerSearch) == 0) - { - // right settings block found, now loop until the next block is found - for(TInt j(i+1);jMdcaCount();j++) - { - // check if the next settings block was found - if(aAllSettings->MdcaPoint(j).Left(1).CompareF(KBracketOpen) != 0) - { - // save found setting value directly to its owners attributes - SaveSettingToAttributes(aAllSettings->MdcaPoint(j), aIndex); - } - else - { - // next block found, return KErrNone - return KErrNone; - } - } - } - } - - return KErrNotFound; - } - -/** - * Method for setting a specific descriptor (from settings file) to attribute structure - * - * @param aSetting - * @param aName - */ -void CBupPlugin::SaveSettingToAttributes(const TDesC8& aSetting, TInt aIndex) - { - // find the equal mark from the setting line - TInt sepPos = aSetting.Find(KSettingItemSeparator); - // check that '=' is found - if (sepPos > 0) - { - // check that the element matches - if (aSetting.Left(sepPos).CompareF(KEnabled) == 0) - { - TBool en; - CSamplerPluginInterface::Str2Bool(aSetting.Right(aSetting.Length()-sepPos-1), en); - if(iSamplerAttributes->At(aIndex).iEnabled != en) - { - iSamplerAttributes->At(aIndex).iEnabled = en; - } - } - } - } - -TInt CBupPlugin::GetSamplerType() - { - return iSamplerType; - } - -TInt CBupPlugin::ResetAndActivateL(CProfilerSampleStream& aStream) - { - LOGTEXT(_L("CBupPlugin::ResetAndActivate() - entry")); - TInt ret(KErrNone); - - // check if sampler enabled - if(iSamplerAttributes->At(0).iEnabled) - { - // create first the listener instance - iButtonListener = CProfilerButtonListener::NewL(this); - - LOGTEXT(_L("CBupPlugin::ResetAndActivate() - listener created")); - - iStream = &aStream; - TInt length = this->CreateFirstSample(); - iVersion[0] = (TUint8)length; - LOGSTRING2("CBupPlugin::ResetAndActivate() - AddSample, length %d",length); - ret = AddSample(iVersion, length+1, 0); - if(ret != KErrNone) - return ret; - - // activate button listener - ret = iButtonListener->StartL(); - - iEnabled = ETrue; - - LOGTEXT(_L("CBupPlugin::ResetAndActivate() - exit")); - } - return ret; - - } - -TInt CBupPlugin::CreateFirstSample() - { - LOGTEXT(_L("CBupPlugin::CreateFirstSample - entry")); - this->iVersionDescriptor.Zero(); - this->iVersionDescriptor.Append(_L8("Bappea_BUP_V")); - this->iVersionDescriptor.Append(PROFILER_BUP_SAMPLER_VERSION); - LOGTEXT(_L("CBupPlugin::CreateFirstSample - exit")); - return (TInt)(this->iVersionDescriptor.Length()); - } - -TInt CBupPlugin::StopSampling() - { - if(iButtonListener) - { - iButtonListener->Stop(); - delete iButtonListener; // delete listener after every trace - iButtonListener = NULL; - } - - // set disabled - iEnabled = EFalse; - - return KErrNone; - } - -void CBupPlugin::FillThisStreamBuffer(TBapBuf* /*aBapBuf*/, TRequestStatus& /*aStatus*/) - { - } - -/* - * - * Implementation of class CProfilerButtonListener - * - */ -CProfilerButtonListener::CProfilerButtonListener(CBupPlugin* aSampler) - { - LOGTEXT(_L("CProfilerButtonListener::CProfilerButtonListener() - konstuktori")); - this->iSampler = aSampler; - iSampleStartTime = 0; - LOGTEXT(_L("CProfilerButtonListener::CProfilerButtonListener() - konstuktori exit")); - } - -CProfilerButtonListener* CProfilerButtonListener::NewL(CBupPlugin* aSampler) - { - LOGTEXT(_L("CProfilerButtonListener::NewL() - entry")); - CProfilerButtonListener* self = new (ELeave) CProfilerButtonListener(aSampler); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - LOGTEXT(_L("CProfilerButtonListener::NewL() - exit")); - return self; - } - -CProfilerButtonListener::~CProfilerButtonListener() - { - LOGTEXT(_L("CProfilerButtonListener::~CProfilerButtonListener() - entry af")); - - if(iMainWindow) - { - LOGTEXT(_L("CProfilerButtonListener::~CProfilerButtonListener(): flushing iWs")); - iWs.Flush(); - LOGTEXT(_L("CProfilerButtonListener::~CProfilerButtonListener(): finishing")); - } - delete iMainWindow; - LOGTEXT(_L("CProfilerButtonListener::~CProfilerButtonListener() - exit")); - } - -void CProfilerButtonListener::ConstructMainWindowL() - { - LOGTEXT(_L("CProfilerButtonListener::ConstructMainWindowL() - Entry")); - - CWindow* window = new (ELeave) CWindow(this); - CleanupStack::PushL( window ); - window->ConstructL(TRect(TPoint(0,0), TSize(0,0))); - delete iMainWindow; - iMainWindow = window; - CleanupStack::Pop( window ); - - LOGTEXT(_L("CProfilerButtonListener::ConstructMainWindowL() - Exit")); - } - -void CProfilerButtonListener::HandleKeyEventL (TKeyEvent& /*aKeyEvent*/) - { - LOGTEXT(_L("CProfilerButtonListener::HandleKeyEventL() - Start")); - LOGTEXT(_L("CProfilerButtonListener::HandleKeyEventL() - End")); - } - - -TInt CProfilerButtonListener::RunError(TInt aError) - { - // get rid of everything we allocated - // deactivate the anim dll before killing window, otherwise anim dll dies too early - iAnim->Deactivate(); - iAnim->Close(); - - iAnimDll->Close(); - - return aError; - } - -void CProfilerButtonListener::RunL() - { - // resubscribe before processing new value to prevent missing updates - IssueRequest(); - - TInt c = 0; - if(RProperty::Get(KProfilerKeyEventPropertyCat, EProfilerKeyEventPropertySample, c) == KErrNone) - { - // do something with event - LOGSTRING2("CProfilerButtonListener::RunL() - event [%d] received",c); - - iSample[0] = c; - iSample[1] = c >> 8; - iSample[2] = c >> 16; - iSample[3] = c >> 24; - - // Space for GPP sample time - TUint32 sampleTime = User::NTickCount() - iSampleStartTime; - LOGSTRING2("CProfilerButtonListener::RunL() - sample time is %d",sampleTime); - - iSample[4] = sampleTime; - iSample[5] = sampleTime >> 8; - iSample[6] = sampleTime >> 16; - iSample[7] = sampleTime >> 24; - - iSampler->AddSample(iSample, 8, 0xb0); - } - } - -TInt CProfilerButtonListener::StartL() - { - LOGTEXT(_L("CProfilerButtonListener::StartL() - Activate touch server dll")); - TInt err(KErrNone); - - // get the property value - TInt r = RProperty::Get(KGppPropertyCat, EGppPropertySyncSampleNumber, iSampleStartTime); - if(r != KErrNone) - { - LOGSTRING2("CProfilerButtonListener::StartL() - getting iSyncOffset failed, error %d", r); - } - - iAnimDll = new (ELeave) RAnimDll(iWs); - LOGTEXT(_L("CProfilerButtonListener::StartL() - #1")); - - TParse* fp = new (ELeave) TParse(); - CleanupStack::PushL(fp); - fp->Set( KDllName, &KDC_SHARED_LIB_DIR , NULL ); - LOGSTRING2("CProfilerButtonListener::StartL() - touch event server: %S" , &(fp->FullName())); - - err = iAnimDll->Load(fp->FullName()); - // check if anim dll load failed - if(err != KErrNone) - { - CleanupStack::PopAndDestroy(fp); - // stop plugin if failed - iAnimDll->Close(); - return KErrGeneral; - } - CleanupStack::PopAndDestroy(fp); - LOGTEXT(_L("CProfilerButtonListener::StartL() - #2")); - - iAnim = new (ELeave) RProfilerTouchEventAnim(*iAnimDll); - LOGTEXT(_L("CProfilerButtonListener::StartL() - #3")); - iAnim->ConstructL(iMainWindow->Window()); - - // activate the animation dll for collecting touch and key events - iAnim->Activate(); - - // wait for a new sample - IssueRequest(); - - // hide this window group from the app switcher - iMainWindow->Client()->Group().SetOrdinalPosition(-1); - iMainWindow->Client()->Group().EnableReceiptOfFocus(EFalse); - return KErrNone; - } - -TInt CProfilerButtonListener::Stop() - { - LOGTEXT(_L("CProfilerButtonListener::Stop() - enter")); - // deactivate the anim dll before killing window, otherwise anim dll dies too early - iAnim->Deactivate(); - iAnim->Close(); - - iAnimDll->Close(); - - Cancel(); - LOGTEXT(_L("CProfilerButtonListener::Stop() - exit")); - return KErrNone; - } - - -/////////////////////////////////////////////////////////////////////////////// -////////////////////////// CWindow implementation ///////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -CWindow::CWindow(CWsClient* aClient) -: iClient(aClient) - { - LOGTEXT(_L("CWindow::CWindow()")); - } - -void CWindow::ConstructL (const TRect& aRect, CWindow* aParent) - { - LOGTEXT(_L("CWindow::ConstructL(): Start")); - - // If a parent window was specified, use it; if not, use the window group - // (aParent defaults to 0). - RWindowTreeNode* parent= aParent ? (RWindowTreeNode*) &(aParent->Window()) : &(iClient->iGroup); - iWindow=RWindow(iClient->iWs); // use app's session to window server - User::LeaveIfError(iWindow.Construct(*parent,(TUint32)this)); - LOGSTRING2("CWindow::ConstructL(): Start - window handle is: 0x%08x", this); - iRect = aRect; - iWindow.SetExtent(iRect.iTl, iRect.Size()); // set extent relative to group coords - iWindow.Activate(); // window is now active - LOGTEXT(_L("CWindow::ConstructL(): End")); - } - - -CWindow::~CWindow() - { - LOGTEXT(_L("CWindow::~CWindow(): Start")); - iWindow.Close(); // close our window - LOGTEXT(_L("CWindow::~CWindow(): End")); - } - -RWindow& CWindow::Window() - { - LOGTEXT(_L("CWindow::Window()")); - return iWindow; - } - -CWindowGc* CWindow::SystemGc() - { - LOGTEXT(_L("CWindow::SystemGc()")); - return iClient->iGc; - } - -///////////////////////////////////////////////////////////////////////////////////// -/////////////////////////// CWsClient implementation //////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////// -CWsClient::CWsClient() -: CActive(CActive::EPriorityStandard) - { - LOGTEXT(_L("CWsClient::CWsClient()")); - } - -void CWsClient::ConstructL() - { - LOGTEXT(_L("CWsClient::ConstructL() - Start")); - TInt r = RProperty::Define(EProfilerKeyEventPropertySample, RProperty::EInt, KAllowAllPolicy, KCapabilityNone); - if (r!=KErrAlreadyExists) - { - User::LeaveIfError(r); - } - - CActiveScheduler::Add(this); - - // attach to - User::LeaveIfError(iProperty.Attach(KProfilerKeyEventPropertyCat,EProfilerKeyEventPropertySample)); - - // get a session going - User::LeaveIfError(iWs.Connect()); - - // construct screen device and graphics context - iScreen=new (ELeave) CWsScreenDevice(iWs); // make device for this session - User::LeaveIfError(iScreen->Construct( 0 )); // and complete its construction - User::LeaveIfError(iScreen->CreateContext(iGc)); // create graphics context - - // construct our one and only window group - iGroup=RWindowGroup(iWs); - User::LeaveIfError(iGroup.Construct((TInt)this, EFalse)); // meaningless handle; enable focus - - // construct main window - ConstructMainWindowL(); - - LOGTEXT(_L("CWsClient::CWsClient() - End")); - } - -CWsClient::~CWsClient() - { - LOGTEXT(_L("CWsClient::~CWsClient() - Start")); - - // get rid of everything we allocated - delete iGc; - delete iScreen; - - iGroup.Close(); - // finish with window server - iWs.Close(); - - LOGTEXT(_L("CWsClient::~CWsClient() - Exit")); - } - -void CWsClient::Exit() - { - LOGTEXT(_L("CWsClient::Exit() - Start")); - - // destroy window group - iGroup.Close(); - // finish with window server - iProperty.Close(); - iWs.Close(); - LOGTEXT(_L("CWsClient::Exit() - Exit")); - } - -void CWsClient::IssueRequest() - { - LOGTEXT(_L("CWsClient::IssueRequest() - Start")); - iProperty.Subscribe( iStatus ); - SetActive(); // so we're now active - LOGTEXT(_L("CWsClient::IssueRequest() - Exit")); - } - -void CWsClient::DoCancel() - { - LOGTEXT(_L("CWsClient::DoCancel() - Start")); - // clean up the sample property - iProperty.Cancel(); - iProperty.Close(); - LOGTEXT(_L("CWsClient::DoCancel() - Exit")); - } - -void CWsClient::ConstructMainWindowL() - { - LOGTEXT(_L("CWsClient::ConstructMainWindowL()")); - } -