williamr@4: // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // Generic parameter bundles: williamr@4: // Serialisable containers for structured custom data. williamr@4: // Bundle williamr@4: // has 0..n williamr@4: // Parameter Set Containers williamr@4: // each of which has 0..n williamr@4: // ParameterSets williamr@4: // This can be seen as loosely mapping to a "table" of data, williamr@4: // where the williamr@4: // "table" williamr@4: // has 0..n williamr@4: // "rows" williamr@4: // each of which has 0..n williamr@4: // "groups of columns" williamr@4: // Custom data is implemented as ParameterSet-derived classes in ECom plugins. See esock/conn_params for an example williamr@4: // williamr@4: // williamr@4: // Note: Every effort should be made to ensure that the classes forming this API be kept consistent with each other williamr@4: // When making changes to these classes also see the files es_parameterbundle.h, es_parameterfamily.h, williamr@4: // ss_parameterfamilybundle.h williamr@4: // williamr@4: // williamr@4: williamr@4: williamr@4: /** williamr@4: @file williamr@4: @internalTechnology williamr@4: */ williamr@4: williamr@4: williamr@4: #ifndef ES_PARAMETERBUNDLE_H williamr@4: #define ES_PARAMETERBUNDLE_H williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: class CParameterBundleBase; williamr@4: williamr@4: williamr@4: class CParameterSetContainer : public CBase, public Meta::MMetaType williamr@4: /** williamr@4: * A container for 0..n Parameter Sets. williamr@4: * Can be seen as a "row" or "record" of information, williamr@4: * with its own 32 bit Id to be used as a key to the set if required williamr@4: * */ williamr@4: { williamr@4: public: williamr@4: IMPORT_C static CParameterSetContainer* NewL(CParameterBundleBase& aBundle, TUint32 aContainerId = 0); williamr@4: IMPORT_C static CParameterSetContainer* LoadL(CParameterBundleBase& aBundle, TPtrC8& aBuffer); williamr@4: williamr@4: IMPORT_C static CParameterSetContainer* NewL(TUint32 aContainerId = 0); // Use this constructor if the container is to live independently of a bundle williamr@4: IMPORT_C static CParameterSetContainer* LoadL(TPtrC8& aBuffer); williamr@4: williamr@4: public: williamr@4: IMPORT_C virtual ~CParameterSetContainer(); williamr@4: williamr@4: inline TUint32 Id() const williamr@4: { williamr@4: return iContainerId; williamr@4: } williamr@4: williamr@4: IMPORT_C void AddParameterSetL(XParameterSetBase* aParameterSet); // ownership of object is passed williamr@4: IMPORT_C TInt AddParameterSet(XParameterSetBase* aParameterSet); // ownership of object is passed williamr@4: williamr@4: /** williamr@4: Searches a container for a parameter set of the given type. williamr@4: @param aSetId The STypeId of the set williamr@4: @return Pointer to the set if found, otherwise a NULL pointer. williamr@4: */ williamr@4: IMPORT_C XParameterSetBase* FindParameterSet(const Meta::STypeId& aSetId); williamr@4: williamr@4: const XParameterSetBase* FindParameterSet(const Meta::STypeId& aSetId) const williamr@4: { williamr@4: return const_cast(this)->FindParameterSet(aSetId); williamr@4: } williamr@4: williamr@4: /** williamr@4: Searches a container for a specific parameter set instance. williamr@4: @param aRhs The parameter set to find williamr@4: @return ETrue if set was found in parameter set container. williamr@4: */ williamr@4: IMPORT_C TBool FindParameterSet(const XParameterSetBase& aRhs); williamr@4: IMPORT_C XParameterSetBase* GetParameterSet(TInt aIndex); williamr@4: williamr@4: const XParameterSetBase* GetParameterSet(TInt aIndex) const williamr@4: { williamr@4: return const_cast(this)->GetParameterSet(aIndex); williamr@4: } williamr@4: williamr@4: TInt CountParameterSets() const williamr@4: { williamr@4: return iParameterSets.Count(); williamr@4: } williamr@4: williamr@4: /** Deletes set at index aIndex and replaces it with aParameterSet. williamr@4: Ownership of set passes to this parameter set container. williamr@4: @param aIndex - index of container to delete and replace williamr@4: @param aParameterSet - new set to replace in array williamr@4: @return throws KErrArgument if aIndex out of range williamr@4: */ williamr@4: IMPORT_C void ReplaceParameterSetL(TInt aIndex, XParameterSetBase* aNewSet); williamr@4: IMPORT_C TInt ReplaceParameterSet(TInt aIndex, XParameterSetBase* aNewSet); williamr@4: williamr@4: /** Deletes set at index, and reorganises the array so it's 1 smaller williamr@4: @param aIndex - index of container to delete and remove from array williamr@4: @return throws KErrArgument if aIndex out of range williamr@4: */ williamr@4: IMPORT_C void DeleteParameterSetL(TInt aIndex); williamr@4: IMPORT_C TInt DeleteParameterSet(TInt aIndex); williamr@4: williamr@4: /** williamr@4: Removes the parameter set at the index. Ownership is transfered to the calling method williamr@4: @param aIndex - index of container to delete and remove from array williamr@4: @return returns NULL if the index was invalid, otherwise a pointer to the williamr@4: removed parameter set. williamr@4: */ williamr@4: IMPORT_C XParameterSetBase* RemoveParameterSet(TInt aIndex); williamr@4: williamr@4: /** Makes room for a bulk setting operation williamr@4: */ williamr@4: IMPORT_C void GrowToFitL(TInt aMinSize); williamr@4: IMPORT_C TInt GrowToFit(TInt aMinSize); williamr@4: williamr@4: inline void ClearParameterSetPointer(TInt aIndex) williamr@4: { williamr@4: iParameterSets[aIndex] = 0; williamr@4: } williamr@4: williamr@4: // From MMetaType williamr@4: IMPORT_C virtual TInt Load(TPtrC8& aBuffer); williamr@4: IMPORT_C virtual TInt Store(TDes8& aBuffer) const; williamr@4: IMPORT_C virtual TInt Length() const; williamr@4: williamr@4: protected: williamr@4: CParameterSetContainer(TUint32 aContainerId) williamr@4: : iContainerId(aContainerId) williamr@4: { williamr@4: } williamr@4: williamr@4: IMPORT_C void ConstructL(CParameterBundleBase& aBundle); williamr@4: williamr@4: williamr@4: private: williamr@4: // From MMetaType williamr@4: virtual void Copy(const TAny* /*aData*/) williamr@4: { williamr@4: // Not supported williamr@4: } williamr@4: williamr@4: TUint32 iContainerId; williamr@4: Meta::RMetaDataEComContainer iParameterSets; williamr@4: }; williamr@4: williamr@4: williamr@4: class CParameterBundleBase : public CBase williamr@4: /** Bundle of (i.e. container for) parameter set containers. williamr@4: williamr@4: The basic object shape and base type container manipulators. williamr@4: To be used only by CParameterBundle williamr@4: williamr@4: May contain and 0..N parameter families. williamr@4: */ williamr@4: { williamr@4: public: williamr@4: static inline CParameterBundleBase* NewL() williamr@4: { williamr@4: return new(ELeave) CParameterBundleBase; williamr@4: } williamr@4: williamr@4: IMPORT_C virtual ~CParameterBundleBase(); williamr@4: williamr@4: IMPORT_C TUint Length() const; williamr@4: williamr@4: IMPORT_C TInt Store(TDes8& aDes) const; williamr@4: williamr@4: // Load() can't be in base type as it requires static call to specific parameter set container type williamr@4: williamr@4: IMPORT_C void AddParamSetContainerL(CParameterSetContainer& aContainer); williamr@4: IMPORT_C TInt AddParamSetContainer(CParameterSetContainer& aContainer); williamr@4: williamr@4: IMPORT_C CParameterSetContainer* RemoveParamSetContainer(TInt aIndex); williamr@4: williamr@4: TInt CountParamSetContainers() const williamr@4: { williamr@4: return iSetContainers.Count(); williamr@4: } williamr@4: williamr@4: IMPORT_C CParameterSetContainer* GetParamSetContainer(TInt aIndex); williamr@4: williamr@4: const CParameterSetContainer* GetParamSetContainer(TInt aIndex) const williamr@4: { williamr@4: return const_cast(this)->GetParamSetContainer(aIndex); williamr@4: } williamr@4: williamr@4: IMPORT_C CParameterSetContainer* FindParamSetContainer(TUint32 aContainerId); williamr@4: inline const CParameterSetContainer* FindParamSetContainer(TUint32 aContainerId) const williamr@4: { williamr@4: const CParameterSetContainer* r = const_cast(this)->FindParamSetContainer(aContainerId); williamr@4: return r; williamr@4: } williamr@4: williamr@4: // deep search for parameter set in bundle williamr@4: IMPORT_C XParameterSetBase* FindParameterSet(const Meta::STypeId& aTypeId); williamr@4: inline const XParameterSetBase* FindParameterSet(const Meta::STypeId& aTypeId) const williamr@4: { williamr@4: const XParameterSetBase* r = const_cast(this)->FindParameterSet(aTypeId); williamr@4: return r; williamr@4: } williamr@4: williamr@4: // finds aOld in array, deletes it and changes that pointer in array to be aNew instead. williamr@4: // throws KErrArgument if aOld is not found williamr@4: IMPORT_C void ReplaceParamSetContainerL(CParameterSetContainer* aOld, CParameterSetContainer* aNew); williamr@4: IMPORT_C TInt ReplaceParamSetContainer(CParameterSetContainer* aOld, CParameterSetContainer* aNew); williamr@4: williamr@4: protected: williamr@4: CParameterBundleBase() williamr@4: { williamr@4: } williamr@4: williamr@4: private: williamr@4: CParameterBundleBase(const CParameterBundleBase& aBundle); williamr@4: CParameterBundleBase& operator=(const CParameterBundleBase& aBundle); williamr@4: williamr@4: protected: williamr@4: RPointerArray iSetContainers; williamr@4: }; williamr@4: williamr@4: williamr@4: template williamr@4: class MParameterSetTemplateMethods williamr@4: /** williamr@4: * methods brought in as a template, to avoid having to rewrite williamr@4: * identical-looking code in every derived type of XParameterSetBase williamr@4: */ williamr@4: { williamr@4: public: williamr@4: static inline SUBCLASS* NewL(PARAMSETCONTAINERTYPE& aContainer) williamr@4: { williamr@4: SUBCLASS* obj = NewL(); williamr@4: CleanupStack::PushL(obj); williamr@4: aContainer.AddParameterSetL(obj); williamr@4: CleanupStack::Pop(obj); williamr@4: return obj; williamr@4: } williamr@4: williamr@4: static inline Meta::STypeId Type() williamr@4: { williamr@4: return Meta::STypeId::CreateSTypeId(UID,TYPE); williamr@4: } williamr@4: williamr@4: static inline SUBCLASS* NewL() williamr@4: { williamr@4: // As it's a plugin we must instantiate via the plugin interface! williamr@4: // Directly calling the constructor would cause a link error as williamr@4: // the vtable won't be visible by whoever uses this. williamr@4: // So we need ECom to import it for us. williamr@4: return static_cast(Meta::SMetaDataECom::NewInstanceL(Type())); williamr@4: } williamr@4: williamr@4: static inline SUBCLASS* FindInParamSetContainer(PARAMSETCONTAINERTYPE& aContainer) williamr@4: { williamr@4: return static_cast(aContainer.FindParameterSet(Type())); williamr@4: } williamr@4: williamr@4: static inline const SUBCLASS* FindInParamSetContainer(const PARAMSETCONTAINERTYPE& aContainer) williamr@4: { williamr@4: return static_cast(aContainer.FindParameterSet(Type())); williamr@4: } williamr@4: williamr@4: static inline SUBCLASS* FindInBundle(CParameterBundleBase& aBundle) williamr@4: { williamr@4: return static_cast(aBundle.FindParameterSet(Type())); williamr@4: } williamr@4: williamr@4: static inline const SUBCLASS* FindInBundle(const CParameterBundleBase& aBundle) williamr@4: { williamr@4: return static_cast(aBundle.FindParameterSet(Type())); williamr@4: } williamr@4: }; williamr@4: williamr@4: williamr@4: template williamr@4: class CParameterBundle : public CParameterBundleBase williamr@4: /** Container for (bundle of) parameter set containers. williamr@4: williamr@4: This class can't be used directly, but must be subclassed, as the NewL/LoadL refer to williamr@4: the subclass. williamr@4: williamr@4: May contain and 0..N parameter families of type PARAMSETCONTAINERTYPE. williamr@4: */ williamr@4: { williamr@4: public: williamr@4: williamr@4: static SUBCLASS* NewL() williamr@4: /** Creates a new instance of a parameter bundle (heap object). williamr@4: williamr@4: @return newly created instance of a parameter bundle williamr@4: @exception leaves with KErrNoMemory in out of memory conditions williamr@4: */ williamr@4: { williamr@4: return new (ELeave) SUBCLASS(); williamr@4: } williamr@4: williamr@4: static SUBCLASS* LoadL(TDesC8& aDes) williamr@4: /** Creates a new parameter set bundle from a buffer containing the serialised object. williamr@4: williamr@4: @param aDes Buffer containing the serialised object information williamr@4: @return a pointer to a parameter bundle if successful, otherwise leaves with system error code. williamr@4: */ williamr@4: { williamr@4: SUBCLASS* obj = new (ELeave) SUBCLASS(); williamr@4: CleanupStack::PushL(obj); williamr@4: User::LeaveIfError(obj->Load(aDes)); williamr@4: CleanupStack::Pop(obj); williamr@4: return obj; williamr@4: } williamr@4: williamr@4: TInt Load(const TDesC8& aDes) williamr@4: /** Instructs this sub-connection bundle to set its members based on the serialiesd data williamr@4: in the buffer passed. williamr@4: williamr@4: @param aDes Buffer containing the serialised bundle object williamr@4: @return KErrNone if successful, otherwise system wide error williamr@4: */ williamr@4: { williamr@4: TPtrC8 buf(aDes); williamr@4: while (buf.Length() > 0) williamr@4: { williamr@4: TRAPD(ret, PARAMSETCONTAINERTYPE::LoadL(*(static_cast(this)), buf)); williamr@4: if (ret != KErrNone) williamr@4: { williamr@4: iSetContainers.ResetAndDestroy(); williamr@4: return ret; williamr@4: } williamr@4: } williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: inline PARAMSETCONTAINERTYPE* GetParamSetContainer(TInt aIndex) williamr@4: { williamr@4: return static_cast(CParameterBundleBase::GetParamSetContainer(aIndex)); williamr@4: } williamr@4: williamr@4: inline const PARAMSETCONTAINERTYPE* GetParamSetContainer(TInt aIndex) const williamr@4: { williamr@4: return static_cast(CParameterBundleBase::GetParamSetContainer(aIndex)); williamr@4: } williamr@4: williamr@4: inline PARAMSETCONTAINERTYPE* FindParamSetContainer(TUint32 aContainerId) williamr@4: { williamr@4: return static_cast(CParameterBundleBase::FindParamSetContainer(aContainerId)); williamr@4: } williamr@4: williamr@4: protected: williamr@4: CParameterBundle() williamr@4: { williamr@4: } williamr@4: }; williamr@4: williamr@4: williamr@4: class CGenericParameterBundle : public CParameterBundle williamr@4: { williamr@4: }; williamr@4: williamr@4: williamr@4: williamr@4: williamr@4: #endif williamr@4: // ES_PARAMETERBUNDLE_H williamr@4: williamr@4: