datacommsserver/esockserver/csock/cs_parameterfamily.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/csock/cs_parameterfamily.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,536 @@
+// 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:
+// Implementation for RParameterFamily and RParameterFamilyBundle classes
+// 
+//
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#include <comms-infras/es_parameterfamily.h>
+#include <comms-infras/es_parameterbundle.h>
+#include <es_sock.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ESockCSckCSPrmtF, "ESockCSckCSPrmtF");
+#endif
+
+
+
+using namespace Meta;
+
+EXPORT_C void RParameterFamily::CreateL(RParameterFamilyBundle& aBundle, TUint32 aFamilyId)
+/** Creates a new parameter set family. This class is used as a container for a number of parameter
+    sets that make up a family. It is a specific instantiatable class and therefore creates
+	an instance of CParameterFamily without using ECOM.
+
+@param aBundle Family container (bundle) that this family is to be added to
+@exception KErrInUse if the container has already been prepared for use, KErrArgument if
+aBundle is invalid, or another system-wide error code
+*/
+	{
+	if(iContainer)
+		{
+		User::Leave(KErrInUse);
+		}
+	CParameterBundleBase* bundle = aBundle.iBundle;
+	if(!bundle)
+		{
+		User::Leave(KErrArgument);
+		}
+	iContainer = CParameterSetContainer::NewL(*bundle,aFamilyId);
+	}
+
+EXPORT_C void RParameterFamily::LoadL(RParameterFamilyBundle& aBundle, TPtrC8& aBuffer)
+	{
+	if(iContainer)
+		{
+		User::Leave(KErrInUse);
+		}
+	CParameterBundleBase* bundle = aBundle.iBundle;
+	if(!bundle)
+		{
+		User::Leave(KErrArgument);
+		}
+	iContainer = CParameterSetContainer::LoadL(*bundle,aBuffer);
+	}
+
+
+
+
+
+EXPORT_C void RParameterFamily::Destroy()
+/** Sub-connection parameter family destructor. It cleans up the arrays deleting all
+    the parameter sets it owns
+*/
+	{
+	delete iContainer;
+	iContainer = NULL;
+	}
+
+
+/**
+Adds a parameter set to a sub-connection parameter set family.
+
+@param aExtensionSet Parameter Set to be added to the family (family takes ownership)
+@param aType The type of the set (requested, acceptable or granted)
+@exception leaves with KErrNoMemory in out of memory conditions, or KErrNotReady if the parameter
+family hasn't been prepared with LoadL or CreateL, or KErrArgument if aSet is invalid
+*/
+EXPORT_C void RParameterFamily::AddParameterSetL(XParameterSetBase* aSet, TParameterSetType aType)
+	{
+	User::LeaveIfError(AddParameterSet(aSet, aType));
+	}
+
+/**
+Adds a parameter set to a sub-connection parameter set family.
+
+@param aExtensionSet Parameter Set to be added to the family (family takes ownership)
+@param aType The type of the set (requested, acceptable or granted)
+@returns Returns KErrNoMemory in out of memory conditions, or KErrNotReady if the parameter
+family hasn't been prepared with LoadL or CreateL, or KErrArgument if aSet is invalid
+*/
+EXPORT_C TInt RParameterFamily::AddParameterSet(XParameterSetBase* aSet, TParameterSetType aType)
+	{
+	if (!aSet)
+		{
+		return KErrArgument;
+		}
+
+	if (IsNull())
+		{
+		return KErrNotReady;
+		}
+	
+	TInt index = aType;
+	for( ; index < iContainer->CountParameterSets() ; index += ENumValues)
+		{
+		if (iContainer->GetParameterSet(index) == NULL)
+			{
+			return iContainer->ReplaceParameterSet(index, aSet);
+			}
+		}
+
+	// if we've got here we have to expand the array as there's no null slots to use
+	TInt err;
+	err = iContainer->GrowToFit(index + 1);
+	if (err == KErrNone)
+		{
+		err = iContainer->ReplaceParameterSet(index, aSet);
+		}
+	return err;
+	}
+
+
+EXPORT_C XParameterSetBase* RParameterFamily::GetParameterSetAtIndex(TUint aIndex, TParameterSetType aType)
+	{
+	XParameterSetBase* result = NULL;
+	if(iContainer)
+		{
+		TInt index = (aIndex * ENumValues) + aType;
+		if(index < iContainer->CountParameterSets())
+			{
+			result = iContainer->GetParameterSet(index);
+			}
+		}
+	return result;
+	}
+
+
+EXPORT_C TInt RParameterFamily::CountParameterSets()
+	{
+	return (iContainer?iContainer->CountParameterSets():0);
+	}
+
+// returns the size (number of elements needed to span from the first element of type aType to
+//  the last such element with a value)
+EXPORT_C TInt RParameterFamily::CountParameterSets(TParameterSetType aType)
+	{
+	// work out the allocated size of the array for this type
+	TInt size = ((iContainer?iContainer->CountParameterSets():0) + (ENumValues-aType-1)) / 3;
+
+	for(TInt i=size-1; i>=0; --i)
+		{
+		TInt index = (i * ENumValues) + aType;
+		XParameterSetBase* ps = iContainer->GetParameterSet(index);
+		if(ps)
+			{
+			return size;
+			}
+		}
+	return 0;
+	}
+
+
+EXPORT_C XParameterSetBase* RParameterFamily::FindParameterSet(STypeId aSetId, TParameterSetType aType)
+	{
+	TInt index = aType;
+	for( ; index < (iContainer?iContainer->CountParameterSets():0) ; index += ENumValues)
+		{
+		XParameterSetBase* thisSet = iContainer->GetParameterSet(index);
+		if(thisSet && thisSet->IsTypeOf(aSetId))
+			{
+			return thisSet;
+			}
+		}
+	return NULL; // not found
+	}
+
+
+
+/**
+Removes a parameter set from a parameter set family.
+
+@param aSetToRemove Parameter Set to be removed from the family returning ownership to the calling method
+@param aType The type of the set (requested, acceptable or granted)
+@return Returns with KErrNotFound if set is not found, or KErrNotReady if the parameter
+family hasn't been prepared with LoadL or CreateL
+*/
+EXPORT_C TInt RParameterFamily::RemoveParameterSet(XParameterSetBase* aSetToRemove, TParameterSetType aType)
+	{
+	if (IsNull())
+		{
+		return KErrNotReady;
+		}
+
+	TInt index = aType;
+	for( ; index < iContainer->CountParameterSets() ; index += ENumValues)
+		{
+		if(iContainer->GetParameterSet(index) == aSetToRemove)
+			{
+			XParameterSetBase* ps = iContainer->RemoveParameterSet(index);
+			ASSERT(ps && ps == aSetToRemove);
+			(void)ps; // avoid unused variable warning in urel
+			return KErrNone;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+
+/**
+Removes a parameter set from a parameter set family and deletes it
+
+@param aSetToRemove Parameter Set to be removed from the family 
+@param aType The type of the set (requested, acceptable or granted)
+@return Returns with KErrNotFound if set is not found, or KErrNotReady if the parameter
+family hasn't been prepared with LoadL or CreateL
+*/
+EXPORT_C TInt RParameterFamily::RemoveAndDestroyParameterSet(XParameterSetBase* aSetToRemove, TParameterSetType aType)
+	{
+	TInt err = RemoveParameterSet(aSetToRemove, aType);
+	if (err == KErrNone)
+		{
+		delete aSetToRemove;
+		}
+	return err;
+	}
+
+
+
+EXPORT_C TUint RParameterFamily::Length() const
+/** Calculates the length of buffer required to serialise this parameter family.
+
+@return Length of buffer required.
+*/
+	{
+	return iContainer ? iContainer->Length() : 0;
+	}
+
+
+EXPORT_C TInt RParameterFamily::Store(TDes8& aDes) const
+/** Instructs this sub-connection family to create a serialised version of itself
+    and append it to the buffer that has been passed.
+
+@param aDes Buffer to append the serialised object to
+@return KErrNone if successful, otherwise system wide error (e.g. KErrOverflow if the descriptor is too small)
+If unsuccessful, there is no guarantee as to the buffer or data stored in it.
+*/
+	{
+	return iContainer ? iContainer->Store(aDes) : KErrNotReady;
+	}
+
+
+EXPORT_C void RParameterFamily::ClearAllParameters(TParameterSetType aType)
+/** Clears (removes and deletes) all parameter sets with the type specified
+
+@param aType The type of the set to be deleted(requested, acceptable or granted)
+*/
+	{
+	TInt index = aType;
+	for( ; index < iContainer->CountParameterSets() ; index += ENumValues)
+		{
+		TRAP_IGNORE(iContainer->ReplaceParameterSetL(index,NULL));
+		}
+	}
+
+
+EXPORT_C void RParameterFamily::DeleteParameterSetL(TInt aIndex)
+	{
+    User::LeaveIfError(DeleteParameterSet(aIndex));
+	}
+
+EXPORT_C TInt RParameterFamily::DeleteParameterSet(TInt aIndex)
+	{
+	if(iContainer)
+		{
+		return iContainer->DeleteParameterSet(aIndex);
+		}
+	else
+		{
+		return KErrNotReady;
+		}
+	}
+
+EXPORT_C TInt RParameterFamily::ClearParameterSetPointer(TInt aIndex, TParameterSetType aType)
+	{
+	if(iContainer)
+		{
+		iContainer->ClearParameterSetPointer(aIndex * ENumValues + aType);
+		return KErrNone;
+		}
+	else
+		return KErrNotReady;
+	}
+
+EXPORT_C TUint32 RParameterFamily::Id() const
+/**
+Fetch the identity of the sub-connection parameter family
+*/
+	{
+	return (iContainer == NULL) ? 0 : iContainer->Id();
+	}
+
+EXPORT_C RParameterFamily RParameterFamilyBundle::CreateFamilyL(TUint32 aFamilyId)
+	{
+	if(iBundle == NULL)
+		{
+		User::Leave(KErrNotReady);
+		}
+	RParameterFamily newFamily;
+	newFamily.CreateL(*this,aFamilyId);
+	return newFamily;
+	}
+
+
+EXPORT_C RParameterFamily RParameterFamilyBundle::GetFamilyAtIndex(TUint aIndex)
+	{
+	RParameterFamily result;
+	if(iBundle != NULL)
+		{
+		CParameterSetContainer* psc = iBundle->GetParamSetContainer(aIndex);
+		if(psc != NULL)
+			{
+			result.iContainer = psc;
+			}
+		}
+	return result;
+	}
+
+EXPORT_C RParameterFamily RParameterFamilyBundle::FindFamily(TUint32 aFamilyId)
+/** Search the sub-connection parameter bundle for a parameter family
+
+@param aFamilyId Id of the family to match against
+@return Matching family or NULL pointer if not found
+*/
+	{
+	RParameterFamily result;
+	if(iBundle != NULL)
+		{
+		CParameterSetContainer* psc = iBundle->FindParamSetContainer(aFamilyId);
+		if(psc != NULL)
+			{
+			result.iContainer = psc;
+			}
+		}
+	return result;
+	}
+
+
+EXPORT_C void RParameterFamilyBundle::ClearAllParameters(RParameterFamily::TParameterSetType aType)
+/** Clears (removes and deletes) all parameter sets with the type specified (delegated to the families)
+
+@param aType The type of the set to be deleted(requested, acceptable or granted)
+*/
+	{
+	if(iBundle == NULL)
+		{
+		return;
+		}
+
+	TUint length = iBundle->CountParamSetContainers();
+	RParameterFamily pf;
+	for (TUint i = 0; i < length; ++i)
+		{
+		pf.iContainer = iBundle->GetParamSetContainer(i);
+		pf.ClearAllParameters(aType);
+		}
+	}
+
+EXPORT_C TInt RParameterFamilyBundle::CountParameterFamilies() const
+	{
+	return iBundle->CountParamSetContainers();
+	}
+
+EXPORT_C TInt RParameterFamilyBundle::DeleteFamilyAtIndex(TInt aIndex)
+	{
+	if (aIndex < iBundle->CountParamSetContainers())
+		{
+		CParameterSetContainer* aFamily = iBundle->GetParamSetContainer (aIndex);
+		delete aFamily;
+		RemoveFamilyAtIndex (aIndex);
+		return KErrNone;
+		}
+
+	return KErrNotFound;
+	}
+
+EXPORT_C void RParameterFamilyBundle::RemoveFamilyAtIndex(TInt aIndex)
+	{
+	__ASSERT_DEBUG (aIndex < iBundle->CountParamSetContainers (), User::Invariant());
+	iBundle->RemoveParamSetContainer(aIndex);
+	}
+
+RParameterFamilyBundle& RParameterFamilyBundle::operator=(const RParameterFamilyBundle& /*aBundle*/)
+/** Assignment operator
+*/
+	{
+	__ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockCSckCSPrmtF, 1));//can be Unreachable in future
+	return *this;
+	}
+
+
+
+RParameterFamilyBundle::RParameterFamilyBundle(const RParameterFamilyBundle& /*aBundle*/)
+/** Copy Constructor
+*/
+	{
+	__ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockCSckCSPrmtF, 2));//can be Unreachable in future
+	}
+
+
+EXPORT_C /* static */ void RParameterFamilyBundleC::CreateL()
+	{
+	iBundle = CGenericParameterBundle::NewL();
+	}
+
+EXPORT_C /* static */ void RParameterFamilyBundleC::LoadL(TDesC8& aDes)
+/** Creates a new parameter family bundle from a buffer containing the serialised object.
+
+@param aDes Buffer containing the serialised object information
+@return a pointer to a parameter family bundle if successful, otherwise leaves with system error code.
+*/
+	{
+	iBundle = CGenericParameterBundle::LoadL(aDes);
+	}
+	
+EXPORT_C TInt RParameterFamilyBundleC::Load(const TDesC8& aDes)
+	{
+	return iBundle->Load(aDes);
+	}
+
+EXPORT_C void RParameterFamilyBundleC::Destroy()
+/** Sub-connection parameter bundle destructor, clear up the families
+*/
+	{
+	delete iBundle;
+	iBundle=NULL;
+	}
+
+
+EXPORT_C TUint RParameterFamilyBundleC::Length() const
+/** Calculates the length of buffer required to serialise this parameter set bundle.
+
+@return Length of buffer required.
+*/
+	{
+	return iBundle ? iBundle->Length() : 0;
+	}
+
+
+EXPORT_C TInt RParameterFamilyBundleC::Store(TDes8& aDes) const
+/** Instructs this parameter family bundle to create a serilised version of itself
+    and append it to the buffer that has been passed.
+
+@param aDes Buffer to append the serialised object to
+@return KErrNone if successful, otherwise system wide error (e.g. EKrrOverflow if the descriptor is too small)
+If unsuccessful, there is no guarantee as to the buffer or data stored in it.
+*/
+	{
+	return iBundle ? iBundle->Store(aDes) : KErrNotReady;
+	}
+
+
+EXPORT_C const RParameterFamily RParameterFamilyBundleC::GetFamilyAtIndex(TUint aIndex) const
+	{
+	RParameterFamily result;
+	if(iBundle != NULL)
+		{
+		CParameterSetContainer* psc = iBundle->GetParamSetContainer(aIndex);
+		if(psc != NULL)
+			{
+			result.iContainer = psc;
+			}
+		}
+	return result;
+	}
+
+EXPORT_C const RParameterFamily RParameterFamilyBundleC::FindFamily(TUint32 aFamilyId) const
+/** Search the sub-connection parameter bundle for a parameter family
+
+@param aFamilyId Id of the family to match against
+@return Matching family or NULL pointer if not found
+*/
+	{
+	RParameterFamily result;
+	if(iBundle != NULL)
+		{
+		CParameterSetContainer* psc = iBundle->FindParamSetContainer(aFamilyId);
+		if(psc != NULL)
+			{
+			result.iContainer = psc;
+			}
+		}
+	return result;
+	}
+
+
+
+RParameterFamilyBundleC& RParameterFamilyBundleC::operator=(const RParameterFamilyBundleC& /*aBundle*/)
+/** Assignment operator
+*/
+	{
+	__ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockCSckCSPrmtF, 3));//can be Unreachable in future
+	return *this;
+	}
+
+
+
+RParameterFamilyBundleC::RParameterFamilyBundleC(const RParameterFamilyBundleC& /*aBundle*/)
+/** Copy Constructor
+*/
+	{
+	__ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockCSckCSPrmtF, 4));//can be Unreachable in future
+	}
+
+
+
+