diff -r f0f2b8682603 -r 3ff3fecb12fe sysanadatacapture/piprofiler/piprofiler/plugins/BUPplugin/src/BupPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysanadatacapture/piprofiler/piprofiler/plugins/BUPplugin/src/BupPlugin.cpp Thu Feb 11 15:52:57 2010 +0200 @@ -0,0 +1,592 @@ +/* +* 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 // key eventtien kuunteluun +#include // for CApaWindowGroupName + +// LITERALS +_LIT8(KEnabled, "enabled"); +_LIT8(KBracketOpen, "["); +_LIT8(KBracketClose, "]"); +_LIT8(KSettingItemSeparator, "="); + +/* + * + * 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 + */ +//void CGeneralsPlugin::ParseSettingsText(CDesC8ArrayFlat* aRawSettings) +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; + } + +void CBupPlugin::GetCaption( TDes& aCaption, TInt /*aType*/, TInt /*aUid*/ ) const + { + aCaption.Copy(KBUPShortName); + aCaption.TrimRight(); + LOGSTRING2("CBupPlugin::GetCaptionL() - Plugin name: %S", &aCaption); + } + +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()")); + } +