testexecfw/stf/stfext/testmodules/teftestmod/teftestmodulefw/utils/src/datadictionary.cpp
changeset 2 8bb370ba6d1d
--- /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 <e32std.h>
+
+#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);
+	}