traceservices/tracefw/ulogger/src/sysconfig/uloggersysconfig.cpp
changeset 0 08ec8eefde2f
child 23 26645d81f48d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/traceservices/tracefw/ulogger/src/sysconfig/uloggersysconfig.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,543 @@
+// 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 "uloggersysconfig.h"
+#include "sysconfigimpl.h"
+#include "uloggershared.h"
+#include <e32base.h>		 
+
+
+namespace Ulogger
+{
+	
+/** Creates a sysconfig settings iterator object
+@return a pointer to the created object
+@leave KErrNoMemory if not enough memory available
+*/
+EXPORT_C CConfigSettingsIter* CConfigSettingsIter::NewL()
+	{
+	CConfigSettingsIter* self=new (ELeave)CConfigSettingsIter();
+	CleanupStack::PushL(self);
+	self->iImpl=CConfigSettingsImpl::NewL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+/**
+A function to loop through the settings in the system config
+and return the setting and its value through the passed in pointer
+@param aSetting a pointer to the buffered setting name
+@param aSettingValue a pointer to the buffered setting value
+@return ETrue if there are more setting
+        EFalse if the iterator is at end of settings
+		Other system wide errors
+@post the iterator now points to the next setting
+*/	
+EXPORT_C TBool CConfigSettingsIter::Next(TPtrC8& aSetting,TPtrC8& aSettingValue)
+	{
+	return iImpl->Next(aSetting,aSettingValue);
+	}
+
+/**
+Reset the iterator to point to the first setting
+@post the iterator now points to the first setting
+*/	
+EXPORT_C void CConfigSettingsIter::Reset()
+	{
+	return iImpl->Reset();
+	}
+
+/**
+Public Destructor
+*/	
+EXPORT_C CConfigSettingsIter::~CConfigSettingsIter()
+	{
+	delete iImpl;
+	}
+
+CConfigSettingsIter::CConfigSettingsIter(){}
+
+////////////////////////////////////////////////////////////////////////////
+
+/**
+Create a pointer to a CConfig object initialised with the current
+configuration settings for the system wide framework.
+
+Therefore it allocates and manages memory to store these settings.
+If the client has a requirement to use a private heap then a reference to it
+must be supplied should the notification funtionality be required 
+as this will result in the settings being reloaded and hence memory
+will need to be reallocated.
+Clients with this requirement will need to ensure heaps are switch to ensure
+the CConfig object is itself allocated on the correct heap.
+
+@param aHeap a pointer to a private heap location
+@param aFilename name of the configuration file with full path
+@return a pointer to the new CConfig object
+*/
+EXPORT_C CConfig* CConfig::NewL(RHeap* aHeap,TFileName& aFilename)
+	{
+	CConfig* self= new(ELeave) CConfig();
+	CleanupStack::PushL(self);
+	self->iImpl=CConfigImpl::NewL(aHeap,aFilename);
+	CleanupStack::Pop();
+	return self;
+	}
+
+/**
+Create a pointer to a CConfig object initialised with the current
+configuration settings for the system wide framework. Places object
+on the Cleanup stack.
+
+Therefore it allocates and manages memory to store these settings.
+If the client has a requirement to use a private heap then a reference to it
+must be supplied should the notification funtionality be required 
+as this will result in the settings being reloaded and hence memory
+will need to be reallocated.
+Clients with this requirement will need to ensure heaps are switch to ensure
+the CConfig object is itself allocated on the correct heap.
+
+@param aHeap a pointer to a private heap location
+@param aFilename name of the configuration file with full path
+@return a pointer to the new CConfig object
+*/
+EXPORT_C CConfig* CConfig::NewLC(RHeap* aHeap,TFileName& aFilename)
+	{
+	CConfig* self=CConfig::NewL(aHeap,aFilename);
+	CleanupStack::PushL(self);
+	return self;
+	}
+
+
+/**
+Create and initialize a setting iterator to the list of output
+channels
+@param aIter reference to the setting iterator object
+@return KErrNone if no error
+        Other system wide errors
+*/
+EXPORT_C TInt CConfig::GetOutputPlugins(CConfigSettingsIter& aIter)
+	{
+	return iImpl->GetSection(KActiveSection,aIter);
+	}	
+
+
+EXPORT_C TInt CConfig::GetActivePlugins(CConfigSettingsIter& aIter)
+	{
+	return iImpl->GetSection(KActiveControlSection,aIter);
+	}	
+
+
+/**
+Create and initialize a setting iterator to the list filters
+@param aIter reference to the setting iterator object
+@return KErrNone if no error
+        Other system wide errors
+*/
+EXPORT_C TInt CConfig::GetActiveFilters(CConfigSettingsIter& aIter,TInt aFilter)
+	{
+	if(aFilter == 1)
+		return iImpl->GetSection(KPrimaryFilterSection,aIter);
+	else if(aFilter == 2)
+		return iImpl->GetSection(KSecondaryFilterSection,aIter);
+	else
+		return KErrNone;
+	}
+	
+EXPORT_C TInt CConfig::GetSectionValues(const TDesC8& aSectionName,CConfigSettingsIter& aIter)
+	{
+		return iImpl->GetSection(aSectionName,aIter);
+	}	
+	
+	
+/**
+Removes output channel setting section from the configuration file
+@param aOutputChanId the plugin name which has to be removed
+@return KErrNone if no error, 
+        KErrNotFound if output channel setting section does not exist
+		Other System wide errors
+*/
+EXPORT_C TInt CConfig::RemovePluginSettings(const TDesC8& aChanId)
+	{
+	//
+	// NEW CODE:
+	//
+
+	CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+	CleanupStack::PushL(iter);
+
+	TInt ret = iImpl->GetSection(aChanId, *iter);
+
+	if (KErrNone == ret)
+		{
+		TPtrC8 key;
+		TPtrC8 dummy;
+
+		//remove all keys from section aChanId
+		while(iter->Next(key, dummy))
+			{
+			iImpl->RemoveKey(aChanId, key);
+			iter->Reset(); // otherwise we'd be skipping every 2nd element!
+			}
+
+		//remove section
+		iImpl->RemoveSection(aChanId);
+			//finally write into ini file
+			ret = iImpl->PersistIniFile();
+		}
+
+	CleanupStack::PopAndDestroy(iter);
+
+	return ret;
+	}
+
+/**
+Set a particular channel id settings, create one if settings does not exist yet
+@param aOutputChanId the channel id
+@param aSetting the channel setting to modify or add
+@param aValue the value to assign to this setting
+@return KErrNone if no error, 
+        KErrNotFound if no matching output id
+		Other System wide errors
+*/
+EXPORT_C TInt CConfig::SetPluginSetting(const TDesC8& aChanId,const TDesC8& aSetting,const TDesC8& aValue)
+	{
+	TInt ret = iImpl->SetKeyValue(aChanId,aSetting,aValue);
+
+	if (KErrNone == ret)
+		{
+		//finally write into ini file
+		ret = iImpl->PersistIniFile();
+		}
+
+	return ret;
+	}
+
+/**
+Register Active Plugin
+An internal active name that maps to this plugin is generated internally
+@param aPluginName the plugin to be added to the system.
+@param aMediaName pointer to the internal media name
+@return KErrNone if no error
+        KErrAlreadyExists if the plugin name already exists
+		Other system wide errors
+*/
+EXPORT_C TInt CConfig::SetActiveOutputPlugin(const TDesC8& aMediaName)
+	{
+	//first check whether plugin already registered
+	TPtrC8 key;
+	TPtrC8 val;
+	TPtrC8 aMedia;
+	
+	TInt keyCount=0;
+	TInt ret=iImpl->CheckValueExist(KActiveSection,aMediaName,keyCount);
+	if(ret == KErrAlreadyExists)
+		return ret;
+	if ((ret==KErrNone && keyCount))
+	{			
+		CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+		CleanupStack::PushL(iter);
+		GetOutputPlugins(*iter);
+		while(iter->Next(val,key))
+		{
+			ret=iImpl->RemoveKey(KActiveSection,val);	
+		}
+		CleanupStack::PopAndDestroy();		
+	}
+	
+	//get the internally generated name
+	TBuf8<15> internalName;
+	ret=iImpl->GenerateInternalKey(KActiveSection,internalName);
+	if (ret!=KErrNone)
+		return ret;		
+	
+	ret=iImpl->SetKeyValue(KActiveSection,internalName,aMediaName);
+	if (ret!=KErrNone)
+		return ret;
+	
+	ret= iImpl->GetPointerToKeyName(KActiveSection,internalName,aMedia);
+	if (ret!=KErrNone)
+		return ret;
+	
+	//finally write into ini file
+	return iImpl->PersistIniFile();
+	}
+
+
+EXPORT_C TInt CConfig::SetActiveInputPlugin(const TDesC8& aMediaName)
+	{
+	//first check whether plugin already registered
+	TPtrC8 key;
+	TPtrC8 val;
+	TPtrC8 aMedia;
+	
+	TInt keyCount=0;
+	TInt ret=iImpl->CheckValueExist(KActiveControlSection,aMediaName,keyCount);
+	if(ret == KErrAlreadyExists)
+		return ret;
+	if ((ret==KErrNone && keyCount))
+	{			
+		CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+		CleanupStack::PushL(iter);
+		GetActivePlugins(*iter);
+		while(iter->Next(val,key))
+		{
+			ret=iImpl->RemoveKey(KActiveControlSection,val);	
+		}
+		CleanupStack::PopAndDestroy();		
+	}
+	
+	//get the internally generated name
+	TBuf8<15> internalName;
+	ret=iImpl->GenerateInternalKey(KActiveControlSection,internalName);
+	if (ret!=KErrNone)
+		return ret;		
+	
+	ret=iImpl->SetKeyValue(KActiveControlSection,internalName,aMediaName);
+	if (ret!=KErrNone)
+		return ret;
+	
+	ret= iImpl->GetPointerToKeyName(KActiveControlSection,internalName,aMedia);
+	if (ret!=KErrNone)
+		return ret;
+	
+	//finally write into ini file
+	return iImpl->PersistIniFile();
+	}
+
+
+EXPORT_C TInt CConfig::DeActivateOutputPlugin(const TDesC8& aMediaName)
+	{
+	TPtrC8 key;
+	TPtrC8 val;
+	TPtrC8 aMedia;
+	
+	TInt keyCount=0;
+	TInt ret=iImpl->CheckValueExist(KActiveSection,aMediaName,keyCount);
+	if(ret==KErrNone)
+		return KErrNotFound;
+	else if (ret==KErrAlreadyExists)
+		{			
+		CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+		CleanupStack::PushL(iter);
+		User::LeaveIfError(GetOutputPlugins(*iter));
+		while(iter->Next(val,key))
+			{
+			ret=iImpl->RemoveKey(KActiveSection,val);	
+			}
+		CleanupStack::PopAndDestroy();		
+		}
+	if(ret!=KErrNone)
+		return ret;
+	return iImpl->PersistIniFile();
+	}
+
+
+EXPORT_C TInt CConfig::DeActivateInputPlugin(const TDesC8& aMediaName)
+	{
+	TPtrC8 key;
+	TPtrC8 val;
+	TPtrC8 aMedia;
+	
+	TInt keyCount=0;
+	TInt ret=iImpl->CheckValueExist(KActiveControlSection,aMediaName,keyCount);
+	if(ret==KErrNone)
+		return KErrNotFound;
+	else if (ret==KErrAlreadyExists)
+		{			
+		CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+		CleanupStack::PushL(iter);
+		TInt a = GetActivePlugins(*iter);
+		if(a != KErrNone)
+			return a;
+		while(iter->Next(val,key))
+			{
+			ret=iImpl->RemoveKey(KActiveControlSection,val);	
+			}
+		CleanupStack::PopAndDestroy();		
+		}
+	if(ret!=KErrNone)
+		return ret;
+	return iImpl->PersistIniFile();
+	}
+
+
+EXPORT_C TInt CConfig::SetActiveFilter(const RArray<TUint32>&  aFilter, const TDesC8 &aSectionName)
+{
+	TInt error = KErrNone;  
+	
+	for(TInt i = 0; i < aFilter.Count(); i++)
+		{
+		//copy the filter as a string
+		HBufC8* filter = HBufC8::NewLC(32);
+		filter->Des().Num(aFilter[i]);
+		TPtr8 filterPtr(filter->Des());
+		TInt keycount = 0;
+		//check if the section exists
+		error = iImpl->CheckValueExist(aSectionName, filterPtr, keycount);
+		if (!error)//either the section or the value didn't exist
+			{
+			TBuf8<15> internalName;
+			error = iImpl->GenerateInternalKey(aSectionName, internalName);
+			if(!error)
+				error = iImpl->SetKeyValue(aSectionName,internalName,filterPtr);
+			}
+		if(error == KErrAlreadyExists) //ignore these
+			error = KErrNone;
+		CleanupStack::PopAndDestroy();//filter			
+		if(error)
+			break;
+		}
+	//finally write into ini file
+	iImpl->PersistIniFile();
+	return error; 
+}
+
+EXPORT_C TInt CConfig:: SetTraceSettings(const TDesC8&  aValue, const TDesC8&  aSetting)
+{	
+	TPtrC8 aMedia;
+	TPtrC8 value;
+	//get the internally generated name
+	
+	TInt ret;
+	if(aSetting.Compare(KBuffer) == 0)	
+	{
+		ret=iImpl->SetKeyValue(KTrace,KBuffer,aValue);
+		if (ret!=KErrNone)
+			return ret;
+		
+		ret= iImpl->GetPointerToKeyName(KTrace,KBuffer,aMedia);
+		if (ret!=KErrNone)
+			return ret;	
+	}
+	else if(aSetting.Compare(KSecondaryGlobalFilter) == 0)		
+	{
+		iImpl->GetKeyValue(KTrace,KSecondaryGlobalFilter,value);
+		if(value.Compare(aValue)==0)
+			return KErrNone;
+		else
+			{
+			ret=iImpl->SetKeyValue(KTrace,KSecondaryGlobalFilter,aValue);
+			if (ret!=KErrNone)
+				return ret;
+		
+			ret= iImpl->GetPointerToKeyName(KTrace,KSecondaryGlobalFilter,aMedia);
+			if (ret!=KErrNone)
+				return ret;	
+			}
+	}
+	else if(aSetting.Compare(KDataNotification) == 0)		
+	{
+		ret=iImpl->SetKeyValue(KTrace,KDataNotification,aValue);
+		if (ret!=KErrNone)
+			return ret;
+		
+		ret= iImpl->GetPointerToKeyName(KTrace,KDataNotification,aMedia);
+		if (ret!=KErrNone)
+			return ret;	
+	}
+	else if(aSetting.Compare(KBufferMode) == 0)		
+	{
+		ret=iImpl->SetKeyValue(KTrace,KBufferMode,aValue);
+		if (ret!=KErrNone)
+			return ret;
+		
+		ret= iImpl->GetPointerToKeyName(KTrace,KBufferMode,aMedia);
+		if (ret!=KErrNone)
+			return ret;	
+	}
+	else 
+		return KErrNotFound;
+	
+	
+	//finally write into ini file
+	return iImpl->PersistIniFile();
+		
+}
+
+
+
+EXPORT_C TInt CConfig:: GetTraceSettings(CConfigSettingsIter& aIter)
+	{
+	return iImpl->GetSection(KTrace,aIter);
+	}	
+
+/**
+Remove a Filter based on its internal media name. It will fail if
+any of this media is still referenced by one of the output channel
+@param aMediaName the internal media name of the plugin to be removed
+@return KErrNone if no error
+        KErrNotFound if no matching media name
+        KErrAccessDenied if still referenced by one of the output channel
+*/
+
+EXPORT_C TInt CConfig::RemoveActiveFilter(const RArray<TUint32>&  aFilter, const TInt &aFilterValue)
+{
+	TPtrC8 sectionName;
+	TPtrC8 val;
+	TPtrC8 key;
+	TInt ret = KErrNotFound;
+	
+	if(aFilterValue == 1)
+		sectionName.Set(KPrimaryFilterSection());
+	else if(aFilterValue == 2)
+		sectionName.Set(KSecondaryFilterSection());
+	
+	CConfigSettingsIter* iter = CConfigSettingsIter::NewL();
+	CleanupStack::PushL(iter);
+	GetActiveFilters(*iter, aFilterValue);
+	
+	for(TInt i=0; i<aFilter.Count();i++)
+		{
+		//ret = iImpl->GetSection(aSectionName,iter);
+		HBufC8* filter = HBufC8::NewLC(32);
+		filter->Des().Num(aFilter[i]);
+		TPtr8 ptr(filter->Des());
+		CleanupStack::Pop(1);
+		
+		while(iter->Next(val,key))
+		{
+			if (key.Compare(ptr)==0)
+				{
+				TInt tmpRet = iImpl->RemoveKey(sectionName,val);
+				if(ret != KErrNone)
+					ret = tmpRet;
+				break;
+				}				
+		}
+		iter->Reset();	
+				
+		}
+	CleanupStack::PopAndDestroy();	
+	//finally write into ini file
+	iImpl->PersistIniFile();
+	return ret;
+		
+}
+
+/**
+Public Destructor
+*/
+EXPORT_C CConfig::~CConfig()
+	{
+	delete iImpl;	
+	}
+
+//default constructor
+CConfig::CConfig(){}
+
+}
+