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