diff -r 000000000000 -r 08ec8eefde2f traceservices/tracefw/ulogger/src/uloggerserver/uloggerserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/traceservices/tracefw/ulogger/src/uloggerserver/uloggerserver.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,2081 @@ +// Copyright (c) 2007-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 +#include +#include +#include "uloggerserver.h" +#include "uloggersession.h" +#include "uloggerclient.h" +#include "uloggerplugin.h" +#include "uloggershared.h" +#include "uloggerdatatypes.h" +#include "inputdata.h" +#include "uloggercommands.h" + +#if defined(__LIGHTLOGGER_ENABLED) +#include "lightlogger.h" +#endif + + +namespace Ulogger { + + +/*Default constructor*/ +CULoggerServer::CULoggerServer(TInt aPriority) +: CServer2( aPriority ) + +{ + iIsBooting = ETrue; + iConfigManager = NULL; + iDataWatcher = NULL; + iOutputFramework = NULL; + iInputFramework = NULL; + iPluginAllocator = NULL; +} + + +/** Destructor will be called before re-starting +*/ +CULoggerServer::~CULoggerServer() +{ + delete iConfigManager; + delete iOutputFramework; + delete iInputFramework; + delete iPluginAllocator; + iPluginArray.ResetAndDestroy(); + iPluginArray.Close(); + if(iDataWatcher) + { + iDataWatcher->Cancel(); + delete iDataWatcher; + } +} + +/** Static Factory Construction +@return a pointer to the created object +@leave KErrNoMemory if not enough memory available +*/ +CULoggerServer* CULoggerServer::NewLC(TInt aPriority) +{ + CULoggerServer* self = new (ELeave) CULoggerServer( aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; +} + +/** +Create and install new Framework & Active Scheduler +*/ +void CULoggerServer::ConstructL() +{ + iRunAsService = EFalse; // Not used yet, to be used for run-as-service functionality + iBufferSize = KMaxBufferSize; + iBtraceOpen = EFalse; + iDataNotification = 0; + + StartL( KServerName ); + iConfigManager = CConfigFileManager::NewL(); + +} + + +/** +Create a new server session. +@note Called by kernel after client's thread use any of the macros for the first time. +*/ +CSession2* CULoggerServer::NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const +{ + TVersion v(KULoggerSrvMajorVersionNumber,KULoggerSrvMinorVersionNumber,KULoggerSrvBuildVersionNumber); + if (!User::QueryVersionSupported(v,aVersion)) + User::Leave(KErrNotSupported); + + RThread client; + aMessage.Client(client); + return CULoggerSession::NewL( client, *const_cast(this) ); +} + + +/*Increment session counter*/ +void CULoggerServer::IncrementSessions() +{ + ++iSessionCounter; +} + +/*Decrement session counter*/ +void CULoggerServer::DecrementSessions() + { + if(--iSessionCounter <= 0) + { + if (!iBtraceOpen) + ShutDownServer(); + +// +// // Replace above if-statement with following to implement run-as-service functionality +// +// if((!iBtraceOpen) && (!iRunAsService)) +// ShutDownServer(); +// + + } + } + +/*! +Shuts down the server +*/ +void CULoggerServer::ShutDownServer() +{ + CActiveScheduler::Stop(); +}// + + + + +/*! +Return the error value +*/ +TInt CULoggerServer::RunError(TInt aError) +{ + Message().Complete(aError); + ReStart(); + + return KErrNone; +} + + + + +void CULoggerServer::PanicServer(TULoggerSrvPanics aPanic) +{ + User::Panic(KServerName, aPanic); +}// + + + +/*! +*/ +void CULoggerServer::PanicClient(const RMessage2& aMessage, TULoggerSrvPanics aPanic) +{ + aMessage.Panic( KServerName, aPanic ); +}// + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** +ServerL +@Installs the active scheduler +@Opens the semaphore +*/ +TInt CULoggerServer::StartServerL() +{ + #if defined(__LIGHTLOGGER_ENABLED) + __CREATE_LOG(EFalse) + __HIRES_RESOLUTION + #endif + + CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler(); + CleanupStack::PushL(activeScheduler) ; + CActiveScheduler::Install(activeScheduler); + CULoggerServer* server = NULL; + TInt servererr = KErrNone; + TRAP(servererr, + { + server = CULoggerServer::NewLC((TProcessPriority)EPriorityHigh); + CleanupStack::Pop(); + }); + + if(servererr==KErrNone||servererr==KErrNotFound ) + { + RProcess::Rendezvous(KErrNone); + servererr=KErrNone; + CActiveScheduler::Start(); + } + else + { + RProcess::Rendezvous(servererr); + } + delete server; + CleanupStack::PopAndDestroy(); + return servererr; + +}// + + +/** +Function to to start the server +This should leave with KErrNone +*/ +TInt CULoggerServer::StartServer() +{ + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + if (!cleanupStack) + { + return KErrNoMemory; + } + TInt err; + TRAP(err, StartServerL()); + + delete cleanupStack; + cleanupStack = NULL; + + return err; +}// + + +/** +Function to set the active output media +This should leave with KErrNotFound if given plugin is not the correct one +or the file doesn't exists in the user and public path +*/ + +TInt CULoggerServer::SetActiveOutputPlugin(const TDesC8 &aPluginname) +{ + RArray activePluginsArray; + TInt error= KErrNone; + + error = GetInstalledOutputPlugins(activePluginsArray); + if(error==KErrNone) + { + for(TInt i=0;iSetActiveOutputPlugin(aPluginname); + break; + } + else + error = KErrNotFound; + } + } + if(error == KErrAlreadyExists) + { + error=KErrNone; + } + return error; +} + + +TInt CULoggerServer::SetActiveInputPlugin(const TDesC8 &aPluginname) + { + RArray activePluginsArray; + TInt ret= KErrNone; + //check configuration file in user path (\\ulogger\\uloggerconfig.ini) + + ret = GetInstalledInputPlugins(activePluginsArray); + if(ret==KErrNone) + { + ret = KErrNotFound; + for(TInt i=0;iSetActiveInputPlugin(aPluginname); + break; + } + } + } + return ret; + } + + +/** +Function to set the plugin settings +This should leave with KErrNotFound if cannot file doesn't exist +*/ +TInt CULoggerServer::SetPluginSettings(const TDesC8 &aPluginname, RArray& aListBuffer) +{ + TInt i = 0; + TInt ret=KErrNone; + + //if plug-in doesn't exists + TPtrC8 pluginName(aPluginname); + if(!CheckPluginExists(pluginName, EOutputPluginFilter) && !CheckPluginExists(pluginName, EInputPluginFilter)) + return KErrNotFound; + + while(iSetPluginSetting(aPluginname, key, val); + if(ret!=KErrNone) + break; + i++; + } + return ret; +} + + + + +/** +Function to get the plugin settings +This should leave with KErrNotFound if cannot find one +*/ +TInt CULoggerServer::GetOptionsSettingsL(const TDesC8 &aMediaName, RArray& aListBuffer) +{ + //if plug-in doesn't exists + TPtrC8 pluginName(aMediaName); + if(!CheckPluginExists(pluginName, EOutputPluginFilter) && !CheckPluginExists(pluginName, EInputPluginFilter)) + return KErrNotFound; + else + { + TInt ret = GetValues(aMediaName,aListBuffer); + if(ret == KErrNotFound) //this error indicate that there is no section in config file, plug-in exists + ret = KErrNone; + return ret; + } +} + + + +/** +Function to get values from the configuration file (i.e. for filters,plugin settings) +This should leave with KErrNotFound if it cannot find the configuration file +*/ +TInt CULoggerServer::GetValues(const TDesC8 &aSectionName, RArray& aListBuffer) +{ + TPtrC8 key; + TPtrC8 val; + TInt err = KErrNotFound; + + Ulogger::CConfigSettingsIter* iter = Ulogger::CConfigSettingsIter::NewL(); + CleanupStack::PushL(iter); + + //check User configuration file if exists + //check values for given section in the configuration file + //if value exists copy it to array + err = iConfigManager->GetSectionValues(aSectionName,*iter); + if(err == KErrNone) + { + TBool found =EFalse; + while(iter->Next(key,val)) + { + aListBuffer.AppendL(key); + aListBuffer.AppendL(val); + found = ETrue; + } + if(!found) + err = KErrNotFound; + } + CleanupStack::PopAndDestroy(); // list + return err; + +} + + +/** +Sets the Active Filter in the configuration file (primary and secondary filters) +@aCategory filters to be set +@aDupCategory duplicate filters which are not set +@aFilter value that describes primary or secondary filter +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ +TInt CULoggerServer::SetActiveFilter(RArray aCategory, TInt aFilterType) +{ + TInt error = KErrNone; + if(aFilterType == 1) + { + if(aCategory.Count()==0 || aCategory.Count()>KMaxPrimaryFiltersLimit) + error = KErrArgument; + else + { + error = iConfigManager->SetActiveFilter(aCategory,KPrimaryFilterSection); + if(error == KErrAlreadyExists) + error = KErrNone; + } + } + if(aFilterType == 2) + { + //we don't want to set more secondary filters than KMaxSecondaryFiltersLimit + RArray tmpArray; + CleanupClosePushL(tmpArray); + error = GetActiveFilters(tmpArray, ESecondaryFilter); + if(!error || error == KErrNotFound) + { + error = KErrNone; //in case it was KErrNotFound as it doesn't matter we didn't have any set already + if(aCategory.Count()==0 ||tmpArray.Count() > KMaxSecondaryFiltersLimit || + (tmpArray.Count()+ aCategory.Count()) > KMaxSecondaryFiltersLimit) + error = KErrArgument; + + } + CleanupStack::PopAndDestroy(); //tmpArray + if(!error) + error = iConfigManager->SetActiveFilter(aCategory,KSecondaryFilterSection); + } + return error; +} + + +/** +Function to remove the Filter from config file +@aFilter Filter to be removed +@aValue primary or secondary filter to be removed +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::RemoveActiveFilter(RArray& aValue, const TInt aFilter) +{ + TInt ret = KErrNone; + //remove filter (primary or secondary) from BTrace current configuration + if(aFilter == EPrimaryFilter && (aValue.Count()==0 || aValue.Count()>KMaxPrimaryFiltersLimit)) + return KErrArgument; + else if(aFilter == ESecondaryFilter && (aValue.Count()==0 || aValue.Count()>KMaxSecondaryFiltersLimit)) + return KErrArgument; + + ret = iConfigManager->RemoveActiveFilter(aValue,aFilter); + if(ret == KErrNotFound) //remove operation should succeed in this situation + ret = KErrNone; + + return ret; +} + + +/** +Function to set Trace settings to the configuration file +@aValue value to be set +@aSetting setting to which value to be set +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::SetTraceSettings(const TDesC8& aValue, const TDesC8& aSetting) + { + TInt r = iConfigManager->SetTraceSettings(aValue, aSetting); + return r; + + } + +/** +Function to remove plugin settings from the configuration file +@aPluginName Plugin name whose settings has to be removed +@return will return KErrNone or else leave with KErrNotFound + or any system wide error codes +*/ + +TInt CULoggerServer::RemovePluginSettingsL(const TDesC8 &aPluginName) + { + if(aPluginName.Length() == 0) + return KErrArgument; + + TInt ret = KErrNone; + RArray settings; + ret = GetOptionsSettingsL(aPluginName, settings); + if(ret != KErrNone || settings.Count()==0) + ret = KErrNotFound; + settings.Close(); + + if(ret == KErrNone) + return iConfigManager->RemovePluginSettings(aPluginName); + else + return ret; + } + +/** +Resize the BTrace buffer size + +@aSize The size to be set for the BTrace buffer. +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ +TInt CULoggerServer::SetBufferSize(TInt aSize) + { + if(aSize > KMaxBufferSize || aSize < 1) + return KErrArgument; + + + //get dns to check + GetBufandDataNotifyValuesL(KDataNotification,iDataNotification); + if(aSize < iDataNotification) + return KErrGeneral; + + iBufferSize = aSize; + HBufC8* Size = HBufC8::NewLC(32); + Size->Des().Num(iBufferSize); + CleanupStack::Pop(1); + TPtr8 ptr(Size->Des()); + TInt r = iConfigManager->SetTraceSettings((const TDesC8&)ptr, KBuffer); + return r; + } + + +/** +Change the mode of the BTrace Buffer + +@aValue The mode to be set for the BTrace buffer. +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ +TInt CULoggerServer::SetBufferMode(const TDesC8& aValue) + { + + TInt r = SetTraceSettings(aValue, KBufferMode); + return r; + } + +/** +Resize the Data Notification size + +@aSize The size to be set for the Data Notification size. +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ +TInt CULoggerServer::SetDataNotificationSize(TInt aSize) + { + if(aSize > KMaxDnsSize || aSize < 0) + return KErrArgument; + TInt size, r; + TRAP_IGNORE((r=GetBufandDataNotifyValuesL(KBuffer,size))); + if(aSize > size) + return KErrGeneral; + + iDataNotification = aSize; + HBufC8* Size = HBufC8::NewLC(32); + Size->Des().Num(aSize); + TPtr8 ptr(Size->Des()); + r = SetTraceSettings((const TDesC8&)ptr, KDataNotification); + CleanupStack::PopAndDestroy(); + return r; + } + +/** +Function to retrieve the Trace Section Values +This should leave with KErrNotFound if cannot find one +as this should be treated as a corrupt config file +*/ +void CULoggerServer::GetOptionsSettingsL(RArray& aListBuffer,const TDesC8& aSetting) +{ + TPtrC8 key; + TPtrC8 val; + TInt err=0; + + Ulogger::CConfigSettingsIter* iter = Ulogger::CConfigSettingsIter::NewL(); + CleanupStack::PushL(iter); + err=iConfigManager->GetPluginSettings(*iter); + + if(err==KErrNone) + { + while(iter->Next(key,val)) + { + if(key.Compare(aSetting)==0) + { + aListBuffer.AppendL(key); + aListBuffer.AppendL(val); + } + } + } + CleanupStack::PopAndDestroy(); // list +} + +/** +Function to retrieve the active primary filters +This should leave with KErrNotFound if cannot find one +as this should be treated as a corrupt config file +*/ +TInt CULoggerServer::GetBufandDataNotifyValuesL(const TDesC8& aSetting,TInt& value) + { + TInt err = KErrNotFound; + RArray traceValues; + TFileName filepath; + + GetOptionsSettingsL(traceValues,aSetting); + + value =-1; + //if values exists for the given trace settings + if(traceValues.Count()>1) + {// get values for buffer mode + if(aSetting.Compare(KBufferMode)==0) + { + err=KErrNone; + if(traceValues[1].Compare(KCircular) == 0) + value = ECircularBuffer; + else if(traceValues[1].Compare(KStraight) == 0) + value = EStraightBuffer; + else + err=KErrNotFound; + } + else + {// get values for data notification and buffer size + TLex8 lex_val(traceValues[1]); + err = lex_val.Val(value); + } + } + return err; + } + + + +/** +Set the enable/disable secondary filters + +@aSize The size to be set for the BTrace buffer. +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ +TInt CULoggerServer::SetSecondaryFiltering(const TDesC8& aEnabled) + { + TInt error = iConfigManager->SetTraceSettings(aEnabled, KSecondaryGlobalFilter); + if(error == KErrAlreadyExists) + error = KErrNone; + return error; + + } + + +/** +Function to retrieve the active primary and secondary filters +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::GetActiveFilters(RArray& aListBuffer,TInt aFilterType) + { + TInt ret = KErrNotFound; + RArray aValues; + if(aFilterType == 1) + { + ret = GetValues(KPrimaryFilterSection,aValues); + if(ret==KErrNone) + { + TInt i =0; + TPtrC8 val; + TUint8 int_val; + while(i change to if(filters.Count = 0)? + ret=KErrNone; + } + } + return ret; + } + +/** +Function to retrieve the active secondary global filter +This should leave with KErrNotFound if cannot find one +*/ + +TInt CULoggerServer::GetSecondaryFiltering(TBool& aEnabled) +{ + RArray configSettings; + TRAPD(error, GetOptionsSettingsL(configSettings,KSecondaryGlobalFilter)); + if(configSettings[1]==KEnable) //First element contains KSecondaryGlobalFilter, second the value + aEnabled = ETrue; + if(configSettings[1]==KDisable) + aEnabled = EFalse; + return error; +} + +/** +Function to retrieve the plugin names from the ECOM framework +This should leave with KErrNotFound if cannot find one +*/ +TInt CULoggerServer::GetInstalledOutputPlugins(RArray& aListBuffer) + { + // Read info about all implementations into infoArray + // Note that a special cleanup function is required to reset and destroy + // all items in the array, and then close it. + if(iPluginArray.Count()>0) + { + iPluginArray.ResetAndDestroy(); + iPluginArray.Close(); + } + + TRAPD(error,CPluginAllocator::ListAllImplementationsL(iPluginArray)); + + if(iPluginArray.Count()>0) + { + for (TInt i=0; i< iPluginArray.Count(); i++) + { + TRAP(error,aListBuffer.AppendL(iPluginArray[i]->DataType())); + } + + //filter plugins and to use only output plugins + FilterPlugins(EOutputPluginFilter, aListBuffer); + } + + return error; + } + + + +TInt CULoggerServer::GetInstalledInputPlugins(RArray& aListBuffer) + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __MARK_METHOD("CULoggerServer::GetInstalledControlPlugins") + #endif + + if(iPluginArray.Count()>0) + { + iPluginArray.ResetAndDestroy(); + iPluginArray.Close(); + } + // Read info about all implementations into infoArray + // Note that a special cleanup function is required to reset and destroy + // all items in the array, and then close it. + CPluginAllocator::ListAllImplementationsL(iPluginArray); + + if(iPluginArray.Count() > 0) + { + for (TInt i=0; i< iPluginArray.Count(); i++) + aListBuffer.AppendL(iPluginArray[i]->DataType()); + + //filter plugins and to use only output plugins + FilterPlugins(EInputPluginFilter, aListBuffer); + } + return KErrNone; + } + + +/** +Function to retrieve the Active plugin name +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::GetActiveOutputPlugin(RArray& aListBuffer) + { + TInt errCode = GetValues(KActiveSection,aListBuffer); + //plugins are received as, e.g. '1 uloggerfileplugin' (.ini file syntax) + //we have to remove number from array + for(TInt i=0; iDeActivateOutputPlugin(aPluginname); + return ret; +} + +/** +Function to retrieve the Active control plugin name +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::GetActiveInputPlugin(RArray& aListBuffer) + { + return GetValues(KActiveControlSection,aListBuffer); + } + +/** +Function to Deactivate active control plugin +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::DeActivateInputPlugin(const TDesC8& aPluginname) + { + return iConfigManager->DeActivateInputPlugin(aPluginname); + } + +/** +Function to run ULogger server as service, i.e. to keep it constantly running +(but not necessarily logging) in the background, or to stop it being run as a +service (if EFalse is passed). + +@param aRunAsService ETrue to start, EFalse to stop running as service +*/ +void CULoggerServer::RunAsService(TBool /*aRunAsService*/) + { +// +// // Uncomment following to implement run-as-service functionality +// +// iRunAsService = aRunAsService; +// +// if (!aRunAsService) +// { +// //make sure server is stopped if there are no sessions +// IncrementSessions(); +// DecrementSessions(); +// } + } + +/** +Function to cd.. ulogger server +This should leave with KErrNotFound if cannot find one or any system wide error codes +*/ +TInt CULoggerServer::Start() + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __MARK_METHOD("CULoggerServer::Start") + #endif + + TRAPD(error, InitializeFrameworksL()); + + //check errors + if(error != KErrNone) + return error; + if(!iOutputFramework) + return KErrNotReady; + if(iBtraceOpen) + return KErrInUse; + + TPtrC8 key; + TPtrC8 val; + TInt buffermode=0; + RArray settings; + RArray activefilters; + //checking if there is at least one active channel + error = GetActiveOutputPlugin(settings); + if(error != KErrNone) + return error; + if(settings.Count()==0) + { + return KErrNotFound; //active output plug-in not found + } + + if(iBtraceOpen == EFalse) + { + if(iIsBooting) + error = TraceSettingsOnBoot(); + else + error = iTrace.Open(); + + if(error == KErrNone) + { + //----Reset the notification size + TRAP_IGNORE(error=GetBufandDataNotifyValuesL(KDataNotification,iDataNotification)); + if(error!=KErrNone) + return error; + TRAP_IGNORE(error=GetBufandDataNotifyValuesL(KBuffer,iBufferSize)); + if(error!=KErrNone) + return error; + + //----Reset BTrace filters + ResetBtracePrimaryFilters(iTrace); + + //----Resize the trace buffer + error = iTrace.ResizeBuffer(iBufferSize*1024); + if(error == KErrNoMemory) + { + error = iTrace.ResizeBuffer(KMinBufferMTPLE*1024); + } + if(error != KErrNone) + return error; + //----Reset the buffer mode + TRAP_IGNORE(GetBufandDataNotifyValuesL(KBufferMode,buffermode)); + if(buffermode==ECircularBuffer) + { + iTrace.SetMode(RBTrace::EFreeRunning|RBTrace::EEnable); + } + else + { + iTrace.SetMode(RBTrace::EEnable); + } + + //----Enable/disable primary filter + error = GetActiveFilters(activefilters,EPrimaryFilter); + if(error != KErrNone) + return error; + for(TInt i=0; iStartReading(); //start waiting for remote commands + AsynchDataRequest(); + } + } + else + error = KErrInUse; + + return error; + } + +/** +Close the BTrace handle to the buffer +@return none +*/ +TInt CULoggerServer::Stop() +{ + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __MARK_METHOD("CULoggerServer::Stop") + #endif + + if(iBtraceOpen) + { + TInt errCode = KErrNone; + TRAP(errCode, ReadBufferL()); //flush the BTrace buffer + + ResetBtracePrimaryFilters(iTrace);//reset BTrace filters + + iTrace.CancelRequestData(); + iTrace.Empty(); + iTrace.Close(); + iBtraceOpen = EFalse; + iDataWatcher->Cancel(); + + //stop waiting/reading for remote commands + iInputFramework->StopReading(); + iOutputFramework->ReleaseOutputResources(); + return KErrNone; + } + else + { + return KErrNotReady; + } + +} + +/** +Gets the Trace settings on boot +@return none +*/ +TInt CULoggerServer::TraceSettingsOnBoot() +{ + + TInt trace = FALSE; + + RArray category; + TInt error = iTrace.Open(); + if(error != KErrNone) + return error; + + TInt bufferSize = iTrace.BufferSize(); //To get the buffer size set at boot + if(bufferSize <= 0 && bufferSize > KMaxBufferSize) + SetBufferSize(KMaxBufferSize); //Update config + else + SetBufferSize(bufferSize); //Update config + for(TUint i=0; iSetActiveFilter(category,KPrimaryFilterSection); + category.Close(); + iIsBooting=0; + return error; +} + + + +/** +Reads the BTrace buffer and transfers the collected logs to +the ACTIVE channel +*/ +void CULoggerServer::ReadBufferL() + { + if(iBtraceOpen) + { + TUint8* data; + TInt dataSize; + //TUint oldMode = iTrace.Mode(); + //iTrace.SetMode(0); // turn off trace capture while we dump + dataSize = iTrace.GetData(data); + if(dataSize > 0) + { + + TPtrC8 dataPtr(data, dataSize); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__PERFORMANCE_TEST) + __LOGTIMESTAMP_HIRES("Passing data to output framework - t2") //performance test + #endif + + //send data through output channel + TInt error = KErrNone; + if((error = iOutputFramework->SendData(dataPtr)) == KErrNone) + iTrace.DataUsed(); //only if data was really sent via output plugin + else + User::Leave(error); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__PERFORMANCE_TEST) + __LOGTIMESTAMP_HIRES("Data logged - t3") //performance test + #endif + } + //iTrace.SetMode(oldMode); + + AsynchDataRequest(); + } + } + + +void CULoggerServer::AsynchDataRequest() + { + if(!iDataWatcher->IsActive()) + { + iTrace.RequestData(iDataWatcher->GetStatus(), iDataNotification*1024); + iDataWatcher->StartWatching(this); + } + } + + +void CULoggerServer::DataNotification() +{ + TRAPD(e, ReadBufferL()); + if(e != KErrNone) + AsynchDataRequest(); +} + + +void CULoggerServer::GetPluginAndSettingsL(TDes8& aPluginName, RPointerArray* aSettings, TPluginFilter aPluginFilter) + { + TPtrC8 key; + TPtrC8 val; + RArray activePluginsArray; + RArray pluginsArray; + RArray pluginSettings; + TInt i,j; + + if(aPluginFilter == EOutputPluginFilter) + GetActiveOutputPlugin(activePluginsArray); //get output plugin + else + GetActiveInputPlugin(activePluginsArray); //get control plugin + + for(i=0; i activeplugin; + activeplugin.Copy(activePluginsArray[i]); + activeplugin.LowerCase(); + + GetInstalledOutputPlugins(pluginsArray); + for(j=0;j plugin; + plugin.Copy(pluginsArray[j]); + plugin.LowerCase(); + + if(activeplugin.Compare(plugin)==0) + { + break; + } + } + aPluginName.Copy(activePluginsArray[i]); + GetOptionsSettingsL(aPluginName,pluginSettings); + j=0; + while(j < pluginSettings.Count()) + { + TPluginConfiguration* keyAndVal = new TPluginConfiguration(); + keyAndVal->SetKey(pluginSettings[j]); + keyAndVal->SetValue(pluginSettings[j+1]); + aSettings->AppendL(keyAndVal); + j=j+2; + } + } + } + + +void CULoggerServer::InitializeFrameworksL() + { + // + //output settings + RBuf8 outPluginName; + outPluginName.Create(KMaxPluginName); + RPointerArray outputPluginSettings; + GetPluginAndSettingsL(outPluginName, &outputPluginSettings, EOutputPluginFilter); + + //control settings + RBuf8 inputPluginName; + inputPluginName.Create(KMaxPluginName); + RPointerArray inputPluginSettings; + this->GetPluginAndSettingsL(inputPluginName, &inputPluginSettings, EInputPluginFilter); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("before creating CPluginAllocator") + #endif + + //create plugin allocator (plugins) + if(!iPluginAllocator) + iPluginAllocator = CPluginAllocator::NewL(outPluginName, inputPluginName); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("before creating COutputFramework") + #endif + //Initialize output framework + if(!iOutputFramework) + iOutputFramework = COutputFramework::NewL(*(iPluginAllocator->GetOutputPlugin()), outputPluginSettings); + + //Initialize Control Framework + if(!iInputFramework) + iInputFramework = CInputFramework::NewL(iPluginAllocator->GetInputPlugin(), inputPluginSettings, this); + + //cleanup + outPluginName.Close(); + outputPluginSettings.ResetAndDestroy(); + outputPluginSettings.Close(); + inputPluginName.Close(); + inputPluginSettings.ResetAndDestroy(); + inputPluginSettings.Close(); + + iDataWatcher = CULoggerWatcher::NewL(); + } + + +void CULoggerServer::PrepareControlDataPayloadL(RBuf8& aPayloadBuf, const RArray& aArray) + { + aPayloadBuf.Create(aArray.Count()*32); + for(TInt i=0; i& aArray) + { + aPayloadBuf.Create(aArray.Count()*4); + for(TInt i=0; i b; + b.Num(aArray[i]); + if(aPayloadBuf.MaxSize() < aPayloadBuf.Length()+b.Length()) + aPayloadBuf.ReAllocL(aPayloadBuf.Length()+(b.Length()*10)); + aPayloadBuf.Append(b); + if(i < aArray.Count()-1) //skip last sparator as it will be added automatically + aPayloadBuf.Append(DATA_SEPARATOR); + } + } + + +TInt CULoggerServer::RestartOutputting() + { + TInt err=KErrNone; + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __MARK_METHOD("CULoggerServer::ForceRefreshSettingsL") + #endif + if(iBtraceOpen != EFalse) + { + err = Stop(); + iBtraceOpen = EFalse; + } + + if(iDataWatcher) + { + iDataWatcher->Cancel(); + delete iDataWatcher; + iDataWatcher = NULL; + } + if(iOutputFramework) + { + delete iOutputFramework; + iOutputFramework = NULL; + } + if(iInputFramework) + { + delete iInputFramework; + iInputFramework = NULL; + } + if(iPluginAllocator) + { + delete iPluginAllocator; + iPluginAllocator = NULL; + } + if(iConfigManager) + { + iConfigManager->RefreshConfigFiles(); + } + + err = Start(); //always start + return err; + } + + +TInt CULoggerServer::ResetBtracePrimaryFilters(RBTrace &aBTrace) + { + for(TUint i=0; i<256; i++) + aBTrace.SetFilter(i, EFalse); + aBTrace.SetFilter2(0); + return KErrNone; + } + +//This bit should be part of the input framework, or it should reuse the other methods better +ControlData* CULoggerServer::ProcessCommandL(TCommand aOpCode, RArray &aArguments) + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __MARK_METHOD("CULoggerServer::ProcessCommand") + #endif + + TInt errCode = KErrNone; + TInt minSize = 8; + CInputData *inputData = new (ELeave) CInputData(minSize); + ControlData* data = NULL; + RBuf8 payloadBuf; + TBuf8<32> result; + + switch(aOpCode) + { + case EStart: + { + if(!ServerState()) + errCode = this->Start(); + else + errCode = KErrInUse; + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EStop: + { + //ulogger shouldn't be restarted here as we must send acknowledgment back to PC + //Stop will be done in DoPostProcessing method after sending ack. + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case ESetPrimaryFilter: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetPrimaryFilter") + #endif + + RArray filterArray; + + errCode = KErrNone; + //process parameters + TInt i; + for(i=0; iCreatePackage((void*)result.Ptr(), result.Length()); + /* + payloadBuf.Create(128); + payloadBuf.Copy(aArguments[i]); + inputData->AppendNewData(ack, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + */ + filterArray.Close(); + break; + } + filterArray.AppendL(val); + } + + if(errCode == KErrNone) + { + errCode = SetActiveFilter(filterArray, EPrimaryFilter); + result.Num(errCode); + + //create acknowledment + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + //create string as a payload + /* + payloadBuf.Create(dupfilterArray.Count()*4); + for(i=0; i b; + b.Num(dupfilterArray[i]); + if(payloadBuf.MaxSize() < payloadBuf.Length()+b.Length()) + payloadBuf.ReAllocL(payloadBuf.Length()+(b.Length()*10)); + payloadBuf.Append(b); + if(i < dupfilterArray.Count()-1) //skip last sparator as it will be added automatically + payloadBuf.Append(DATA_SEPARATOR); + } + if(payloadBuf.Length() > 0) + inputData->AppendNewData(ack, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + */ + filterArray.Close(); + } + } + break; //ESetPrimaryFilter + + case ESetSecondaryFilter: + { + RArray filterArray; + //process parameters + TInt i; + for(i=0; iCreatePackage((void*)result.Ptr(), result.Length()); + /* + payloadBuf.Create(128); + payloadBuf.Copy(aArguments[i]); + man->AppendNewData(ack, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + */ + filterArray.Close(); + break; + } + filterArray.AppendL(val); + } + if(errCode != KErrNone) + break; + + //create ack + errCode = SetActiveFilter(filterArray, ESecondaryFilter); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + filterArray.Close(); + } + break; //ESetSecondaryFilter + + case EEnableSecondaryFiltering: + { + errCode = SetSecondaryFiltering(KEnable); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EDisableSecondaryFiltering: + { + errCode = SetSecondaryFiltering(KDisable); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EResizeTraceBuffer: + { + if(aArguments.Count() > 0) + { + TInt bufSize; + TLex8 lex(aArguments[0]); + if((errCode = lex.Val(bufSize)) == KErrNone) + errCode = SetBufferSize(bufSize); + } + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case ESetBufferMode: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetBufferMode") + #endif + + if(aArguments.Count() > 0) + { + if(aArguments[0].Compare(KCircular)==0) + errCode = SetBufferMode(KCircular); + else if(aArguments[0].Compare(KStraight)==0) + errCode = SetBufferMode(KStraight); + else + errCode = KErrArgument; + } + else + errCode = KErrArgument; + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("errCode") + __LOGNUM(errCode) + #endif + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case ESetDataNotificationSize: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetDataNotificationSize") + #endif + + if(aArguments.Count() > 0) + { + TInt dns; + TLex8 lex(aArguments[0]); + if((errCode = lex.Val(dns)) == KErrNone) + errCode = SetDataNotificationSize(dns); + else + errCode = KErrArgument; + } + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case ERemovePluginSettings: + { + if(aArguments.Count() > 0) + errCode = RemovePluginSettingsL(aArguments[0]); + else + errCode = KErrArgument; + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EGetInstalledPlugins: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetInstalledOutputPlugins") + #endif + + RArray tmpArray; + errCode = GetInstalledOutputPlugins(tmpArray); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + for(TInt p=0; p 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + } + break; //EGetInstalledOutputPlugins + + case EGetActivePlugin: //output + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetActivePlugin") + #endif + + RArray tmpArray; + errCode = GetActiveOutputPlugin(tmpArray); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + for(TInt p=0; p 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + } + break; //EGetActivePlugin + + case EGetPluginSettings: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetPluginSettings") + #endif + RArray tmpArray; + if(aArguments.Count() > 0) + { + errCode = GetOptionsSettingsL(aArguments[0],tmpArray); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + for(TInt p=0; pCreatePackage((void*)result.Ptr(), result.Length()); + //create payload + PrepareControlDataPayloadL(payloadBuf, tmpArray); + //add playload in control data chunk + if(payloadBuf.Length() > 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + } + break; //EGetPluginSettings + + case EGetPrimaryFilters: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetPluginSettings") + #endif + + RArray tmpArray; + errCode = GetActiveFilters(tmpArray,EPrimaryFilter); + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + for(TInt p=0; p 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + tmpArray.Close(); + + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetPluginSettings - test 2") + #endif + } + break; //EGetPrimaryFilters + + case EGetSecondaryFilters: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetSecondaryFilters") + #endif + + TBool skipReadingFilters = EFalse; + RArray tmpArrayTxt; + TBool enabled = EFalse; + errCode = errCode = this->GetSecondaryFiltering(enabled); + if(errCode == KErrNone) + { + if(EFalse == enabled) + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + skipReadingFilters = ETrue; + //create payload + PrepareControlDataPayloadL(payloadBuf, tmpArrayTxt); + if(payloadBuf.Length() > 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + } + } + + RArray tmpArray; + if(!skipReadingFilters) + { + errCode = this->GetActiveFilters(tmpArray,ESecondaryFilter); + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + //create payload + PrepareControlDataPayloadL(payloadBuf, tmpArray); + if(payloadBuf.Length() > 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + } + + tmpArrayTxt.Close(); + tmpArray.Close(); + } + break; //EGetSecondaryFilters + + case EGetSecondaryFiltering: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetSecondaryFiltering") + #endif + + TBool enabled = EFalse; + errCode = GetSecondaryFiltering(enabled); + if(errCode == KErrNone) + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + //create payload + TBuf8<32> b; + b.Num(enabled); + inputData->AppendNewData(data, (const void*)b.Ptr(), b.Length()); + } + else + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + } + break; //EGetSecondaryFiltering + + //this functionality is removed now + /* + case ESetSecondaryFilterCurrent: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetSecondaryFilterCurrent") + #endif + + errCode = this->SetSecondaryFiltering(KCurrent); + result.Num(errCode); + ack = man->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; //ESetSecondaryFilterCurrent + */ + case EGetTraceBufferSize: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetTraceBufferSize") + #endif + + TInt bufferSize = 0; + errCode = GetBufandDataNotifyValuesL(KBuffer,bufferSize); + if(errCode == KErrNone) + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + TBuf8<32> b; + b.Num(bufferSize); + inputData->AppendNewData(data, (const void*)b.Ptr(), b.Length()); + } + else + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + } + break; //EGetTraceBufferSize + + case EGetBufferMode: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetBufferMode") + #endif + + TInt bufferMode = 3; + errCode = GetBufandDataNotifyValuesL(KBufferMode,bufferMode); + if(errCode == KErrNone) + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + result.Zero(); + if(bufferMode == 0) + result.Append(KCircular); + else if(bufferMode == 1) + result.Append(KStraight); + else + result.Append(_L8("Invalid mode")); + + inputData->AppendNewData(data, (const void*)result.Ptr(), result.Length()); + } + else + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + } + break; //EGetBufferMode + + case EGetDataNotificationSize: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetDataNotificationSize") + #endif + + TInt dataNotification = 0; + errCode = GetBufandDataNotifyValuesL(KDataNotification,dataNotification); + if(errCode == KErrNone) + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + TBuf8<32> b; + b.Num(dataNotification); + inputData->AppendNewData(data, (const void*)b.Ptr(), b.Length()); + } + else + { + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + } + break; //EGetDataNotificationSize + + case ERemovePrimaryFilter: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ERemovePrimaryFilter") + for(TInt k=0; k 0) + { + RArray filterArray; + for(TInt i=0; iCreatePackage((void*)result.Ptr(), result.Length()); + } + break; //ERemovePrimaryFilter + + case ERemoveSecondaryFilter: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EDisableMultipleModuleUids") + for(TInt k=0; k 0) + { + RArray filterArray; + for(TInt i=0; iCreatePackage((void*)result.Ptr(), result.Length()); + } + break; //ERemoveSecondaryFilter + + case ESetPluginSettings: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetPluginSettings") + #endif + + if(aArguments.Count() > 2) + { + TBuf8<128> plugin; + plugin.Copy(aArguments[0]); + aArguments.Remove(0); + errCode = SetPluginSettings(plugin, aArguments); + } + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; //ESetChannelSettings + + case ESetActivePlugin: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ESetActiveOutputPlugin") + #endif + + if(aArguments.Count() > 0) + errCode = SetActiveOutputPlugin(aArguments[0]); + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; //ESetActiveOutputPlugin + + case ESetActiveInputPlugin: + { + if(aArguments.Count() > 0) + errCode = SetActiveInputPlugin(aArguments[0]); + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EDeactivateInputPlugin: + { + if(aArguments.Count() > 0) + errCode = DeActivateInputPlugin(aArguments[0]); + else + errCode = KErrArgument; + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + case EGetActiveInputPlugin: + { + RArray tmpArray; + errCode = GetActiveInputPlugin(tmpArray); + result.Num(errCode); + + //remove ini specific data (number) + //example (1 uloggerusbplugin) must look like (uloggerusbplugin) + TInt i=0; + while(iCreatePackage((void*)result.Ptr(), result.Length()); + PrepareControlDataPayloadL(payloadBuf, tmpArray); + if(payloadBuf.Length() > 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + tmpArray.Close(); + } + break; + + case EGetInputPlugins: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("EGetControlPlugins") + #endif + + RArray tmpArray; + errCode = GetInstalledInputPlugins(tmpArray); + + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + + //create payload + PrepareControlDataPayloadL(payloadBuf, tmpArray); + //add playload to control data chunk + if(payloadBuf.Length() > 0) + inputData->AppendNewData(data, (const void*)payloadBuf.Ptr(), payloadBuf.Length()); + tmpArray.Close(); + } + break; + + case ERestart: + { + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("ERestartOutputting") + #endif + + //ulogger shouldn't be restarted here as we must send acknowledgment back to PC + //restart will be done in DoPostProcessing method after sending ack. + result.Num(errCode); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + } + break; + + default: + #if defined(__LIGHTLOGGER_ENABLED) && defined(__VERBOSE_MODE) + __LOG("input command not supported") + #endif + + result.Num(KErrNotSupported); + data = inputData->CreatePackage((void*)result.Ptr(), result.Length()); + break; + }//end of switch + + + //cleanup + if(inputData) + { + delete inputData; + inputData = NULL; + } + payloadBuf.Close(); + + return data; + } + + + +void CULoggerServer::DoPostProcessing(TCommand aCmd) + { + switch(aCmd) + { + case EStop: + Stop(); + break; + case ERestart: + RestartOutputting(); + break; + default: + break; + } + } + +/** +This function checks if array of given names contains any of real plugin names (either output of input). +After call aPluginList will be filtered to contain only proper plugin names (strings that really could be used +to refer to a real plugin. +@param aFilter Either EOutputPluginFilter or EInputPluginFilter. +@param aPluginList Reference to an array which contain list of names that function has to check. + */ +void CULoggerServer::FilterPlugins(TPluginFilter aFilter, RArray& aPluginList) + { + TInt errCode = 0; + CPlugin::TPluginInterface interfaceId; + //assign filter value + aFilter==EOutputPluginFilter ? interfaceId=MOutputPlugin::iInterfaceId : interfaceId=MInputPlugin::iInterfaceId; + + //filter plugins + TInt i=0; + while(iGetInterfaceL(interfaceId)); + if(!ptr || errCode!=KErrNone) + { + aPluginList.Remove(i--); + } + //cleanup + if(plugin) + { + delete plugin; + plugin = NULL; + } + } + ++i; + } + } + + + +TBool CULoggerServer::ServerState() + { + return iBtraceOpen; + } + + +TBool CULoggerServer::CheckPluginExists(TPtrC8& aPluginName, TPluginFilter aPluginFilter) + { + RArray pluginsArray; + if(aPluginFilter == EOutputPluginFilter) + GetInstalledOutputPlugins(pluginsArray); + else if(aPluginFilter == EInputPluginFilter) + GetInstalledInputPlugins(pluginsArray); + + for(TInt i=0; i