--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/traceservices/tracefw/ulogger/src/sysconfig/sysconfigimpl.cpp Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,361 @@
+// 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 "sysconfigimpl.h"
+#include <hal.h>
+#include <hal_data.h>
+
+using namespace BSUL;
+
+namespace Ulogger
+{
+
+//////////////////////////////////////////////////////////////////////////////
+CConfigSettingsImpl* CConfigSettingsImpl::NewL()
+ {
+ CConfigSettingsImpl* self=new (ELeave) CConfigSettingsImpl();
+ return self;
+ }
+
+TBool CConfigSettingsImpl::Next(TPtrC8& aSetting,TPtrC8& aSettingValue)
+ {
+ if (!iIniSecIter)
+ {
+ return EFalse;
+ }
+ return iIniSecIter->Next(aSetting,aSettingValue);
+ }
+
+void CConfigSettingsImpl::Reset()
+ {
+ if (iIniSecIter)
+ {
+ iIniSecIter->Reset();
+ }
+ }
+
+CConfigSettingsImpl::~CConfigSettingsImpl()
+ {
+ if (iIniSecIter)
+ {
+ delete iIniSecIter;
+ iIniSecIter=NULL;
+ }
+ }
+
+CConfigSettingsImpl::CConfigSettingsImpl():iIniSecIter(NULL)
+ {
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+CConfigImpl* CConfigImpl::NewL(RHeap* aHeap,TFileName& aFileName)
+ {
+ CConfigImpl* self=new (ELeave)CConfigImpl(aHeap,aFileName);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CConfigImpl::ConstructL()
+ {
+ // Create/open a handle onto global mutex used to protect
+ // access to the config file.
+ TInt ret = KErrAlreadyExists;
+ for ( ; ret==KErrAlreadyExists; )
+ {
+ ret = iWriteMutex.OpenGlobal(KSysConfigMutex, EOwnerProcess);
+ if (ret == KErrNotFound)
+ ret = iWriteMutex.CreateGlobal(KSysConfigMutex, EOwnerProcess);
+ }
+ User::LeaveIfError(ret);
+
+ //establishing connection to file server
+ User::LeaveIfError(iFs.Connect());
+ // allow this connection to be shared with other threads
+ // - this facilitates sharing of config objects between threads
+ User::LeaveIfError(iFs.ShareProtected());
+
+ // load config
+// iIniFileWatcher = NULL;
+ LoadConfigFileL();
+ }
+
+CConfigImpl::~CConfigImpl()
+ {
+ if (iIniFileDocument)
+ {
+ delete iIniFileDocument;
+ iIniFileDocument=NULL;
+ }
+ //closing the mutex
+ if (iWriteMutex.Handle() && iWriteMutex.IsHeld())
+ {
+ iWriteMutex.Signal();
+ }
+ iWriteMutex.Close();
+ //closing the file handle
+ iFs.Close();
+ }
+
+
+
+
+/**
+Load the Ulogger config file contents.
+The existing iIniFileDocument and caches are cleared.
+This method assumes that iFs is connected.
+*/
+void CConfigImpl::LoadConfigFileL()
+ {
+ //switch to private heap
+ RHeap* threadHeap = NULL;
+ if (iHeap)
+ threadHeap = User::SwitchHeap(iHeap);
+
+ // delete existing document
+ if (iIniFileDocument)
+ {
+ delete iIniFileDocument;
+ iIniFileDocument=NULL;
+
+ }
+
+ TEntry dummy;
+ TInt ret=iFs.Entry(iFileName,dummy);
+
+ // grab the mutex
+ iWriteMutex.Wait();
+
+ //Creating an instance of IniDocument from default
+ iIniFileDocument=CIniDocument8::NewL(iFs,iFileName);
+
+ // release the mutex
+ iWriteMutex.Signal();
+ //switch back to user heap
+ if (threadHeap)
+ User::SwitchHeap(threadHeap);
+ }
+
+
+TInt CConfigImpl::PersistIniFile()
+ {
+ // grab the mutex
+ iWriteMutex.Wait();
+
+ TInt ret=iIniFileDocument->Externalise(iFileName);
+
+ // release the mutex
+ iWriteMutex.Signal();
+ return ret;
+ }
+
+
+TInt CConfigImpl::GetKeyValue(const TDesC8& aSectionName,const TDesC8& aKeyName ,TPtrC8& aValue)
+ {
+ return iIniFileDocument->GetKeyValue(aSectionName,aKeyName,aValue);
+ }
+
+TInt CConfigImpl::RemoveKey(const TDesC8& aSectionName,const TDesC8& aKeyName)
+ {
+ return iIniFileDocument->RemoveKey(aSectionName,aKeyName);
+ }
+
+TInt CConfigImpl::SetKeyValue(const TDesC8& aSectionName,const TDesC8& aKey, const TDesC8& aValue)
+ {
+ return iIniFileDocument->SetKey(aSectionName,aKey,aValue);
+ }
+
+/*TInt CConfigImpl::AddSection(const TDesC8& aSectionName)
+ {
+ return iIniFileDocument->AddSection(aSectionName);
+ }*/
+
+TInt CConfigImpl::RemoveSection(const TDesC8& aSectionName)
+ {
+ return iIniFileDocument->RemoveSection(aSectionName);
+ }
+
+TInt CConfigImpl::GetSection(const TDesC8& aSectionName,CConfigSettingsIter& aSection)
+ {
+ //clear any previous internal iIniSecIterator
+ if (aSection.iImpl->iIniSecIter)
+ {
+ delete (aSection.iImpl->iIniSecIter);
+ aSection.iImpl->iIniSecIter=NULL;
+ }
+ //initializing its internal iIniSecIterator
+ TRAPD(ret,aSection.iImpl->iIniSecIter=CIniSecIter8::NewL(aSectionName,iIniFileDocument));
+ return ret;
+ }
+
+
+
+//util to check any key within that section holds that value
+//if not found simply return the number of keys within that section
+TInt CConfigImpl::CheckValueExist(const TDesC8& aSectionName,const TDesC8& aValue,TInt& aKeyCount)
+ {
+ CIniSecIter8* iter=NULL;
+ TRAPD(err,iter=CIniSecIter8::NewL(aSectionName,iIniFileDocument));
+ //if section not found it might be the first time we are creating
+ //the document so it is fine to return KErrNone
+ if (err==KErrNotFound)
+ {
+ return KErrNone;
+ }
+ //return the error code if else than KErrNotFound e.g. KErrNoMemory;
+ if (err!=KErrNone)
+ {
+ return err;
+ }
+ TPtrC8 key;
+ TPtrC8 value;
+ TInt keyCount=0;
+ while (iter->Next(key,value))
+ {
+ if (value.Compare(aValue)==0)
+ {
+ delete iter;
+ keyCount=0;
+ return KErrAlreadyExists;
+ }
+ keyCount++;
+ }
+ aKeyCount=keyCount;
+ delete iter;
+ return KErrNone;
+ }
+
+
+TInt CConfigImpl::GenerateInternalKey(const TDesC8& aSection,TBuf8<15>& aKeyName)
+ {
+ TPtrC8 lastKey;
+ TInt ret=GetKeyCount(aSection,lastKey);
+ if (ret<0)
+ {
+ return ret;
+ }
+ //either "mediaX" or "X"
+ //TInt key=ret;
+
+ if(aSection.Compare(KPrimaryFilterSection)== 0 )
+ {
+ TInt lastKeyValue=0;
+ if(lastKey.Length())
+ {
+ TLex8 lex(lastKey);
+ TInt err = lex.Val(lastKeyValue);
+ if(err != KErrNone)
+ return err;
+ }
+ aKeyName.Format(_L8("%03d"),++lastKeyValue);
+ }
+ else if(aSection.Compare(KSecondaryFilterSection) == 0)
+ {
+ TInt lastKeyValue=0;
+ if(lastKey.Length())
+ {
+ TLex8 lex(lastKey);
+ TInt err = lex.Val(lastKeyValue);
+ if(err != KErrNone)
+ return err;
+ }
+ aKeyName.Format(_L8("%04d"),++lastKeyValue);
+ }
+ else
+ {
+ TInt lastKeyValue=0;
+ if(lastKey.Length())
+ {
+ TLex8 lex(lastKey);
+ TInt err = lex.Val(lastKeyValue);
+ if(err != KErrNone)
+ return err;
+ }
+ aKeyName.Format(_L8("%d"),++lastKeyValue);
+ }
+ return KErrNone;
+}
+
+/*TInt CConfigImpl::GenerateInternalSessionName(const TDesC8& aSection,TBuf8<15>& aKeyName)
+ {
+ TPtrC8 lastKey;
+ TInt ret=GetKeyCount(aSection,lastKey);
+ if (ret<0)
+ {
+ return ret;
+ }
+ //either "mediaX" or "X"
+ TInt index=(aSection.Compare(KActiveSection)==0?5:0);
+ TInt key=0;
+ if (lastKey.Length()!=0)
+ {
+ TLex8 lex;
+ lex.Assign(lastKey.Mid(index));
+ lex.Val(key);
+ }
+ aKeyName.Format((aSection.Compare(KActiveSection)==0?_L8("Session%d"):_L8("%d")),++key);
+ return KErrNone;
+ }*/
+
+
+TInt CConfigImpl::GetKeyCount(const TDesC8& aSectionName,TPtrC8& aLastKey)
+ {
+ CIniSecIter8* iter=NULL;
+ TRAPD(err,iter=CIniSecIter8::NewL(aSectionName,iIniFileDocument));
+ //if section not found it indicates the keycount is 0;
+ if (err==KErrNotFound)
+ {
+ return 0;
+ }
+ //return any error code e.g KErrNoMemory here;
+ if (err!=KErrNone)
+ {
+ return err;
+ }
+ TPtrC8 key;
+ TInt keyCount=0x0000;
+ while (iter->Next(aLastKey,key))
+ {
+ keyCount++;
+ }
+ delete iter;
+ return keyCount;
+ }
+
+TInt CConfigImpl::GetPointerToKeyName(const TDesC8& aSectionName,const TDesC8& aKeyName,TPtrC8& aKeyPointer)
+ {
+ CIniSecIter8* iter=NULL;
+ TRAPD(err,iter=CIniSecIter8::NewL(aSectionName,iIniFileDocument));
+ if (err!=KErrNone)
+ {
+ return err;
+ }
+ TPtrC8 value;
+ while (iter->Next(aKeyPointer,value))
+ {
+ if (aKeyName.Compare(aKeyPointer)==0)
+ {
+ delete iter;
+ return KErrNone;
+ }
+ }
+ delete iter;
+ return KErrNotFound;
+ }
+}
+