diff -r bbd31066657e -r 8bb370ba6d1d testexecfw/stf/stfext/testmodules/teftestmod/teftestmodulefw/utils/src/datadictionary.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecfw/stf/stfext/testmodules/teftestmod/teftestmodulefw/utils/src/datadictionary.cpp Fri Apr 09 10:46:28 2010 +0800 @@ -0,0 +1,282 @@ +/* +* Copyright (c) 2005-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: +* @file +* This contains CDataDictionary +* +*/ + + + +/** + @prototype + @test +*/ + +#include + +#include "datadictionary.h" +#include "datawrapper.h" + +TUint32 CDataDictionary::Hash(const TDataDictionaryName& aName) + { + return DefaultHash::Des16(aName); + } + +TBool CDataDictionary::Identity(const TDataDictionaryName& aName1, const TDataDictionaryName& aName2) + { + return aName1.Compare(aName2)==0; + } + +CDataDictionary::CDataDictionary() +/** + * Constructor + */ +: iStore(Hash, Identity) +, iCurrentObject(NULL) + { + } + + +CDataDictionary::~CDataDictionary() +/** + * Destructor + */ + { + Empty(); + } + +void CDataDictionary::AddDataL(const TDataDictionaryName& aName, CDataWrapper* aData) +/** + * Add a data entry to the dictionary + * + * @param aName - name of the dictionary entry + * @param aData - the data to add. The dictionary becomes owner of the object + * and is responsble for it's deletion + * + * @see TDataDictionaryName + * @see CDataWrapper + * + * @leave KErrAlreadyExists if the dictionary entry aName, or aData already exists. + * @leave KErrNoMemory if memory could not be allocated to store the copies of aName and aData. + * @leave system wide errors + */ + { + // Ensure name does not already exist + if ( iStore.Find(aName) != NULL ) + { + User::Leave(KErrAlreadyExists); + } + + // Ensure data does not already exist + TDataIter iter(iStore); + iter.Reset(); + for ( CDataWrapper*const * data=iter.NextValue(); data!=NULL; data=iter.NextValue() ) + { + if ( aData == *data ) + { + User::Leave(KErrAlreadyExists); + } + } + + iStore.InsertL(aName, aData); + if ( iCurrentObject == NULL ) + { + iCurrentObject=aData; + } + } + +void CDataDictionary::DeleteDataL(const TDataDictionaryName& aName) +/** + * Delete a data entry from the dictionary + * + * @param aName - name of the dictionary entry + * + * @see TDataDictionaryName + * + * @leave KErrNotFound if the dictionary entry aName is not found + */ + { + // Ensure name already exist + CDataWrapper** wrapper=iStore.Find(aName); + + if ( wrapper != NULL ) + { + delete* wrapper; + iStore.Remove(aName); + } + else + { + User::Leave(KErrNotFound); + } + } + +void CDataDictionary::SetCurrentDataL(const TDataDictionaryName& aName) +/** + * Set the current active dictionary entry + * + * @param aName - name of the dictionary entry + * + * @see TDataDictionaryName + * + * @leave KErrNotFound if the dictionary entry aName is not found + */ + { + // Ensure name already exist + CDataWrapper** wrapper=iStore.Find(aName); + + if ( wrapper != NULL ) + { + iCurrentObject=*wrapper; + } + else + { + User::Leave(KErrNotFound); + } + } + +CDataWrapper* CDataDictionary::GetDataL(const TDataDictionaryName& aName) +/** + * Get an object in the dictionary + * + * @param aName - name of the dictionary entry + * + * @see TDataDictionaryName + * + * @leave KErrNotFound if the dictionary entry aName is not found + * + * @return The data object found + */ + { + // Ensure name already exist + CDataWrapper** ret=iStore.Find(aName); + + if ( ret == NULL ) + { + User::Leave(KErrNotFound); + } + + return *ret; + } + +TAny* CDataDictionary::GetObjectL(const TDesC& aName) +/** + * Get an object in the dictionary + * + * @param aName - name of the dictionary entry + * + * @return The object found + * + * @leave KErrNotFound if the dictionary entry aName is not found + */ + { + // Ensure name already exist + CDataWrapper** wrapper=iStore.Find(aName); + TAny* ret=NULL; + + if ( wrapper != NULL ) + { + ret=(*wrapper)->GetObject(); + } + else + { + User::Leave(KErrNotFound); + } + + return ret; + } + +void CDataDictionary::Empty() +/** + * Empty the object dictionary + */ + { + TDataIter iter(iStore); + iter.Reset(); + for ( CDataWrapper*const * data=iter.NextValue(); data!=NULL; data=iter.NextValue() ) + { + delete *data; + } + iStore.Close(); + + iCurrentObject=NULL; + } + +TInt CDataDictionary::Outstanding(const TDesC& aName, TBool& aMoreToDo) +/** + * Delegates to a data object to see if + * it has any outstanding requests + * + * @param aName - Name of the dictionary entry + * + * @leave KErrNotFound if the dictionary entry aName is not found + * + * @return ETrue if there are any outstanding requests + */ + { + TInt retCode=KErrNone; + + aMoreToDo=EFalse; + if ( aName.Compare(KTEFNull)==0 ) + { + TDataIter iter(iStore); + iter.Reset(); + for ( CDataWrapper*const * data=iter.NextValue(); (data!=NULL) && (!aMoreToDo); data=iter.NextValue() ) + { + aMoreToDo = (*data)->Outstanding(); + } + } + else + { + // Ensure name already exist + CDataWrapper** wrapper=iStore.Find(aName); + + if ( wrapper != NULL ) + { + aMoreToDo = (*wrapper)->Outstanding(); + } + else + { + retCode=KErrNotFound; + } + } + + return retCode; + } + +TAny* CDataDictionary::CurrentObject() +/** + * Get the object of the current active dictionary entry + * + * @return The object that the current data wraps + */ + { + return iCurrentObject ? iCurrentObject->GetObject() : NULL; + } + +/** + * Set an object in the dictionary + * + * @param aName - name of the dictionary entry + * @param aObject - object that the wrapper is testing + * + * @see TDataDictionaryName + * + * @leave KErrNotFound if the dictionary entry aName is not found + * @leave KErrNotSupported if the the function is not supported + */ +void CDataDictionary::SetObjectL(const TDataDictionaryName& aName, TAny* aObject) + { + GetDataL(aName)->SetObjectL(aObject); + }